From 1b4da8f66a4ca5d8052b3cdcc8f2cb97e9b7ffa6 Mon Sep 17 00:00:00 2001 From: Kazuki Suda Date: Thu, 29 Jun 2017 22:12:28 +0900 Subject: [PATCH 01/51] Support completions for --clusterrole of kubectl create clusterrolebinding --- pkg/kubectl/cmd/cmd.go | 5 +++++ pkg/kubectl/cmd/create_clusterrolebinding.go | 1 + 2 files changed, 6 insertions(+) diff --git a/pkg/kubectl/cmd/cmd.go b/pkg/kubectl/cmd/cmd.go index 50f442f4ea1..291e40efc54 100644 --- a/pkg/kubectl/cmd/cmd.go +++ b/pkg/kubectl/cmd/cmd.go @@ -130,6 +130,11 @@ __kubectl_get_resource_node() __kubectl_parse_get "node" } +__kubectl_get_resource_clusterrole() +{ + __kubectl_parse_get "clusterrole" +} + # $1 is the name of the pod we want to get the list of containers inside __kubectl_get_containers() { diff --git a/pkg/kubectl/cmd/create_clusterrolebinding.go b/pkg/kubectl/cmd/create_clusterrolebinding.go index d31614be01f..5b7c2729e22 100644 --- a/pkg/kubectl/cmd/create_clusterrolebinding.go +++ b/pkg/kubectl/cmd/create_clusterrolebinding.go @@ -53,6 +53,7 @@ func NewCmdCreateClusterRoleBinding(f cmdutil.Factory, cmdOut io.Writer) *cobra. cmdutil.AddPrinterFlags(cmd) cmdutil.AddGeneratorFlags(cmd, cmdutil.ClusterRoleBindingV1GeneratorName) cmd.Flags().String("clusterrole", "", i18n.T("ClusterRole this ClusterRoleBinding should reference")) + cmd.MarkFlagCustom("clusterrole", "__kubectl_get_resource_clusterrole") cmd.Flags().StringArray("user", []string{}, "Usernames to bind to the role") cmd.Flags().StringArray("group", []string{}, "Groups to bind to the role") cmd.Flags().StringArray("serviceaccount", []string{}, "Service accounts to bind to the role, in the format :") From 543eaf0f58972fda2915a85ca09b129f6ce7a0ee Mon Sep 17 00:00:00 2001 From: sakeven Date: Mon, 28 Aug 2017 14:05:31 +0800 Subject: [PATCH 02/51] Remove useless code Signed-off-by: sakeven --- pkg/kubectl/cmd/util/helpers.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index 78590ab25c1..a7277ec6477 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -119,11 +119,6 @@ func CheckErr(err error) { checkErr(err, fatalErrHandler) } -// checkErrWithPrefix works like CheckErr, but adds a caller-defined prefix to non-nil errors -func checkErrWithPrefix(prefix string, err error) { - checkErr(err, fatalErrHandler) -} - // checkErr formats a given error as a string and calls the passed handleErr // func with that string and an kubectl exit code. func checkErr(err error, handleErr func(string, int)) { @@ -595,7 +590,7 @@ func ChangeResourcePatch(info *resource.Info, changeCause string) ([]byte, types } } -// containsChangeCause checks if input resource info contains change-cause annotation. +// ContainsChangeCause checks if input resource info contains change-cause annotation. func ContainsChangeCause(info *resource.Info) bool { annotations, err := info.Mapping.MetadataAccessor.Annotations(info.Object) if err != nil { From 44ca021d309973bd1159f5be69db3538472cbc16 Mon Sep 17 00:00:00 2001 From: Zihong Zheng Date: Wed, 23 Aug 2017 13:32:47 -0700 Subject: [PATCH 03/51] Use --oom-score-adj flag for kube-proxy --- cluster/addons/kube-proxy/kube-proxy-ds.yaml | 2 +- cluster/saltbase/salt/kube-proxy/kube-proxy.manifest | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cluster/addons/kube-proxy/kube-proxy-ds.yaml b/cluster/addons/kube-proxy/kube-proxy-ds.yaml index 34a1e42bf61..9da857e5eed 100644 --- a/cluster/addons/kube-proxy/kube-proxy-ds.yaml +++ b/cluster/addons/kube-proxy/kube-proxy-ds.yaml @@ -46,7 +46,7 @@ spec: command: - /bin/sh - -c - - echo -998 > /proc/$$$/oom_score_adj && kube-proxy {{kubeconfig}} {{cluster_cidr}} --resource-container="" {{params}} 1>>/var/log/kube-proxy.log 2>&1 + - kube-proxy {{kubeconfig}} {{cluster_cidr}} --resource-container="" --oom-score-adj=-998 {{params}} 1>>/var/log/kube-proxy.log 2>&1 {{container_env}} {{kube_cache_mutation_detector_env_name}} {{kube_cache_mutation_detector_env_value}} diff --git a/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest b/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest index 37d96c9b6a0..15bb70dffbb 100644 --- a/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest +++ b/cluster/saltbase/salt/kube-proxy/kube-proxy.manifest @@ -78,7 +78,7 @@ spec: command: - /bin/sh - -c - - echo -998 > /proc/$$$/oom_score_adj && kube-proxy {{api_servers_with_port}} {{kubeconfig}} {{cluster_cidr}} --resource-container="" {{params}} 1>>/var/log/kube-proxy.log 2>&1 + - kube-proxy {{api_servers_with_port}} {{kubeconfig}} {{cluster_cidr}} --resource-container="" --oom-score-adj=-998 {{params}} 1>>/var/log/kube-proxy.log 2>&1 {{container_env}} {{kube_cache_mutation_detector_env_name}} {{kube_cache_mutation_detector_env_value}} From 47ddd733d5ca37110d7471d49702ff7e9d6c9671 Mon Sep 17 00:00:00 2001 From: Zihong Zheng Date: Wed, 23 Aug 2017 20:19:24 -0700 Subject: [PATCH 04/51] Remove cgo flag for oom package --- pkg/util/oom/oom_linux.go | 2 +- pkg/util/oom/oom_linux_test.go | 2 +- pkg/util/oom/oom_unsupported.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/util/oom/oom_linux.go b/pkg/util/oom/oom_linux.go index 4d0379fabd1..ad6d5c264b5 100644 --- a/pkg/util/oom/oom_linux.go +++ b/pkg/util/oom/oom_linux.go @@ -1,4 +1,4 @@ -// +build cgo,linux +// +build linux /* Copyright 2015 The Kubernetes Authors. diff --git a/pkg/util/oom/oom_linux_test.go b/pkg/util/oom/oom_linux_test.go index 82a18b66bdc..83f4d685f20 100644 --- a/pkg/util/oom/oom_linux_test.go +++ b/pkg/util/oom/oom_linux_test.go @@ -1,4 +1,4 @@ -// +build cgo,linux +// +build linux /* Copyright 2015 The Kubernetes Authors. diff --git a/pkg/util/oom/oom_unsupported.go b/pkg/util/oom/oom_unsupported.go index 063839d6b26..cb362a85a5f 100644 --- a/pkg/util/oom/oom_unsupported.go +++ b/pkg/util/oom/oom_unsupported.go @@ -1,4 +1,4 @@ -// +build !cgo !linux +// +build !linux /* Copyright 2015 The Kubernetes Authors. From 63ffb1995b292be0a1e9ebde6216b83fc79dd988 Mon Sep 17 00:00:00 2001 From: tcharding Date: Wed, 30 Aug 2017 14:02:12 +1000 Subject: [PATCH 05/51] kubectl: Move utility functions to util package `parseFileSource()` and `parseLiteralSource()` are utility functions. We have a package already for utility functions, `kubectl/util/`. Move utility functions to `kubectl/util`, capitalize function names to export from package. --- pkg/kubectl/BUILD | 1 - pkg/kubectl/configmap.go | 5 +- pkg/kubectl/kubectl.go | 48 ------------------- pkg/kubectl/rolling_updater.go | 1 + pkg/kubectl/secret.go | 5 +- pkg/kubectl/util/BUILD | 7 +++ pkg/kubectl/util/util.go | 45 +++++++++++++++++ .../{kubectl_test.go => util/util_test.go} | 10 ++-- 8 files changed, 63 insertions(+), 59 deletions(-) rename pkg/kubectl/{kubectl_test.go => util/util_test.go} (96%) diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index 828f7cfeda1..6ae81bbb463 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -14,7 +14,6 @@ go_test( "delete_test.go", "env_file_test.go", "generate_test.go", - "kubectl_test.go", "namespace_test.go", "quota_test.go", "resource_filter_test.go", diff --git a/pkg/kubectl/configmap.go b/pkg/kubectl/configmap.go index a8161906c2c..cc73d690adb 100644 --- a/pkg/kubectl/configmap.go +++ b/pkg/kubectl/configmap.go @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util/hash" ) @@ -169,7 +170,7 @@ func (s ConfigMapGeneratorV1) validate() error { // information into the provided configMap. func handleConfigMapFromLiteralSources(configMap *api.ConfigMap, literalSources []string) error { for _, literalSource := range literalSources { - keyName, value, err := parseLiteralSource(literalSource) + keyName, value, err := util.ParseLiteralSource(literalSource) if err != nil { return err } @@ -185,7 +186,7 @@ func handleConfigMapFromLiteralSources(configMap *api.ConfigMap, literalSources // into the provided configMap func handleConfigMapFromFileSources(configMap *api.ConfigMap, fileSources []string) error { for _, fileSource := range fileSources { - keyName, filePath, err := parseFileSource(fileSource) + keyName, filePath, err := util.ParseFileSource(fileSource) if err != nil { return err } diff --git a/pkg/kubectl/kubectl.go b/pkg/kubectl/kubectl.go index 2cf9425eb8e..f13cbc66c4f 100644 --- a/pkg/kubectl/kubectl.go +++ b/pkg/kubectl/kubectl.go @@ -18,18 +18,11 @@ limitations under the License. package kubectl import ( - "errors" - "fmt" - "path" "strings" "k8s.io/apimachinery/pkg/runtime/schema" ) -const ( - kubectlAnnotationPrefix = "kubectl.kubernetes.io/" -) - type NamespaceInfo struct { Namespace string } @@ -188,44 +181,3 @@ func ResourceAliases(rs []string) []string { } return as } - -// parseFileSource parses the source given. Acceptable formats include: -// -// 1. source-path: the basename will become the key name -// 2. source-name=source-path: the source-name will become the key name and source-path is the path to the key file -// -// Key names cannot include '='. -func parseFileSource(source string) (keyName, filePath string, err error) { - numSeparators := strings.Count(source, "=") - switch { - case numSeparators == 0: - return path.Base(source), source, nil - case numSeparators == 1 && strings.HasPrefix(source, "="): - return "", "", fmt.Errorf("key name for file path %v missing.", strings.TrimPrefix(source, "=")) - case numSeparators == 1 && strings.HasSuffix(source, "="): - return "", "", fmt.Errorf("file path for key name %v missing.", strings.TrimSuffix(source, "=")) - case numSeparators > 1: - return "", "", errors.New("Key names or file paths cannot contain '='.") - default: - components := strings.Split(source, "=") - return components[0], components[1], nil - } -} - -// parseLiteralSource parses the source key=val pair into its component pieces. -// This functionality is distinguished from strings.SplitN(source, "=", 2) since -// it returns an error in the case of empty keys, values, or a missing equals -// sign. -func parseLiteralSource(source string) (keyName, value string, err error) { - // leading equal is invalid - if strings.Index(source, "=") == 0 { - return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) - } - // split after the first equal (so values can have the = character) - items := strings.SplitN(source, "=", 2) - if len(items) != 2 { - return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) - } - - return items[0], items[1], nil -} diff --git a/pkg/kubectl/rolling_updater.go b/pkg/kubectl/rolling_updater.go index 3259d6dd976..395213d6405 100644 --- a/pkg/kubectl/rolling_updater.go +++ b/pkg/kubectl/rolling_updater.go @@ -42,6 +42,7 @@ import ( ) const ( + kubectlAnnotationPrefix = "kubectl.kubernetes.io/" sourceIdAnnotation = kubectlAnnotationPrefix + "update-source-id" desiredReplicasAnnotation = kubectlAnnotationPrefix + "desired-replicas" originalReplicasAnnotation = kubectlAnnotationPrefix + "original-replicas" diff --git a/pkg/kubectl/secret.go b/pkg/kubectl/secret.go index 856d1d86f94..6ad8e7a2593 100644 --- a/pkg/kubectl/secret.go +++ b/pkg/kubectl/secret.go @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util/hash" ) @@ -173,7 +174,7 @@ func (s SecretGeneratorV1) validate() error { // handleFromLiteralSources adds the specified literal source information into the provided secret func handleFromLiteralSources(secret *api.Secret, literalSources []string) error { for _, literalSource := range literalSources { - keyName, value, err := parseLiteralSource(literalSource) + keyName, value, err := util.ParseLiteralSource(literalSource) if err != nil { return err } @@ -187,7 +188,7 @@ func handleFromLiteralSources(secret *api.Secret, literalSources []string) error // handleFromFileSources adds the specified file source information into the provided secret func handleFromFileSources(secret *api.Secret, fileSources []string) error { for _, fileSource := range fileSources { - keyName, filePath, err := parseFileSource(fileSource) + keyName, filePath, err := util.ParseFileSource(fileSource) if err != nil { return err } diff --git a/pkg/kubectl/util/BUILD b/pkg/kubectl/util/BUILD index 17fdddedf14..0751d7c268b 100644 --- a/pkg/kubectl/util/BUILD +++ b/pkg/kubectl/util/BUILD @@ -1,6 +1,7 @@ load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( @@ -43,3 +44,9 @@ filegroup( tags = ["automanaged"], visibility = ["//build/visible_to:pkg_kubectl_util_CONSUMERS"], ) + +go_test( + name = "go_default_test", + srcs = ["util_test.go"], + library = ":go_default_library", +) diff --git a/pkg/kubectl/util/util.go b/pkg/kubectl/util/util.go index 7b6eeff81fe..fd1bf136468 100644 --- a/pkg/kubectl/util/util.go +++ b/pkg/kubectl/util/util.go @@ -18,7 +18,10 @@ package util import ( "crypto/md5" + "errors" "fmt" + "path" + "strings" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -44,3 +47,45 @@ func HashObject(obj runtime.Object, codec runtime.Codec) (string, error) { } return fmt.Sprintf("%x", md5.Sum(data)), nil } + +// ParseFileSource parses the source given. +// +// Acceptable formats include: +// 1. source-path: the basename will become the key name +// 2. source-name=source-path: the source-name will become the key name and +// source-path is the path to the key file. +// +// Key names cannot include '='. +func ParseFileSource(source string) (keyName, filePath string, err error) { + numSeparators := strings.Count(source, "=") + switch { + case numSeparators == 0: + return path.Base(source), source, nil + case numSeparators == 1 && strings.HasPrefix(source, "="): + return "", "", fmt.Errorf("key name for file path %v missing.", strings.TrimPrefix(source, "=")) + case numSeparators == 1 && strings.HasSuffix(source, "="): + return "", "", fmt.Errorf("file path for key name %v missing.", strings.TrimSuffix(source, "=")) + case numSeparators > 1: + return "", "", errors.New("Key names or file paths cannot contain '='.") + default: + components := strings.Split(source, "=") + return components[0], components[1], nil + } +} + +// ParseLiteralSource parses the source key=val pair into its component pieces. +// This functionality is distinguished from strings.SplitN(source, "=", 2) since +// it returns an error in the case of empty keys, values, or a missing equals sign. +func ParseLiteralSource(source string) (keyName, value string, err error) { + // leading equal is invalid + if strings.Index(source, "=") == 0 { + return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) + } + // split after the first equal (so values can have the = character) + items := strings.SplitN(source, "=", 2) + if len(items) != 2 { + return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) + } + + return items[0], items[1], nil +} diff --git a/pkg/kubectl/kubectl_test.go b/pkg/kubectl/util/util_test.go similarity index 96% rename from pkg/kubectl/kubectl_test.go rename to pkg/kubectl/util/util_test.go index 87f846307dd..d1fefed38f5 100644 --- a/pkg/kubectl/kubectl_test.go +++ b/pkg/kubectl/util/util_test.go @@ -14,11 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubectl +package util -import ( - "testing" -) +import "testing" func TestParseFileSource(t *testing.T) { cases := []struct { @@ -91,7 +89,7 @@ func TestParseFileSource(t *testing.T) { } for _, tc := range cases { - key, filepath, err := parseFileSource(tc.input) + key, filepath, err := ParseFileSource(tc.input) if err != nil { if tc.err { continue @@ -173,7 +171,7 @@ func TestParseLiteralSource(t *testing.T) { } for _, tc := range cases { - key, value, err := parseLiteralSource(tc.input) + key, value, err := ParseLiteralSource(tc.input) if err != nil { if tc.err { continue From 2b8891a59f61f3d15e20b78cb130d384c97283cc Mon Sep 17 00:00:00 2001 From: zhengchuan hu Date: Fri, 1 Sep 2017 08:25:18 +0800 Subject: [PATCH 06/51] rename the name of eventsource in controller-manager --- pkg/controller/daemon/daemon_controller.go | 2 +- pkg/controller/node/node_controller.go | 2 +- pkg/controller/node/scheduler/taint_controller.go | 2 +- pkg/controller/route/route_controller.go | 2 +- pkg/controller/statefulset/stateful_set.go | 2 +- pkg/controller/volume/attachdetach/attach_detach_controller.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/controller/daemon/daemon_controller.go b/pkg/controller/daemon/daemon_controller.go index d933eea01a0..8b4d1742bff 100644 --- a/pkg/controller/daemon/daemon_controller.go +++ b/pkg/controller/daemon/daemon_controller.go @@ -143,7 +143,7 @@ func NewDaemonSetsController(daemonSetInformer extensionsinformers.DaemonSetInfo eventRecorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "daemonset-controller"}), podControl: controller.RealPodControl{ KubeClient: kubeClient, - Recorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "daemon-set"}), + Recorder: eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "daemonset-controller"}), }, crControl: controller.RealControllerRevisionControl{ KubeClient: kubeClient, diff --git a/pkg/controller/node/node_controller.go b/pkg/controller/node/node_controller.go index fa1a5246394..7c4065f3a54 100644 --- a/pkg/controller/node/node_controller.go +++ b/pkg/controller/node/node_controller.go @@ -208,7 +208,7 @@ func NewNodeController( runTaintManager bool, useTaintBasedEvictions bool) (*NodeController, error) { eventBroadcaster := record.NewBroadcaster() - recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "controllermanager"}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "node-controller"}) eventBroadcaster.StartLogging(glog.Infof) if kubeClient != nil { glog.V(0).Infof("Sending events to api server.") diff --git a/pkg/controller/node/scheduler/taint_controller.go b/pkg/controller/node/scheduler/taint_controller.go index 9892defc5fe..bab01348968 100644 --- a/pkg/controller/node/scheduler/taint_controller.go +++ b/pkg/controller/node/scheduler/taint_controller.go @@ -152,7 +152,7 @@ func getMinTolerationTime(tolerations []v1.Toleration) time.Duration { // communicate with the API server. func NewNoExecuteTaintManager(c clientset.Interface) *NoExecuteTaintManager { eventBroadcaster := record.NewBroadcaster() - recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "controllermanager"}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "taint-controller"}) eventBroadcaster.StartLogging(glog.Infof) if c != nil { glog.V(0).Infof("Sending events to api server.") diff --git a/pkg/controller/route/route_controller.go b/pkg/controller/route/route_controller.go index 9ed2bc45f43..bb6995d775e 100644 --- a/pkg/controller/route/route_controller.go +++ b/pkg/controller/route/route_controller.go @@ -75,7 +75,7 @@ func New(routes cloudprovider.Routes, kubeClient clientset.Interface, nodeInform } eventBroadcaster := record.NewBroadcaster() - recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "route_controller"}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "route-controller"}) rc := &RouteController{ routes: routes, diff --git a/pkg/controller/statefulset/stateful_set.go b/pkg/controller/statefulset/stateful_set.go index 2cde7ab3fe4..582b15b6dd9 100644 --- a/pkg/controller/statefulset/stateful_set.go +++ b/pkg/controller/statefulset/stateful_set.go @@ -86,7 +86,7 @@ func NewStatefulSetController( eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartLogging(glog.Infof) eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.Core().RESTClient()).Events("")}) - recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "statefulset"}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "statefulset-controller"}) ssc := &StatefulSetController{ kubeClient: kubeClient, diff --git a/pkg/controller/volume/attachdetach/attach_detach_controller.go b/pkg/controller/volume/attachdetach/attach_detach_controller.go index a608fbf94d7..43cc4776c07 100644 --- a/pkg/controller/volume/attachdetach/attach_detach_controller.go +++ b/pkg/controller/volume/attachdetach/attach_detach_controller.go @@ -135,7 +135,7 @@ func NewAttachDetachController( eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartLogging(glog.Infof) eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.Core().RESTClient()).Events("")}) - recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "attachdetach"}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "attachdetach-controller"}) adc.desiredStateOfWorld = cache.NewDesiredStateOfWorld(&adc.volumePluginMgr) adc.actualStateOfWorld = cache.NewActualStateOfWorld(&adc.volumePluginMgr) From 502d14afd42e407b85729e18e1e3cd988771cb25 Mon Sep 17 00:00:00 2001 From: Dane LeBlanc Date: Wed, 6 Sep 2017 10:30:32 -0400 Subject: [PATCH 07/51] Add required family flag for conntrack IPv6 operation This change causes kube-proxy to supply the required "-f ipv6" family flag whenever the conntrack utility is executed and the associated service is using IPv6. This change is required for IPv6-only operation. Note that unit test coverage for the 2-line changes in pkg/proxy/iptables/proxier.go and /pkg/proxy/ipvs/proxier.go will need to be added after support for IPv6 service addresses is added to these files. For pkg/proxy/iptables/proxier.go, this coverage will be added either with PR #48551. fixes #52027 --- pkg/proxy/iptables/proxier.go | 3 +- pkg/proxy/ipvs/proxier.go | 3 +- pkg/proxy/util/conntrack.go | 26 +++++-- pkg/proxy/util/conntrack_test.go | 122 ++++++++++++++++++------------- 4 files changed, 96 insertions(+), 58 deletions(-) diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 6d3bcc3606f..565cbed33d7 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -1342,7 +1342,8 @@ func (proxier *Proxier) syncProxyRules() { // This is very low impact. The NodePort range is intentionally obscure, and unlikely to actually collide with real Services. // This only affects UDP connections, which are not common. // See issue: https://github.com/kubernetes/kubernetes/issues/49881 - err := utilproxy.ClearUDPConntrackForPort(proxier.exec, lp.Port) + isIPv6 := svcInfo.clusterIP.To4() != nil + err := utilproxy.ClearUDPConntrackForPort(proxier.exec, lp.Port, isIPv6) if err != nil { glog.Errorf("Failed to clear udp conntrack for port %d, error: %v", lp.Port, err) } diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index 6c4ad357240..39416a1c3e2 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -1126,7 +1126,8 @@ func (proxier *Proxier) syncProxyRules(reason syncReason) { continue } if lp.Protocol == "udp" { - utilproxy.ClearUDPConntrackForPort(proxier.exec, lp.Port) + isIPv6 := svcInfo.clusterIP.To4() != nil + utilproxy.ClearUDPConntrackForPort(proxier.exec, lp.Port, isIPv6) } replacementPortsMap[lp] = socket } // We're holding the port, so it's OK to install ipvs rules. diff --git a/pkg/proxy/util/conntrack.go b/pkg/proxy/util/conntrack.go index 6d7e4703ec0..504085a5ae2 100644 --- a/pkg/proxy/util/conntrack.go +++ b/pkg/proxy/util/conntrack.go @@ -18,6 +18,7 @@ package util import ( "fmt" + "net" "strconv" "strings" @@ -28,10 +29,23 @@ import ( const noConnectionToDelete = "0 flow entries have been deleted" -// DeleteServiceConnections uses the conntrack tool to delete the conntrack entries +func isIPv6(ip string) bool { + netIP := net.ParseIP(ip) + return netIP != nil && netIP.To4() == nil +} + +func parametersWithFamily(isIPv6 bool, parameters ...string) []string { + if isIPv6 { + parameters = append(parameters, "-f", "ipv6") + } + return parameters +} + +// ClearUDPConntrackForIP uses the conntrack tool to delete the conntrack entries // for the UDP connections specified by the given service IP func ClearUDPConntrackForIP(execer exec.Interface, ip string) error { - err := ExecConntrackTool(execer, "-D", "--orig-dst", ip, "-p", "udp") + parameters := parametersWithFamily(isIPv6(ip), "-D", "--orig-dst", ip, "-p", "udp") + err := ExecConntrackTool(execer, parameters...) if err != nil && !strings.Contains(err.Error(), noConnectionToDelete) { // TODO: Better handling for deletion failure. When failure occur, stale udp connection may not get flushed. // These stale udp connection will keep black hole traffic. Making this a best effort operation for now, since it @@ -60,11 +74,12 @@ func ExecConntrackTool(execer exec.Interface, parameters ...string) error { // The solution is clearing the conntrack. Known issues: // https://github.com/docker/docker/issues/8795 // https://github.com/kubernetes/kubernetes/issues/31983 -func ClearUDPConntrackForPort(execer exec.Interface, port int) error { +func ClearUDPConntrackForPort(execer exec.Interface, port int, isIPv6 bool) error { if port <= 0 { return fmt.Errorf("Wrong port number. The port number must be greater than zero") } - err := ExecConntrackTool(execer, "-D", "-p", "udp", "--dport", strconv.Itoa(port)) + parameters := parametersWithFamily(isIPv6, "-D", "-p", "udp", "--dport", strconv.Itoa(port)) + err := ExecConntrackTool(execer, parameters...) if err != nil && !strings.Contains(err.Error(), noConnectionToDelete) { return fmt.Errorf("error deleting conntrack entries for UDP port: %d, error: %v", port, err) } @@ -74,7 +89,8 @@ func ClearUDPConntrackForPort(execer exec.Interface, port int) error { // ClearUDPConntrackForPeers uses the conntrack tool to delete the conntrack entries // for the UDP connections specified by the {origin, dest} IP pair. func ClearUDPConntrackForPeers(execer exec.Interface, origin, dest string) error { - err := ExecConntrackTool(execer, "-D", "--orig-dst", origin, "--dst-nat", dest, "-p", "udp") + parameters := parametersWithFamily(isIPv6(origin), "-D", "--orig-dst", origin, "--dst-nat", dest, "-p", "udp") + err := ExecConntrackTool(execer, parameters...) if err != nil && !strings.Contains(err.Error(), noConnectionToDelete) { // TODO: Better handling for deletion failure. When failure occur, stale udp connection may not get flushed. // These stale udp connection will keep black hole traffic. Making this a best effort operation for now, since it diff --git a/pkg/proxy/util/conntrack_test.go b/pkg/proxy/util/conntrack_test.go index 6bd3ecedd6f..6c0db300029 100644 --- a/pkg/proxy/util/conntrack_test.go +++ b/pkg/proxy/util/conntrack_test.go @@ -18,7 +18,6 @@ package util import ( "fmt" - "strconv" "strings" "testing" @@ -26,13 +25,20 @@ import ( fakeexec "k8s.io/utils/exec/testing" ) +func familyParamStr(isIPv6 bool) string { + if isIPv6 { + return " -f ipv6" + } + return "" +} + func TestExecConntrackTool(t *testing.T) { fcmd := fakeexec.FakeCmd{ CombinedOutputScript: []fakeexec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { - return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted.") + return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted") }, }, } @@ -81,8 +87,9 @@ func TestClearUDPConntrackForIP(t *testing.T) { func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { - return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted.") + return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted") }, + func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, }, } fexec := fakeexec.FakeExec{ @@ -90,36 +97,35 @@ func TestClearUDPConntrackForIP(t *testing.T) { func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, + func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(cmd string) (string, error) { return cmd, nil }, } - testCases := [][]string{ - { - "10.240.0.3", - "10.240.0.5", - }, - { - "10.240.0.4", - }, + testCases := []struct { + name string + ip string + }{ + {"IPv4 success", "10.240.0.3"}, + {"IPv4 success", "10.240.0.5"}, + {"IPv4 simulated error", "10.240.0.4"}, + {"IPv6 success", "2001:db8::10"}, } svcCount := 0 - for i := range testCases { - for _, ip := range testCases[i] { - if err := ClearUDPConntrackForIP(&fexec, ip); err != nil { - t.Errorf("Unexepected error: %v", err) - } - expectCommand := fmt.Sprintf("conntrack -D --orig-dst %s -p udp", ip) - execCommand := strings.Join(fcmd.CombinedOutputLog[svcCount], " ") - if expectCommand != execCommand { - t.Errorf("Exepect comand: %s, but executed %s", expectCommand, execCommand) - } - svcCount += 1 + for _, tc := range testCases { + if err := ClearUDPConntrackForIP(&fexec, tc.ip); err != nil { + t.Errorf("%s test case:, Unexpected error: %v", tc.name, err) } - if svcCount != fexec.CommandCalls { - t.Errorf("Exepect comand executed %d times, but got %d", svcCount, fexec.CommandCalls) + expectCommand := fmt.Sprintf("conntrack -D --orig-dst %s -p udp", tc.ip) + familyParamStr(isIPv6(tc.ip)) + execCommand := strings.Join(fcmd.CombinedOutputLog[svcCount], " ") + if expectCommand != execCommand { + t.Errorf("%s test case: Expect command: %s, but executed %s", tc.name, expectCommand, execCommand) } + svcCount++ + } + if svcCount != fexec.CommandCalls { + t.Errorf("Expect command executed %d times, but got %d", svcCount, fexec.CommandCalls) } } @@ -128,39 +134,44 @@ func TestClearUDPConntrackForPort(t *testing.T) { CombinedOutputScript: []fakeexec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { - return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted.") + return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted") }, + func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, }, } fexec := fakeexec.FakeExec{ CommandScript: []fakeexec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, + func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(cmd string) (string, error) { return cmd, nil }, } - testCases := []string{ - "8080", - "9090", + testCases := []struct { + name string + port int + isIPv6 bool + }{ + {"IPv4, no error", 8080, false}, + {"IPv4, simulated error", 9090, false}, + {"IPv6, no error", 6666, true}, } svcCount := 0 - for i := range testCases { - portNum, _ := strconv.Atoi(testCases[i]) - err := ClearUDPConntrackForPort(&fexec, portNum) + for _, tc := range testCases { + err := ClearUDPConntrackForPort(&fexec, tc.port, tc.isIPv6) if err != nil { - t.Errorf("Unexpected error: %v", err) + t.Errorf("%s test case: Unexpected error: %v", tc.name, err) } - expectCommand := fmt.Sprintf("conntrack -D -p udp --dport %s", testCases[i]) + expectCommand := fmt.Sprintf("conntrack -D -p udp --dport %d", tc.port) + familyParamStr(tc.isIPv6) execCommand := strings.Join(fcmd.CombinedOutputLog[svcCount], " ") if expectCommand != execCommand { - t.Errorf("Exepect comand: %s, but executed %s", expectCommand, execCommand) - } - svcCount += 1 - - if svcCount != fexec.CommandCalls { - t.Errorf("Exepect comand executed %d times, but got %d", svcCount, fexec.CommandCalls) + t.Errorf("%s test case: Expect command: %s, but executed %s", tc.name, expectCommand, execCommand) } + svcCount++ + } + if svcCount != fexec.CommandCalls { + t.Errorf("Expect command executed %d times, but got %d", svcCount, fexec.CommandCalls) } } @@ -169,46 +180,55 @@ func TestDeleteUDPConnections(t *testing.T) { CombinedOutputScript: []fakeexec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { - return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted.") + return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted") }, + func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, }, } fexec := fakeexec.FakeExec{ CommandScript: []fakeexec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, + func(cmd string, args ...string) exec.Cmd { return fakeexec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(cmd string) (string, error) { return cmd, nil }, } testCases := []struct { + name string origin string dest string }{ { + name: "IPv4 success", origin: "1.2.3.4", dest: "10.20.30.40", }, { + name: "IPv4 simulated failure", origin: "2.3.4.5", dest: "20.30.40.50", }, + { + name: "IPv6 success", + origin: "fd00::600d:f00d", + dest: "2001:db8::5", + }, } svcCount := 0 - for i := range testCases { - err := ClearUDPConntrackForPeers(&fexec, testCases[i].origin, testCases[i].dest) + for i, tc := range testCases { + err := ClearUDPConntrackForPeers(&fexec, tc.origin, tc.dest) if err != nil { - t.Errorf("unexpected error: %v", err) + t.Errorf("%s test case: unexpected error: %v", tc.name, err) } - expectCommand := fmt.Sprintf("conntrack -D --orig-dst %s --dst-nat %s -p udp", testCases[i].origin, testCases[i].dest) - execCommand := strings.Join(fcmd.CombinedOutputLog[svcCount], " ") + expectCommand := fmt.Sprintf("conntrack -D --orig-dst %s --dst-nat %s -p udp", tc.origin, tc.dest) + familyParamStr(isIPv6(tc.origin)) + execCommand := strings.Join(fcmd.CombinedOutputLog[i], " ") if expectCommand != execCommand { - t.Errorf("Exepect comand: %s, but executed %s", expectCommand, execCommand) - } - svcCount += 1 - - if svcCount != fexec.CommandCalls { - t.Errorf("Exepect comand executed %d times, but got %d", svcCount, fexec.CommandCalls) + t.Errorf("%s test case: Expect command: %s, but executed %s", tc.name, expectCommand, execCommand) } + svcCount++ + } + if svcCount != fexec.CommandCalls { + t.Errorf("Expect command executed %d times, but got %d", svcCount, fexec.CommandCalls) } } From 221db2bd6bb859c1fbf37e0e20d8568aaa779432 Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Thu, 24 Aug 2017 19:59:00 +0800 Subject: [PATCH 08/51] Refactor node taint conditions --- pkg/api/validation/validation_test.go | 4 ++-- plugin/pkg/scheduler/algorithm/well_known_labels.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 70168696b8f..d269d679771 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -5004,7 +5004,7 @@ func TestValidatePod(t *testing.T) { Name: "pod-forgiveness-invalid", Namespace: "ns", }, - Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.alpha.kubernetes.io/notReady", Operator: "Exists", Effect: "NoExecute", TolerationSeconds: &[]int64{-2}[0]}}), + Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.kubernetes.io/not-ready", Operator: "Exists", Effect: "NoExecute", TolerationSeconds: &[]int64{-2}[0]}}), }, { // docker default seccomp profile ObjectMeta: metav1.ObjectMeta{ @@ -5562,7 +5562,7 @@ func TestValidatePod(t *testing.T) { Name: "pod-forgiveness-invalid", Namespace: "ns", }, - Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.alpha.kubernetes.io/notReady", Operator: "Exists", Effect: "NoSchedule", TolerationSeconds: &[]int64{20}[0]}}), + Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.kubernetes.io/not-ready", Operator: "Exists", Effect: "NoSchedule", TolerationSeconds: &[]int64{20}[0]}}), }, }, "must be a valid pod seccomp profile": { diff --git a/plugin/pkg/scheduler/algorithm/well_known_labels.go b/plugin/pkg/scheduler/algorithm/well_known_labels.go index 209d7279743..47215d8ad64 100644 --- a/plugin/pkg/scheduler/algorithm/well_known_labels.go +++ b/plugin/pkg/scheduler/algorithm/well_known_labels.go @@ -20,7 +20,7 @@ const ( // When feature-gate for TaintBasedEvictions=true flag is enabled, // TaintNodeNotReady would be automatically added by node controller // when node is not ready, and removed when node becomes ready. - TaintNodeNotReady = "node.alpha.kubernetes.io/notReady" + TaintNodeNotReady = "node.kubernetes.io/not-ready" // When feature-gate for TaintBasedEvictions=true flag is enabled, // TaintNodeUnreachable would be automatically added by node controller From 2afab02349e0d29e37a282d995eca14809ac2bb8 Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Fri, 15 Sep 2017 15:46:26 +0800 Subject: [PATCH 09/51] Use NC to fix deprecated taint key name --- pkg/controller/node/node_controller.go | 43 +++++++ pkg/controller/node/nodecontroller_test.go | 106 ++++++++++++++++++ .../scheduler/algorithm/well_known_labels.go | 4 + 3 files changed, 153 insertions(+) diff --git a/pkg/controller/node/node_controller.go b/pkg/controller/node/node_controller.go index 4b48ea26ed1..eb30f6c6beb 100644 --- a/pkg/controller/node/node_controller.go +++ b/pkg/controller/node/node_controller.go @@ -404,6 +404,17 @@ func NewNodeController( }) } + // NOTE(resouer): nodeInformer to substitute deprecated taint key (notReady -> not-ready). + // Remove this logic when we don't need this backwards compatibility + nodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: util.CreateAddNodeHandler(func(node *v1.Node) error { + return nc.doFixDeprecatedTaintKeyPass(node) + }), + UpdateFunc: util.CreateUpdateNodeHandler(func(_, newNode *v1.Node) error { + return nc.doFixDeprecatedTaintKeyPass(newNode) + }), + }) + nc.nodeLister = nodeInformer.Lister() nc.nodeInformerSynced = nodeInformer.Informer().HasSynced @@ -442,6 +453,38 @@ func (nc *Controller) doEvictionPass() { } } +// doFixDeprecatedTaintKeyPass checks and replaces deprecated taint key with proper key name if needed. +func (nc *Controller) doFixDeprecatedTaintKeyPass(node *v1.Node) error { + taintsToAdd := []*v1.Taint{} + taintsToDel := []*v1.Taint{} + + for _, taint := range node.Spec.Taints { + if taint.Key == algorithm.DeprecatedTaintNodeNotReady { + // delete old taint + tDel := taint + taintsToDel = append(taintsToDel, &tDel) + + // add right taint + tAdd := taint + tAdd.Key = algorithm.TaintNodeNotReady + taintsToAdd = append(taintsToAdd, &tAdd) + + glog.Warningf("Detected deprecated taint key: %v on node: %v, will substitute it with %v", + algorithm.DeprecatedTaintNodeNotReady, node.GetName(), algorithm.TaintNodeNotReady) + + break + } + } + + if len(taintsToAdd) == 0 && len(taintsToDel) == 0 { + return nil + } + if !util.SwapNodeControllerTaint(nc.kubeClient, taintsToAdd, taintsToDel, node) { + return fmt.Errorf("failed to swap taints of node %+v", node) + } + return nil +} + func (nc *Controller) doNoScheduleTaintingPass(node *v1.Node) error { // Map node's condition to Taints. taints := []v1.Taint{} diff --git a/pkg/controller/node/nodecontroller_test.go b/pkg/controller/node/nodecontroller_test.go index cb5b1360211..e3ab29f9fab 100644 --- a/pkg/controller/node/nodecontroller_test.go +++ b/pkg/controller/node/nodecontroller_test.go @@ -2445,3 +2445,109 @@ func TestCheckNodeKubeletVersionParsing(t *testing.T) { } } } + +func TestFixDeprecatedTaintKey(t *testing.T) { + fakeNow := metav1.Date(2017, 1, 1, 12, 0, 0, 0, time.UTC) + evictionTimeout := 10 * time.Minute + + fakeNodeHandler := &testutil.FakeNodeHandler{ + Existing: []*v1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), + Labels: map[string]string{ + kubeletapis.LabelZoneRegion: "region1", + kubeletapis.LabelZoneFailureDomain: "zone1", + }, + }, + }, + }, + Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}), + } + + nodeController, _ := newNodeControllerFromClient(nil, fakeNodeHandler, evictionTimeout, + testRateLimiterQPS, testRateLimiterQPS, testLargeClusterThreshold, testUnhealthyThreshold, testNodeMonitorGracePeriod, + testNodeStartupGracePeriod, testNodeMonitorPeriod, nil, nil, 0, false, true) + nodeController.now = func() metav1.Time { return fakeNow } + nodeController.recorder = testutil.NewFakeRecorder() + + deprecatedTaint := &v1.Taint{ + Key: algorithm.DeprecatedTaintNodeNotReady, + Effect: v1.TaintEffectNoExecute, + } + nodeNotReadyTaint := &v1.Taint{ + Key: algorithm.TaintNodeNotReady, + Effect: v1.TaintEffectNoExecute, + } + + tests := []struct { + Name string + Node *v1.Node + ExpectedTaints []*v1.Taint + }{ + { + Name: "Node with deprecated taint key", + Node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), + Labels: map[string]string{ + kubeletapis.LabelZoneRegion: "region1", + kubeletapis.LabelZoneFailureDomain: "zone1", + }, + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + *deprecatedTaint, + }, + }, + }, + ExpectedTaints: []*v1.Taint{nodeNotReadyTaint}, + }, + { + Name: "Node with not-ready taint key", + Node: &v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node0", + CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC), + Labels: map[string]string{ + kubeletapis.LabelZoneRegion: "region1", + kubeletapis.LabelZoneFailureDomain: "zone1", + }, + }, + Spec: v1.NodeSpec{ + Taints: []v1.Taint{ + *nodeNotReadyTaint, + }, + }, + }, + ExpectedTaints: []*v1.Taint{nodeNotReadyTaint}, + }, + } + + for _, test := range tests { + fakeNodeHandler.Update(test.Node) + if err := syncNodeStore(nodeController, fakeNodeHandler); err != nil { + t.Errorf("unexpected error: %v", err) + } + nodeController.doFixDeprecatedTaintKeyPass(test.Node) + if err := syncNodeStore(nodeController, fakeNodeHandler); err != nil { + t.Errorf("unexpected error: %v", err) + } + node0, err := nodeController.nodeLister.Get("node0") + if err != nil { + t.Errorf("Can't get current node0...") + return + } + if len(node0.Spec.Taints) != len(test.ExpectedTaints) { + t.Errorf("%s: Unexpected number of taints: expected %d, got %d", + test.Name, len(test.ExpectedTaints), len(node0.Spec.Taints)) + } + for _, taint := range test.ExpectedTaints { + if !taintutils.TaintExists(node0.Spec.Taints, taint) { + t.Errorf("%s: Can't find taint %v in %v", test.Name, taint, node0.Spec.Taints) + } + } + } +} diff --git a/plugin/pkg/scheduler/algorithm/well_known_labels.go b/plugin/pkg/scheduler/algorithm/well_known_labels.go index 47215d8ad64..39e7cfc1d3c 100644 --- a/plugin/pkg/scheduler/algorithm/well_known_labels.go +++ b/plugin/pkg/scheduler/algorithm/well_known_labels.go @@ -22,6 +22,10 @@ const ( // when node is not ready, and removed when node becomes ready. TaintNodeNotReady = "node.kubernetes.io/not-ready" + // DeprecatedTaintNodeNotReady is the deprecated version of TaintNodeNotReady. + // It is deprecated since 1.9 + DeprecatedTaintNodeNotReady = "node.alpha.kubernetes.io/notReady" + // When feature-gate for TaintBasedEvictions=true flag is enabled, // TaintNodeUnreachable would be automatically added by node controller // when node becomes unreachable (corresponding to NodeReady status ConditionUnknown) From 713153261976f20337195eeb9d56cbcd8ba907bf Mon Sep 17 00:00:00 2001 From: wackxu Date: Wed, 20 Sep 2017 19:03:45 +0800 Subject: [PATCH 10/51] add UT for podPreset storage --- pkg/registry/settings/podpreset/storage/BUILD | 18 ++ .../podpreset/storage/storage_test.go | 180 ++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 pkg/registry/settings/podpreset/storage/storage_test.go diff --git a/pkg/registry/settings/podpreset/storage/BUILD b/pkg/registry/settings/podpreset/storage/BUILD index 615cd3fd882..0cdc03f99bc 100644 --- a/pkg/registry/settings/podpreset/storage/BUILD +++ b/pkg/registry/settings/podpreset/storage/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( @@ -30,3 +31,20 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["storage_test.go"], + library = ":go_default_library", + deps = [ + "//pkg/api:go_default_library", + "//pkg/apis/settings:go_default_library", + "//pkg/registry/registrytest:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", + "//vendor/k8s.io/apiserver/pkg/storage/etcd/testing:go_default_library", + ], +) diff --git a/pkg/registry/settings/podpreset/storage/storage_test.go b/pkg/registry/settings/podpreset/storage/storage_test.go new file mode 100644 index 00000000000..e1b81eff893 --- /dev/null +++ b/pkg/registry/settings/podpreset/storage/storage_test.go @@ -0,0 +1,180 @@ +/* +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 storage + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/registry/generic" + etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing" + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/apis/settings" + "k8s.io/kubernetes/pkg/registry/registrytest" +) + +func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { + etcdStorage, server := registrytest.NewEtcdStorage(t, settings.GroupName) + restOptions := generic.RESTOptions{ + StorageConfig: etcdStorage, + Decorator: generic.UndecoratedStorage, + DeleteCollectionWorkers: 1, + ResourcePrefix: "podpresets", + } + return NewREST(restOptions), server +} + +func validNewPodPreset(namespace string) *settings.PodPreset { + return &settings.PodPreset{ + ObjectMeta: metav1.ObjectMeta{ + Name: "podPreset", + Namespace: namespace, + Labels: map[string]string{"a": "b"}, + }, + Spec: settings.PodPresetSpec{ + Selector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "role": "frontend", + }, + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "security", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"S2"}, + }, + }, + }, + Env: []api.EnvVar{ + { + Name: "DB_PORT", + Value: "6379", + }, + }, + EnvFrom: []api.EnvFromSource{ + { + ConfigMapRef: &api.ConfigMapEnvSource{ + LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + }, + }, + { + Prefix: "pre_", + ConfigMapRef: &api.ConfigMapEnvSource{ + LocalObjectReference: api.LocalObjectReference{Name: "abc"}, + }, + }, + }, + VolumeMounts: []api.VolumeMount{ + { + MountPath: "/cache", + Name: "cache-volume", + }, + }, + Volumes: []api.Volume{ + { + Name: "cache-volume", + VolumeSource: api.VolumeSource{ + EmptyDir: &api.EmptyDirVolumeSource{}, + }, + }, + }, + }, + } +} + +func TestCreate(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := registrytest.New(t, storage.Store) + invalidPodPreset := validNewPodPreset(test.TestNamespace()) + invalidPodPreset.Spec.VolumeMounts[0].Name = "/cache/VolumeMounts" + test.TestCreate( + validNewPodPreset(test.TestNamespace()), + // invalid cases + invalidPodPreset, + ) +} + +func TestUpdate(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := registrytest.New(t, storage.Store) + test.TestUpdate( + // valid + validNewPodPreset(test.TestNamespace()), + // invalid updates + func(obj runtime.Object) runtime.Object { + pp := obj.(*settings.PodPreset) + pp.Labels = map[string]string{"c": "d"} + return pp + }, + ) +} + +func TestDelete(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := registrytest.New(t, storage.Store) + test.TestDelete(validNewPodPreset(test.TestNamespace())) +} + +func TestGet(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := registrytest.New(t, storage.Store) + test.TestGet(validNewPodPreset(test.TestNamespace())) +} + +func TestList(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := registrytest.New(t, storage.Store) + test.TestList(validNewPodPreset(test.TestNamespace())) +} + +func TestWatch(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.Store.DestroyFunc() + test := registrytest.New(t, storage.Store) + test.TestWatch( + validNewPodPreset(test.TestNamespace()), + // matching labels + []labels.Set{}, + // not matching labels + // not matching labels + []labels.Set{ + {"foo": "bar"}, + }, + + // matching fields + []fields.Set{ + {"metadata.name": "podPreset"}, + }, + // not matching fields + []fields.Set{ + {"metadata.name": "bar"}, + }, + ) +} From 54a0678b4c64fe76c698d13d47cf580e5c04c44f Mon Sep 17 00:00:00 2001 From: jianglingxia Date: Fri, 22 Sep 2017 15:09:42 +0800 Subject: [PATCH 11/51] the feature of Flex volume API and Improved lifecycle hasnot merge v1.6 --- CHANGELOG-1.6.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG-1.6.md b/CHANGELOG-1.6.md index 31b56832c71..e7fd28406ef 100644 --- a/CHANGELOG-1.6.md +++ b/CHANGELOG-1.6.md @@ -1228,7 +1228,6 @@ Features for this release were tracked via the use of the [kubernetes/features]( * **[stable]** Add support to use NFSv3, NFSv4, and GlusterFS on GCE/GKE GCI image based clusters. * **[beta]** Added support for mount options in persistent volumes. * **[alpha]** All in one volume proposal - a new volume driver capable of projecting secrets, configmaps, and downward API items into the same directory. -* **[alpha]** Flex volume API and Improved lifecycle (flexvolume). ## Deprecations * Remove extensions/v1beta1 Jobs resource, and job/v1beta1 generator. ([#38614](https://github.com/kubernetes/kubernetes/pull/38614), [@soltysh](https://github.com/soltysh)) From ab7f1fe0639d809ad978ffaa885e8be5df47f5df Mon Sep 17 00:00:00 2001 From: Fernando Diaz Date: Fri, 22 Sep 2017 17:58:28 -0500 Subject: [PATCH 12/51] Add docs for secret literal and file combinations Adds documentation to the help for generic secret creation that specifies how to create a secret using values from both a literal and a file. Also cleans up some of the formatting. --- pkg/kubectl/cmd/create_secret.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pkg/kubectl/cmd/create_secret.go b/pkg/kubectl/cmd/create_secret.go index 9a762cb5ae9..85909ceb05b 100644 --- a/pkg/kubectl/cmd/create_secret.go +++ b/pkg/kubectl/cmd/create_secret.go @@ -49,10 +49,11 @@ var ( A single secret may package one or more key/value pairs. When creating a secret based on a file, the key will default to the basename of the file, and the value will - default to the file content. If the basename is an invalid key, you may specify an alternate key. + default to the file content. If the basename is an invalid key or you wish to chose your own, you may specify + an alternate key. When creating a secret based on a directory, each file whose basename is a valid key in the directory will be - packaged into the secret. Any directory entries except regular files are ignored (e.g. subdirectories, + packaged into the secret. Any directory entries except regular files are ignored (e.g. subdirectories, symlinks, devices, pipes, etc).`)) secretExample = templates.Examples(i18n.T(` @@ -65,6 +66,9 @@ var ( # Create a new secret named my-secret with key1=supersecret and key2=topsecret kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret + # Create a new secret named my-secret using a combination of a file and a literal + kubectl create secret generic my-secret --from-file=ssh-privatekey=~/.ssh/id_rsa --from-literal=passphrase=topsecret + # Create a new secret named my-secret from an env file kubectl create secret generic my-secret --from-env-file=path/to/bar.env`)) ) @@ -127,11 +131,10 @@ var ( Dockercfg secrets are used to authenticate against Docker registries. - When using the Docker command line to push images, you can authenticate to a given registry by running + When using the Docker command line to push images, you can authenticate to a given registry by running: + '$ docker login DOCKER_REGISTRY_SERVER --username=DOCKER_USER --password=DOCKER_PASSWORD --email=DOCKER_EMAIL'. - $ docker login DOCKER_REGISTRY_SERVER --username=DOCKER_USER --password=DOCKER_PASSWORD --email=DOCKER_EMAIL'. - - That produces a ~/.dockercfg file that is used by subsequent 'docker push' and 'docker pull' commands to + That produces a ~/.dockercfg file that is used by subsequent 'docker push' and 'docker pull' commands to authenticate to the registry. The email address is optional. When creating applications, you may have a Docker registry that requires authentication. In order for the @@ -208,7 +211,8 @@ var ( secretForTLSLong = templates.LongDesc(i18n.T(` Create a TLS secret from the given public/private key pair. - The public/private key pair must exist before hand. The public key certificate must be .PEM encoded and match the given private key.`)) + The public/private key pair must exist before hand. The public key certificate must be .PEM encoded and match + the given private key.`)) secretForTLSExample = templates.Examples(i18n.T(` # Create a new TLS secret named tls-secret with the given key pair: From 536ce664df2ec531674cbca7e1ad93a80b9f1f95 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Sat, 23 Sep 2017 12:47:21 -0400 Subject: [PATCH 13/51] volunteer to help with external cloud providers Looks like we have a single approver in Mike. Throwing my hat in to help with approvals etc. --- pkg/cloudprovider/OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/cloudprovider/OWNERS b/pkg/cloudprovider/OWNERS index 249a4a546b1..16c18493fc4 100644 --- a/pkg/cloudprovider/OWNERS +++ b/pkg/cloudprovider/OWNERS @@ -1,5 +1,6 @@ approvers: - mikedanese +- dims reviewers: - thockin - lavalamp From 6d71eb590bf54d2fd7ff9c1370e4a9b83875470a Mon Sep 17 00:00:00 2001 From: Dane LeBlanc Date: Sun, 17 Sep 2017 13:42:09 -0400 Subject: [PATCH 14/51] Add check for IPv6 '::' when calculating kube-proxy's node IP kube-proxy currently checks for a bind address of 0.0.0.0 (IPv4 all-zeros) when calculating kube-proxy's node IP, but it does not check for an address of '::' (IPv6 all-zeros). For either of those all-zeros addresses, the node IP should be determined based on the hostname, rather than using the address directly. Also added a helpful log message when the kube-proxy protocol is determined to be IPv6. fixes #52613 --- cmd/kube-proxy/app/server_others.go | 7 ++-- cmd/kube-proxy/app/server_test.go | 59 +++++++++++++++++++++++++++-- pkg/proxy/userspace/proxier.go | 2 +- 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/cmd/kube-proxy/app/server_others.go b/cmd/kube-proxy/app/server_others.go index b0f0eace571..479d2adb4ca 100644 --- a/cmd/kube-proxy/app/server_others.go +++ b/cmd/kube-proxy/app/server_others.go @@ -65,6 +65,7 @@ func NewProxyServer(config *componentconfig.KubeProxyConfiguration, cleanupAndEx protocol := utiliptables.ProtocolIpv4 if net.ParseIP(config.BindAddress).To4() == nil { + glog.V(0).Infof("IPv6 bind address (%s), assume IPv6 operation", config.BindAddress) protocol = utiliptables.ProtocolIpv6 } @@ -115,10 +116,8 @@ func NewProxyServer(config *componentconfig.KubeProxyConfiguration, cleanupAndEx proxyMode := getProxyMode(string(config.Mode), iptInterface, iptables.LinuxKernelCompatTester{}) if proxyMode == proxyModeIPTables { glog.V(0).Info("Using iptables Proxier.") - var nodeIP net.IP - if config.BindAddress != "0.0.0.0" { - nodeIP = net.ParseIP(config.BindAddress) - } else { + nodeIP := net.ParseIP(config.BindAddress) + if nodeIP.Equal(net.IPv4zero) || nodeIP.Equal(net.IPv6zero) { nodeIP = getNodeIP(client, hostname) } if config.IPTables.MasqueradeBit == nil { diff --git a/cmd/kube-proxy/app/server_test.go b/cmd/kube-proxy/app/server_test.go index cf047b5f2c1..e6e0708064f 100644 --- a/cmd/kube-proxy/app/server_test.go +++ b/cmd/kube-proxy/app/server_test.go @@ -177,7 +177,7 @@ func TestProxyServerWithCleanupAndExit(t *testing.T) { // Each bind address below is a separate test case bindAddresses := []string{ "0.0.0.0", - "2001:db8::1", + "::", } for _, addr := range bindAddresses { options, err := NewOptions() @@ -308,13 +308,54 @@ udpTimeoutMilliseconds: 123ms metricsBindAddress string }{ { - name: "iptables mode, IPv4 config", + name: "iptables mode, IPv4 all-zeros bind address", + mode: "iptables", + bindAddress: "0.0.0.0", + clusterCIDR: "1.2.3.0/24", + healthzBindAddress: "1.2.3.4:12345", + metricsBindAddress: "2.3.4.5:23456", + }, + { + name: "iptables mode, non-zeros IPv4 config", mode: "iptables", bindAddress: "9.8.7.6", clusterCIDR: "1.2.3.0/24", healthzBindAddress: "1.2.3.4:12345", metricsBindAddress: "2.3.4.5:23456", }, + { + // Test for 'bindAddress: "::"' (IPv6 all-zeros) in kube-proxy + // config file. The user will need to put quotes around '::' since + // 'bindAddress: ::' is invalid yaml syntax. + name: "iptables mode, IPv6 \"::\" bind address", + mode: "iptables", + bindAddress: "\"::\"", + clusterCIDR: "fd00:1::0/64", + healthzBindAddress: "[fd00:1::5]:12345", + metricsBindAddress: "[fd00:2::5]:23456", + }, + { + // Test for 'bindAddress: "[::]"' (IPv6 all-zeros in brackets) + // in kube-proxy config file. The user will need to use + // surrounding quotes here since 'bindAddress: [::]' is invalid + // yaml syntax. + name: "iptables mode, IPv6 \"[::]\" bind address", + mode: "iptables", + bindAddress: "\"[::]\"", + clusterCIDR: "fd00:1::0/64", + healthzBindAddress: "[fd00:1::5]:12345", + metricsBindAddress: "[fd00:2::5]:23456", + }, + { + // Test for 'bindAddress: ::0' (another form of IPv6 all-zeros). + // No surrounding quotes are required around '::0'. + name: "iptables mode, IPv6 ::0 bind address", + mode: "iptables", + bindAddress: "::0", + clusterCIDR: "fd00:1::0/64", + healthzBindAddress: "[fd00:1::5]:12345", + metricsBindAddress: "[fd00:2::5]:23456", + }, { name: "ipvs mode, IPv6 config", mode: "ipvs", @@ -326,8 +367,13 @@ udpTimeoutMilliseconds: 123ms } for _, tc := range testCases { + expBindAddr := tc.bindAddress + if tc.bindAddress[0] == '"' { + // Surrounding double quotes will get stripped by the yaml parser. + expBindAddr = expBindAddr[1 : len(tc.bindAddress)-1] + } expected := &componentconfig.KubeProxyConfiguration{ - BindAddress: tc.bindAddress, + BindAddress: expBindAddr, ClientConnection: componentconfig.ClientConnectionConfiguration{ AcceptContentTypes: "abc", Burst: 100, @@ -374,7 +420,7 @@ udpTimeoutMilliseconds: 123ms config, err := options.loadConfig([]byte(yaml)) assert.NoError(t, err, "unexpected error for %s: %v", tc.name, err) if !reflect.DeepEqual(expected, config) { - t.Fatalf("unexpected config for %s test, diff = %s", tc.name, diff.ObjectDiff(config, expected)) + t.Fatalf("unexpected config for %s, diff = %s", tc.name, diff.ObjectDiff(config, expected)) } } } @@ -396,6 +442,11 @@ func TestLoadConfigFailures(t *testing.T) { config: "kind: KubeSchedulerConfiguration", expErr: "unexpected config type", }, + { + name: "Missing quotes around :: bindAddress", + config: "bindAddress: ::", + expErr: "mapping values are not allowed in this context", + }, } version := "apiVersion: componentconfig/v1alpha1" for _, tc := range testCases { diff --git a/pkg/proxy/userspace/proxier.go b/pkg/proxy/userspace/proxier.go index a6304db35f4..8e319c8ba23 100644 --- a/pkg/proxy/userspace/proxier.go +++ b/pkg/proxy/userspace/proxier.go @@ -942,7 +942,7 @@ func iptablesFlush(ipt iptables.Interface) error { var zeroIPv4 = net.ParseIP("0.0.0.0") var localhostIPv4 = net.ParseIP("127.0.0.1") -var zeroIPv6 = net.ParseIP("::0") +var zeroIPv6 = net.ParseIP("::") var localhostIPv6 = net.ParseIP("::1") // Build a slice of iptables args that are common to from-container and from-host portal rules. From a1cee9ab3bc50310498554f3929676b577943062 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Wed, 19 Jul 2017 22:07:12 +0800 Subject: [PATCH 15/51] fix some typos in api types --- pkg/api/types.go | 6 +++--- pkg/apis/autoscaling/types.go | 2 +- staging/src/k8s.io/api/autoscaling/v1/types.go | 2 +- staging/src/k8s.io/api/autoscaling/v2beta1/types.go | 2 +- staging/src/k8s.io/api/core/v1/types.go | 2 +- .../apiextensions-apiserver/pkg/apis/apiextensions/types.go | 2 +- .../pkg/apis/apiextensions/v1beta1/types.go | 2 +- .../src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go | 2 +- .../src/k8s.io/apimachinery/pkg/util/sets/types/types.go | 2 +- staging/src/k8s.io/apiserver/pkg/apis/audit/types.go | 2 +- .../src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go | 2 +- .../kube-aggregator/pkg/apis/apiregistration/types.go | 2 +- .../pkg/apis/apiregistration/v1beta1/types.go | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pkg/api/types.go b/pkg/api/types.go index 13b82f97900..d04612291e9 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -1238,7 +1238,7 @@ type AzureDiskVolumeSource struct { // the ReadOnly setting in VolumeMounts. // +optional ReadOnly *bool - // Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared + // Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared Kind *AzureDataDiskKind } @@ -3117,7 +3117,7 @@ type NodeConfigSource struct { type DaemonEndpoint struct { /* The port tag was not properly in quotes in earlier releases, so it must be - uppercased for backwards compat (since it was falling back to var name of + uppercase for backwards compatibility (since it was falling back to var name of 'Port'). */ @@ -4043,7 +4043,7 @@ const ( // BasicAuthPasswordKey is the key of the password or token for SecretTypeBasicAuth secrets BasicAuthPasswordKey = "password" - // SecretTypeSSHAuth contains data needed for SSH authetication. + // SecretTypeSSHAuth contains data needed for SSH authentication. // // Required field: // - Secret.Data["ssh-privatekey"] - private SSH key needed for authentication diff --git a/pkg/apis/autoscaling/types.go b/pkg/apis/autoscaling/types.go index 289b2275ad9..7c830d9467e 100644 --- a/pkg/apis/autoscaling/types.go +++ b/pkg/apis/autoscaling/types.go @@ -231,7 +231,7 @@ var ( // ScalingActive indicates that the HPA controller is able to scale if necessary: // it's correctly configured, can fetch the desired metrics, and isn't disabled. ScalingActive HorizontalPodAutoscalerConditionType = "ScalingActive" - // AbleToScale indicates a lack of transient issues which prevent scaling from occuring, + // AbleToScale indicates a lack of transient issues which prevent scaling from occurring, // such as being in a backoff window, or being unable to access/update the target scale. AbleToScale HorizontalPodAutoscalerConditionType = "AbleToScale" // ScalingLimited indicates that the calculated scale based on metrics would be above or diff --git a/staging/src/k8s.io/api/autoscaling/v1/types.go b/staging/src/k8s.io/api/autoscaling/v1/types.go index a18c3730c7e..e726c140399 100644 --- a/staging/src/k8s.io/api/autoscaling/v1/types.go +++ b/staging/src/k8s.io/api/autoscaling/v1/types.go @@ -264,7 +264,7 @@ var ( // ScalingActive indicates that the HPA controller is able to scale if necessary: // it's correctly configured, can fetch the desired metrics, and isn't disabled. ScalingActive HorizontalPodAutoscalerConditionType = "ScalingActive" - // AbleToScale indicates a lack of transient issues which prevent scaling from occuring, + // AbleToScale indicates a lack of transient issues which prevent scaling from occurring, // such as being in a backoff window, or being unable to access/update the target scale. AbleToScale HorizontalPodAutoscalerConditionType = "AbleToScale" // ScalingLimited indicates that the calculated scale based on metrics would be above or diff --git a/staging/src/k8s.io/api/autoscaling/v2beta1/types.go b/staging/src/k8s.io/api/autoscaling/v2beta1/types.go index d7b262ffa25..9c72ae25ca7 100644 --- a/staging/src/k8s.io/api/autoscaling/v2beta1/types.go +++ b/staging/src/k8s.io/api/autoscaling/v2beta1/types.go @@ -180,7 +180,7 @@ var ( // ScalingActive indicates that the HPA controller is able to scale if necessary: // it's correctly configured, can fetch the desired metrics, and isn't disabled. ScalingActive HorizontalPodAutoscalerConditionType = "ScalingActive" - // AbleToScale indicates a lack of transient issues which prevent scaling from occuring, + // AbleToScale indicates a lack of transient issues which prevent scaling from occurring, // such as being in a backoff window, or being unable to access/update the target scale. AbleToScale HorizontalPodAutoscalerConditionType = "AbleToScale" // ScalingLimited indicates that the calculated scale based on metrics would be above or diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 03afb55ee59..b9cbf2d4b5f 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -1322,7 +1322,7 @@ type AzureDiskVolumeSource struct { // the ReadOnly setting in VolumeMounts. // +optional ReadOnly *bool `json:"readOnly,omitempty" protobuf:"varint,5,opt,name=readOnly"` - // Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared + // Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared Kind *AzureDataDiskKind `json:"kind,omitempty" protobuf:"bytes,6,opt,name=kind,casttype=AzureDataDiskKind"` } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go index fba9c90bc26..880da65ce95 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go @@ -47,7 +47,7 @@ type CustomResourceDefinitionNames struct { ListKind string } -// ResourceScope is an enum defining the different scopes availabe to a custom resource +// ResourceScope is an enum defining the different scopes available to a custom resource type ResourceScope string const ( diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go index fe61f32151c..937092d2491 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go @@ -49,7 +49,7 @@ type CustomResourceDefinitionNames struct { ListKind string `json:"listKind,omitempty" protobuf:"bytes,5,opt,name=listKind"` } -// ResourceScope is an enum defining the different scopes availabe to a custom resource +// ResourceScope is an enum defining the different scopes available to a custom resource type ResourceScope string const ( diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go index 9c3c2a35e41..1c97414a9f9 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go @@ -98,7 +98,7 @@ type TableRowCondition struct { type RowConditionType string // These are valid conditions of a row. This list is not exhaustive and new conditions may be -// inculded by other resources. +// included by other resources. const ( // RowCompleted means the underlying resource has reached completion and may be given less // visual priority than other resources. diff --git a/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go b/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go index 801498ad7d8..41973564eae 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/sets/types/types.go @@ -23,7 +23,7 @@ package types type ReferenceSetTypes struct { // These types all cause files to be generated. - // These types should be reflected in the ouput of + // These types should be reflected in the output of // the "//pkg/util/sets:set-gen" genrule. a int64 b int diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go b/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go index 5e9ead5ac57..ead79439f81 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/types.go @@ -68,7 +68,7 @@ const ( // The stage for events generated once the response body has been completed, and no more bytes // will be sent. StageResponseComplete = "ResponseComplete" - // The stage for events generated when a panic occured. + // The stage for events generated when a panic occurred. StagePanic = "Panic" ) diff --git a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go index 768a515b0cd..6698ad3b7b3 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go @@ -69,7 +69,7 @@ const ( // The stage for events generated once the response body has been completed, and no more bytes // will be sent. StageResponseComplete = "ResponseComplete" - // The stage for events generated when a panic occured. + // The stage for events generated when a panic occurred. StagePanic = "Panic" ) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/types.go b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/types.go index 1dd68fe6fa8..853d0152061 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/types.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/types.go @@ -55,7 +55,7 @@ type APIServiceSpec struct { // CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. CABundle []byte - // GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is prefered by clients over lower priority ones. + // GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. // Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. // The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). // The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/types.go b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/types.go index 66238bc29fa..2ac807e39c0 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/types.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/types.go @@ -55,7 +55,7 @@ type APIServiceSpec struct { // CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. CABundle []byte `json:"caBundle" protobuf:"bytes,5,opt,name=caBundle"` - // GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is prefered by clients over lower priority ones. + // GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. // Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. // The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). // The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) From 05c46407993c9a7ed711ba39ca9b7297acd01867 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Tue, 26 Sep 2017 13:07:36 +0800 Subject: [PATCH 16/51] auto-gen --- api/openapi-spec/swagger.json | 4 ++-- api/swagger-spec/apps_v1beta1.json | 2 +- api/swagger-spec/apps_v1beta2.json | 2 +- api/swagger-spec/batch_v1.json | 2 +- api/swagger-spec/batch_v1beta1.json | 2 +- api/swagger-spec/batch_v2alpha1.json | 2 +- api/swagger-spec/extensions_v1beta1.json | 2 +- api/swagger-spec/settings.k8s.io_v1alpha1.json | 2 +- api/swagger-spec/v1.json | 2 +- docs/api-reference/apps/v1beta1/definitions.html | 2 +- docs/api-reference/apps/v1beta2/definitions.html | 2 +- docs/api-reference/batch/v1/definitions.html | 2 +- docs/api-reference/batch/v1beta1/definitions.html | 2 +- docs/api-reference/batch/v2alpha1/definitions.html | 2 +- docs/api-reference/extensions/v1beta1/definitions.html | 2 +- docs/api-reference/settings.k8s.io/v1alpha1/definitions.html | 2 +- docs/api-reference/v1/definitions.html | 2 +- federation/apis/openapi-spec/swagger.json | 2 +- federation/apis/swagger-spec/extensions_v1beta1.json | 2 +- .../docs/api-reference/extensions/v1beta1/definitions.html | 2 +- staging/src/k8s.io/api/core/v1/generated.proto | 2 +- staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go | 2 +- .../pkg/apis/apiregistration/v1beta1/generated.proto | 2 +- 23 files changed, 24 insertions(+), 24 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index b40ea542133..f05199e1973 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -63534,7 +63534,7 @@ "type": "string" }, "kind": { - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared", + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared", "type": "string" }, "readOnly": { @@ -72422,7 +72422,7 @@ "type": "string" }, "groupPriorityMinimum": { - "description": "GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is prefered by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s", + "description": "GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) We'd recommend something like: *.k8s.io (except extensions) at 18000 and PaaSes (OpenShift, Deis) are recommended to be in the 2000s", "type": "integer", "format": "int32" }, diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 651103d0fec..bdbc2966481 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -5098,7 +5098,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json index c8009aba601..58c1601bd80 100644 --- a/api/swagger-spec/apps_v1beta2.json +++ b/api/swagger-spec/apps_v1beta2.json @@ -7428,7 +7428,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index 1eac0dd2553..b9ae7aec4c6 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -2493,7 +2493,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/api/swagger-spec/batch_v1beta1.json b/api/swagger-spec/batch_v1beta1.json index 3a4030a22ee..84d8babcb93 100644 --- a/api/swagger-spec/batch_v1beta1.json +++ b/api/swagger-spec/batch_v1beta1.json @@ -2548,7 +2548,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json index 6d5fa876ecb..c93adbc5e74 100644 --- a/api/swagger-spec/batch_v2alpha1.json +++ b/api/swagger-spec/batch_v2alpha1.json @@ -2548,7 +2548,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index c1885075c61..047b20bfbe9 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -8046,7 +8046,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/api/swagger-spec/settings.k8s.io_v1alpha1.json b/api/swagger-spec/settings.k8s.io_v1alpha1.json index 972eba5e540..5983fb560d3 100644 --- a/api/swagger-spec/settings.k8s.io_v1alpha1.json +++ b/api/swagger-spec/settings.k8s.io_v1alpha1.json @@ -2306,7 +2306,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index d583b0a87a2..33ba44c656f 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -20805,7 +20805,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 8729d4365dc..b55f627fa6e 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -2879,7 +2879,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/docs/api-reference/apps/v1beta2/definitions.html b/docs/api-reference/apps/v1beta2/definitions.html index 409797beb11..15c741f1663 100755 --- a/docs/api-reference/apps/v1beta2/definitions.html +++ b/docs/api-reference/apps/v1beta2/definitions.html @@ -3509,7 +3509,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index 3bb612eeca9..b8092c23dc8 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -2263,7 +2263,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/docs/api-reference/batch/v1beta1/definitions.html b/docs/api-reference/batch/v1beta1/definitions.html index 58eb6642343..6f1b1dbd7b6 100755 --- a/docs/api-reference/batch/v1beta1/definitions.html +++ b/docs/api-reference/batch/v1beta1/definitions.html @@ -2297,7 +2297,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/docs/api-reference/batch/v2alpha1/definitions.html b/docs/api-reference/batch/v2alpha1/definitions.html index a65a0d39877..949c1d6f871 100755 --- a/docs/api-reference/batch/v2alpha1/definitions.html +++ b/docs/api-reference/batch/v2alpha1/definitions.html @@ -2270,7 +2270,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index 6d3dcc4ea58..9958c5dc73e 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -3453,7 +3453,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html b/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html index 4c68a758a07..bd68f9c62ea 100755 --- a/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html +++ b/docs/api-reference/settings.k8s.io/v1alpha1/definitions.html @@ -3118,7 +3118,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 3e66281a9d6..4f97a718d71 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -4107,7 +4107,7 @@ The resulting set of endpoints can be viewed as:

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index e5502314563..f24f507b0a1 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -10510,7 +10510,7 @@ "type": "string" }, "kind": { - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared", + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared", "type": "string" }, "readOnly": { diff --git a/federation/apis/swagger-spec/extensions_v1beta1.json b/federation/apis/swagger-spec/extensions_v1beta1.json index b2f5baba43f..23183feded2 100644 --- a/federation/apis/swagger-spec/extensions_v1beta1.json +++ b/federation/apis/swagger-spec/extensions_v1beta1.json @@ -6245,7 +6245,7 @@ }, "kind": { "$ref": "v1.AzureDataDiskKind", - "description": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" + "description": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared" } } }, diff --git a/federation/docs/api-reference/extensions/v1beta1/definitions.html b/federation/docs/api-reference/extensions/v1beta1/definitions.html index 9490ee5a226..b06201a4110 100755 --- a/federation/docs/api-reference/extensions/v1beta1/definitions.html +++ b/federation/docs/api-reference/extensions/v1beta1/definitions.html @@ -3090,7 +3090,7 @@ When an object is created, the system will populate this list with the current s

kind

-

Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

+

Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared

false

v1.AzureDataDiskKind

diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 6f04f8009eb..7bd3bc2c332 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -121,7 +121,7 @@ message AzureDiskVolumeSource { // +optional optional bool readOnly = 5; - // Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared + // Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared optional string kind = 6; } diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 4fc4deaa4a7..d27c94ceda1 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -76,7 +76,7 @@ var map_AzureDiskVolumeSource = map[string]string{ "cachingMode": "Host Caching mode: None, Read Only, Read Write.", "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", "readOnly": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", - "kind": "Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared", + "kind": "Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared", } func (AzureDiskVolumeSource) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.proto b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.proto index 10b7b2799ba..dabc9e0fec3 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.proto +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1/generated.proto @@ -91,7 +91,7 @@ message APIServiceSpec { // CABundle is a PEM encoded CA bundle which will be used to validate an API server's serving certificate. optional bytes caBundle = 5; - // GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is prefered by clients over lower priority ones. + // GroupPriorityMininum is the priority this group should have at least. Higher priority means that the group is preferred by clients over lower priority ones. // Note that other versions of this group might specify even higher GroupPriorityMininum values such that the whole group gets a higher priority. // The primary sort is based on GroupPriorityMinimum, ordered highest number to lowest (20 before 10). // The secondary sort is based on the alphabetical comparison of the name of the object. (v1.bar before v1.foo) From 091a9dfc35a10637c464b7f5e1e2ec2d25d7067f Mon Sep 17 00:00:00 2001 From: jianhuiz Date: Thu, 24 Aug 2017 16:14:17 -0700 Subject: [PATCH 17/51] outputs for colums not found --- pkg/printers/customcolumn.go | 8 ++++---- pkg/printers/customcolumn_test.go | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/pkg/printers/customcolumn.go b/pkg/printers/customcolumn.go index eec16ea18aa..bba5bc4ced5 100644 --- a/pkg/printers/customcolumn.go +++ b/pkg/printers/customcolumn.go @@ -176,7 +176,7 @@ func (s *CustomColumnsPrinter) PrintObj(obj runtime.Object, out io.Writer) error } parsers := make([]*jsonpath.JSONPath, len(s.Columns)) for ix := range s.Columns { - parsers[ix] = jsonpath.New(fmt.Sprintf("column%d", ix)) + parsers[ix] = jsonpath.New(fmt.Sprintf("column%d", ix)).AllowMissingKeys(true) if err := parsers[ix].Parse(s.Columns[ix].FieldSpec); err != nil { return err } @@ -226,10 +226,10 @@ func (s *CustomColumnsPrinter) printOneObject(obj runtime.Object, parsers []*jso if err != nil { return err } - if len(values) == 0 || len(values[0]) == 0 { - fmt.Fprintf(out, "\t") - } valueStrings := []string{} + if len(values) == 0 || len(values[0]) == 0 { + valueStrings = append(valueStrings, "") + } for arrIx := range values { for valIx := range values[arrIx] { valueStrings = append(valueStrings, fmt.Sprintf("%v", values[arrIx][valIx].Interface())) diff --git a/pkg/printers/customcolumn_test.go b/pkg/printers/customcolumn_test.go index e142a6fac9a..509aab3bada 100644 --- a/pkg/printers/customcolumn_test.go +++ b/pkg/printers/customcolumn_test.go @@ -284,6 +284,26 @@ bar obj: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, TypeMeta: metav1.TypeMeta{APIVersion: "baz"}}, expectedOutput: `NAME API_VERSION foo baz +`, + }, + { + columns: []printers.Column{ + { + Header: "NAME", + FieldSpec: "{.metadata.name}", + }, + { + Header: "API_VERSION", + FieldSpec: "{.apiVersion}", + }, + { + Header: "NOT_FOUND", + FieldSpec: "{.notFound}", + }, + }, + obj: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, TypeMeta: metav1.TypeMeta{APIVersion: "baz"}}, + expectedOutput: `NAME API_VERSION NOT_FOUND +foo baz `, }, } From 224357756981d3b2d379e52a372f41bb670de48c Mon Sep 17 00:00:00 2001 From: m1093782566 Date: Sat, 23 Sep 2017 13:03:38 +0800 Subject: [PATCH 18/51] remove ipv4 constraints of Node IPs in ipvs proxier --- pkg/proxy/ipvs/BUILD | 1 + pkg/proxy/ipvs/proxier.go | 7 +- pkg/proxy/ipvs/proxier_test.go | 130 +++++++++++++++++++++++---------- pkg/util/ipvs/testing/fake.go | 2 +- 4 files changed, 97 insertions(+), 43 deletions(-) diff --git a/pkg/proxy/ipvs/BUILD b/pkg/proxy/ipvs/BUILD index f20ed14b251..b2cd69ca8a9 100644 --- a/pkg/proxy/ipvs/BUILD +++ b/pkg/proxy/ipvs/BUILD @@ -54,6 +54,7 @@ go_library( "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index 4fcc3c04df3..55856b5c909 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -35,6 +35,7 @@ import ( clientv1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" @@ -155,17 +156,17 @@ func (r *realIPGetter) NodeIPs() (ips []net.IP, err error) { } intf, err := net.InterfaceByName(name) if err != nil { + utilruntime.HandleError(fmt.Errorf("Failed to get interface by name: %s, error: %v", name, err)) continue } addrs, err := intf.Addrs() if err != nil { + utilruntime.HandleError(fmt.Errorf("Failed to get addresses from interface: %s, error: %v", name, err)) continue } for _, a := range addrs { if ipnet, ok := a.(*net.IPNet); ok { - if ipnet.IP.To4() != nil { - ips = append(ips, ipnet.IP.To4()) - } + ips = append(ips, ipnet.IP) } } } diff --git a/pkg/proxy/ipvs/proxier_test.go b/pkg/proxy/ipvs/proxier_test.go index 27d1a0a228d..7b500d6d0b7 100644 --- a/pkg/proxy/ipvs/proxier_test.go +++ b/pkg/proxy/ipvs/proxier_test.go @@ -171,8 +171,10 @@ func makeTestEndpoints(namespace, name string, eptFunc func(*api.Endpoints)) *ap func TestNodePort(t *testing.T) { ipt := iptablestest.NewFake() ipvs := ipvstest.NewFake() - nodeIP := net.ParseIP("100.101.102.103") - fp := NewFakeProxier(ipt, ipvs, []net.IP{nodeIP}) + nodeIPv4 := net.ParseIP("100.101.102.103") + nodeIPv6 := net.ParseIP("2001:db8::1:1") + nodeIPs := sets.NewString(nodeIPv4.String(), nodeIPv6.String()) + fp := NewFakeProxier(ipt, ipvs, []net.IP{nodeIPv4, nodeIPv6}) svcIP := "10.20.30.41" svcPort := 80 svcNodePort := 3001 @@ -193,12 +195,16 @@ func TestNodePort(t *testing.T) { }} }), ) - epIP := "10.180.0.1" + epIPv4 := "10.180.0.1" + epIPv6 := "1002:ab8::2:10" + epIPs := sets.NewString(epIPv4, epIPv6) makeEndpointsMap(fp, makeTestEndpoints(svcPortName.Namespace, svcPortName.Name, func(ept *api.Endpoints) { ept.Subsets = []api.EndpointSubset{{ Addresses: []api.EndpointAddress{{ - IP: epIP, + IP: epIPv4, + }, { + IP: epIPv6, }}, Ports: []api.EndpointPort{{ Name: svcPortName.Port, @@ -215,19 +221,19 @@ func TestNodePort(t *testing.T) { if err != nil { t.Errorf("Failed to get ipvs services, err: %v", err) } - if len(services) != 2 { - t.Errorf("Expect 2 ipvs services, got %d", len(services)) + if len(services) != 3 { + t.Errorf("Expect 3 ipvs services, got %d", len(services)) } found := false for _, svc := range services { - if svc.Address.Equal(nodeIP) && svc.Port == uint16(svcNodePort) && svc.Protocol == string(api.ProtocolTCP) { + if nodeIPs.Has(svc.Address.String()) && svc.Port == uint16(svcNodePort) && svc.Protocol == string(api.ProtocolTCP) { found = true destinations, err := ipvs.GetRealServers(svc) if err != nil { t.Errorf("Failed to get ipvs destinations, err: %v", err) } for _, dest := range destinations { - if dest.Address.To4().String() != epIP || dest.Port != uint16(svcPort) { + if !epIPs.Has(dest.Address.String()) || dest.Port != uint16(svcPort) { t.Errorf("service Endpoint mismatch ipvs service destination") } } @@ -324,7 +330,7 @@ func TestClusterIPNoEndpoint(t *testing.T) { if len(services) != 1 { t.Errorf("Expect 1 ipvs services, got %d", len(services)) } else { - if services[0].Address.To4().String() != svcIP || services[0].Port != uint16(svcPort) && services[0].Protocol == string(api.ProtocolTCP) { + if services[0].Address.String() != svcIP || services[0].Port != uint16(svcPort) || services[0].Protocol != string(api.ProtocolTCP) { t.Errorf("Unexpected mismatch service") } else { destinations, _ := ipvs.GetRealServers(services[0]) @@ -339,34 +345,60 @@ func TestClusterIP(t *testing.T) { ipt := iptablestest.NewFake() ipvs := ipvstest.NewFake() fp := NewFakeProxier(ipt, ipvs, nil) - svcIP := "10.20.30.41" - svcPort := 80 - svcPortName := proxy.ServicePortName{ + + svcIPv4 := "10.20.30.41" + svcPortV4 := 80 + svcPortNameV4 := proxy.ServicePortName{ NamespacedName: makeNSN("ns1", "svc1"), Port: "p80", } - + svcIPv6 := "1002:ab8::2:1" + svcPortV6 := 8080 + svcPortNameV6 := proxy.ServicePortName{ + NamespacedName: makeNSN("ns2", "svc2"), + Port: "p8080", + } makeServiceMap(fp, - makeTestService(svcPortName.Namespace, svcPortName.Name, func(svc *api.Service) { - svc.Spec.ClusterIP = svcIP + makeTestService(svcPortNameV4.Namespace, svcPortNameV4.Name, func(svc *api.Service) { + svc.Spec.ClusterIP = svcIPv4 svc.Spec.Ports = []api.ServicePort{{ - Name: svcPortName.Port, - Port: int32(svcPort), + Name: svcPortNameV4.Port, + Port: int32(svcPortV4), + Protocol: api.ProtocolTCP, + }} + }), + makeTestService(svcPortNameV6.Namespace, svcPortNameV6.Name, func(svc *api.Service) { + svc.Spec.ClusterIP = svcIPv6 + svc.Spec.Ports = []api.ServicePort{{ + Name: svcPortNameV6.Port, + Port: int32(svcPortV6), Protocol: api.ProtocolTCP, }} }), ) - epIP := "10.180.0.1" + epIPv4 := "10.180.0.1" + epIPv6 := "1009:ab8::5:6" makeEndpointsMap(fp, - makeTestEndpoints(svcPortName.Namespace, svcPortName.Name, func(ept *api.Endpoints) { + makeTestEndpoints(svcPortNameV4.Namespace, svcPortNameV4.Name, func(ept *api.Endpoints) { ept.Subsets = []api.EndpointSubset{{ Addresses: []api.EndpointAddress{{ - IP: epIP, + IP: epIPv4, }}, Ports: []api.EndpointPort{{ - Name: svcPortName.Port, - Port: int32(svcPort), + Name: svcPortNameV4.Port, + Port: int32(svcPortV4), + }}, + }} + }), + makeTestEndpoints(svcPortNameV6.Namespace, svcPortNameV6.Name, func(ept *api.Endpoints) { + ept.Subsets = []api.EndpointSubset{{ + Addresses: []api.EndpointAddress{{ + IP: epIPv6, + }}, + Ports: []api.EndpointPort{{ + Name: svcPortNameV6.Port, + Port: int32(svcPortV6), }}, }} }), @@ -379,16 +411,36 @@ func TestClusterIP(t *testing.T) { if err != nil { t.Errorf("Failed to get ipvs services, err: %v", err) } - if len(services) != 1 { - t.Errorf("Expect 1 ipvs services, got %d", len(services)) - } else { - if services[0].Address.To4().String() != svcIP || services[0].Port != uint16(svcPort) && services[0].Protocol == string(api.ProtocolTCP) { - t.Errorf("Unexpected mismatch service") - } else { - destinations, _ := ipvs.GetRealServers(services[0]) + if len(services) != 2 { + t.Errorf("Expect 2 ipvs services, got %d", len(services)) + } + for i := range services { + // Check services + if services[i].Address.String() == svcIPv4 { + if services[i].Port != uint16(svcPortV4) || services[i].Protocol != string(api.ProtocolTCP) { + t.Errorf("Unexpected mismatch service") + } + // Check destinations + destinations, _ := ipvs.GetRealServers(services[i]) if len(destinations) != 1 { - t.Errorf("Unexpected %d destinations, expect 0 destinations", len(destinations)) - } else if destinations[0].Address.To4().String() != epIP || destinations[0].Port != uint16(svcPort) { + t.Errorf("Expected 1 destinations, got %d destinations", len(destinations)) + continue + } + if destinations[0].Address.String() != epIPv4 || destinations[0].Port != uint16(svcPortV4) { + t.Errorf("Unexpected mismatch destinations") + } + } + if services[i].Address.String() == svcIPv6 { + if services[i].Port != uint16(svcPortV6) || services[i].Protocol != string(api.ProtocolTCP) { + t.Errorf("Unexpected mismatch service") + } + // Check destinations + destinations, _ := ipvs.GetRealServers(services[i]) + if len(destinations) != 1 { + t.Errorf("Expected 1 destinations, got %d destinations", len(destinations)) + continue + } + if destinations[0].Address.String() != epIPv6 || destinations[0].Port != uint16(svcPortV6) { t.Errorf("Unexpected mismatch destinations") } } @@ -435,7 +487,7 @@ func TestExternalIPsNoEndpoint(t *testing.T) { } found := false for _, svc := range services { - if svc.Address.To4().String() == svcExternalIPs && svc.Port == uint16(svcPort) && svc.Protocol == string(api.ProtocolTCP) { + if svc.Address.String() == svcExternalIPs && svc.Port == uint16(svcPort) && svc.Protocol == string(api.ProtocolTCP) { found = true destinations, _ := ipvs.GetRealServers(svc) if len(destinations) != 0 { @@ -455,7 +507,7 @@ func TestExternalIPs(t *testing.T) { fp := NewFakeProxier(ipt, ipvs, nil) svcIP := "10.20.30.41" svcPort := 80 - svcExternalIPs := "50.60.70.81" + svcExternalIPs := sets.NewString("50.60.70.81", "2012::51") svcPortName := proxy.ServicePortName{ NamespacedName: makeNSN("ns1", "svc1"), Port: "p80", @@ -465,7 +517,7 @@ func TestExternalIPs(t *testing.T) { makeTestService(svcPortName.Namespace, svcPortName.Name, func(svc *api.Service) { svc.Spec.Type = "ClusterIP" svc.Spec.ClusterIP = svcIP - svc.Spec.ExternalIPs = []string{svcExternalIPs} + svc.Spec.ExternalIPs = svcExternalIPs.UnsortedList() svc.Spec.Ports = []api.ServicePort{{ Name: svcPortName.Port, Port: int32(svcPort), @@ -497,16 +549,16 @@ func TestExternalIPs(t *testing.T) { if err != nil { t.Errorf("Failed to get ipvs services, err: %v", err) } - if len(services) != 2 { - t.Errorf("Expect 2 ipvs services, got %d", len(services)) + if len(services) != 3 { + t.Errorf("Expect 3 ipvs services, got %d", len(services)) } found := false for _, svc := range services { - if svc.Address.To4().String() == svcExternalIPs && svc.Port == uint16(svcPort) && svc.Protocol == string(api.ProtocolTCP) { + if svcExternalIPs.Has(svc.Address.String()) && svc.Port == uint16(svcPort) && svc.Protocol == string(api.ProtocolTCP) { found = true destinations, _ := ipvs.GetRealServers(svc) for _, dest := range destinations { - if dest.Address.To4().String() != epIP || dest.Port != uint16(svcPort) { + if dest.Address.String() != epIP || dest.Port != uint16(svcPort) { t.Errorf("service Endpoint mismatch ipvs service destination") } } @@ -637,7 +689,7 @@ func TestOnlyLocalNodePorts(t *testing.T) { if len(destinations) != 1 { t.Errorf("Expect 1 ipvs destination, got %d", len(destinations)) } else { - if destinations[0].Address.To4().String() != epIP2 || destinations[0].Port != uint16(svcPort) { + if destinations[0].Address.String() != epIP2 || destinations[0].Port != uint16(svcPort) { t.Errorf("service Endpoint mismatch ipvs service destination") } } diff --git a/pkg/util/ipvs/testing/fake.go b/pkg/util/ipvs/testing/fake.go index de4acf546e1..df754e0a8c9 100644 --- a/pkg/util/ipvs/testing/fake.go +++ b/pkg/util/ipvs/testing/fake.go @@ -73,7 +73,7 @@ func (f *FakeIPVS) AddVirtualServer(serv *utilipvs.VirtualServer) error { key := toServiceKey(serv) f.Services[key] = serv // make sure no destination present when creating new service - f.Destinations = make(map[serviceKey][]*utilipvs.RealServer) + f.Destinations[key] = make([]*utilipvs.RealServer, 0) return nil } From f28140429e0f3b6b4ef1bb7399d1bbd7d644c933 Mon Sep 17 00:00:00 2001 From: x1957 Date: Sat, 30 Sep 2017 01:00:24 +0800 Subject: [PATCH 19/51] fix comment --- pkg/kubelet/network/hostport/hostport_syncer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubelet/network/hostport/hostport_syncer.go b/pkg/kubelet/network/hostport/hostport_syncer.go index 03cca1a8d80..0086b74561d 100644 --- a/pkg/kubelet/network/hostport/hostport_syncer.go +++ b/pkg/kubelet/network/hostport/hostport_syncer.go @@ -64,7 +64,7 @@ func (hp *hostport) String() string { return fmt.Sprintf("%s:%d", hp.protocol, hp.port) } -//openPodHostports opens all hostport for pod and returns the map of hostport and socket +// openHostports opens all hostport for pod and returns the map of hostport and socket func (h *hostportSyncer) openHostports(podHostportMapping *PodPortMapping) error { var retErr error ports := make(map[hostport]closeable) From 694630724a1e5036d35ed9c12dc97dd2989d15d6 Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Sun, 1 Oct 2017 21:09:32 +0530 Subject: [PATCH 20/51] Rename TPR to CRD to be consistent TPR has been completely removed. We should rename TPR to CRD to be consistent with the nomenclature. --- hack/make-rules/test-cmd-util.sh | 87 +++++++++---------- hack/testdata/{TPR => CRD}/bar.yaml | 0 .../{TPR => CRD}/foo-added-subfield.yaml | 0 .../{TPR => CRD}/foo-deleted-subfield.yaml | 0 .../{TPR => CRD}/foo-updated-subfield.yaml | 0 hack/testdata/{TPR => CRD}/foo.yaml | 0 .../multi-crd-list-added-field.yaml} | 0 .../multi-crd-list-deleted-field.yaml} | 0 .../multi-crd-list-updated-field.yaml} | 0 .../multi-crd-list.yaml} | 0 .../crdregistration_controller.go | 8 +- 11 files changed, 46 insertions(+), 49 deletions(-) rename hack/testdata/{TPR => CRD}/bar.yaml (100%) rename hack/testdata/{TPR => CRD}/foo-added-subfield.yaml (100%) rename hack/testdata/{TPR => CRD}/foo-deleted-subfield.yaml (100%) rename hack/testdata/{TPR => CRD}/foo-updated-subfield.yaml (100%) rename hack/testdata/{TPR => CRD}/foo.yaml (100%) rename hack/testdata/{TPR/multi-tpr-list-added-field.yaml => CRD/multi-crd-list-added-field.yaml} (100%) rename hack/testdata/{TPR/multi-tpr-list-deleted-field.yaml => CRD/multi-crd-list-deleted-field.yaml} (100%) rename hack/testdata/{TPR/multi-tpr-list-updated-field.yaml => CRD/multi-crd-list-updated-field.yaml} (100%) rename hack/testdata/{TPR/multi-tpr-list.yaml => CRD/multi-crd-list.yaml} (100%) diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index a46f07b84a4..a80773b71f9 100755 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -74,7 +74,6 @@ static="static" storageclass="storageclass" subjectaccessreviews="subjectaccessreviews" selfsubjectaccessreviews="selfsubjectaccessreviews" -thirdpartyresources="thirdpartyresources" customresourcedefinitions="customresourcedefinitions" daemonsets="daemonsets" controllerrevisions="controllerrevisions" @@ -1542,16 +1541,16 @@ run_non_native_resource_tests() { kube::log::status "Testing kubectl non-native resources" kube::util::non_native_resources - # Test that we can list this new third party resource (foos) + # Test that we can list this new CustomResource (foos) kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" '' - # Test that we can list this new third party resource (bars) + # Test that we can list this new CustomResource (bars) kube::test::get_object_assert bars "{{range.items}}{{$id_field}}:{{end}}" '' # Test that we can create a new resource of type Foo - kubectl "${kube_flags[@]}" create -f hack/testdata/TPR/foo.yaml "${kube_flags[@]}" + kubectl "${kube_flags[@]}" create -f hack/testdata/CRD/foo.yaml "${kube_flags[@]}" - # Test that we can list this new third party resource + # Test that we can list this new custom resource kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" 'test:' # Test alternate forms @@ -1560,7 +1559,7 @@ run_non_native_resource_tests() { kube::test::get_object_assert foos.v1.company.com "{{range.items}}{{$id_field}}:{{end}}" 'test:' # Test all printers, with lists and individual items - kube::log::status "Testing ThirdPartyResource printing" + kube::log::status "Testing CustomResource printing" kubectl "${kube_flags[@]}" get foos kubectl "${kube_flags[@]}" get foos/test kubectl "${kube_flags[@]}" get foos -o name @@ -1579,7 +1578,7 @@ run_non_native_resource_tests() { kube::test::if_has_string "${output_message}" 'foos/test' # Test patching - kube::log::status "Testing ThirdPartyResource patching" + kube::log::status "Testing CustomResource patching" kubectl "${kube_flags[@]}" patch foos/test -p '{"patched":"value1"}' --type=merge kube::test::get_object_assert foos/test "{{.patched}}" 'value1' kubectl "${kube_flags[@]}" patch foos/test -p '{"patched":"value2"}' --type=merge --record @@ -1587,37 +1586,37 @@ run_non_native_resource_tests() { kubectl "${kube_flags[@]}" patch foos/test -p '{"patched":null}' --type=merge --record kube::test::get_object_assert foos/test "{{.patched}}" '' # Get local version - TPR_RESOURCE_FILE="${KUBE_TEMP}/tpr-foos-test.json" - kubectl "${kube_flags[@]}" get foos/test -o json > "${TPR_RESOURCE_FILE}" + CRD_RESOURCE_FILE="${KUBE_TEMP}/crd-foos-test.json" + kubectl "${kube_flags[@]}" get foos/test -o json > "${CRD_RESOURCE_FILE}" # cannot apply strategic patch locally - TPR_PATCH_ERROR_FILE="${KUBE_TEMP}/tpr-foos-test-error" - ! kubectl "${kube_flags[@]}" patch --local -f "${TPR_RESOURCE_FILE}" -p '{"patched":"value3"}' 2> "${TPR_PATCH_ERROR_FILE}" - if grep -q "try --type merge" "${TPR_PATCH_ERROR_FILE}"; then - kube::log::status "\"kubectl patch --local\" returns error as expected for ThirdPartyResource: $(cat ${TPR_PATCH_ERROR_FILE})" + CRD_PATCH_ERROR_FILE="${KUBE_TEMP}/crd-foos-test-error" + ! kubectl "${kube_flags[@]}" patch --local -f "${CRD_RESOURCE_FILE}" -p '{"patched":"value3"}' 2> "${CRD_PATCH_ERROR_FILE}" + if grep -q "try --type merge" "${CRD_PATCH_ERROR_FILE}"; then + kube::log::status "\"kubectl patch --local\" returns error as expected for CustomResource: $(cat ${CRD_PATCH_ERROR_FILE})" else - kube::log::status "\"kubectl patch --local\" returns unexpected error or non-error: $(cat ${TPR_PATCH_ERROR_FILE})" + kube::log::status "\"kubectl patch --local\" returns unexpected error or non-error: $(cat ${CRD_PATCH_ERROR_FILE})" exit 1 fi # can apply merge patch locally - kubectl "${kube_flags[@]}" patch --local -f "${TPR_RESOURCE_FILE}" -p '{"patched":"value3"}' --type=merge -o json + kubectl "${kube_flags[@]}" patch --local -f "${CRD_RESOURCE_FILE}" -p '{"patched":"value3"}' --type=merge -o json # can apply merge patch remotely - kubectl "${kube_flags[@]}" patch --record -f "${TPR_RESOURCE_FILE}" -p '{"patched":"value3"}' --type=merge -o json + kubectl "${kube_flags[@]}" patch --record -f "${CRD_RESOURCE_FILE}" -p '{"patched":"value3"}' --type=merge -o json kube::test::get_object_assert foos/test "{{.patched}}" 'value3' - rm "${TPR_RESOURCE_FILE}" - rm "${TPR_PATCH_ERROR_FILE}" + rm "${CRD_RESOURCE_FILE}" + rm "${CRD_PATCH_ERROR_FILE}" # Test labeling - kube::log::status "Testing ThirdPartyResource labeling" + kube::log::status "Testing CustomResource labeling" kubectl "${kube_flags[@]}" label foos --all listlabel=true kubectl "${kube_flags[@]}" label foo/test itemlabel=true # Test annotating - kube::log::status "Testing ThirdPartyResource annotating" + kube::log::status "Testing CustomResource annotating" kubectl "${kube_flags[@]}" annotate foos --all listannotation=true kubectl "${kube_flags[@]}" annotate foo/test itemannotation=true # Test describing - kube::log::status "Testing ThirdPartyResource describing" + kube::log::status "Testing CustomResource describing" kubectl "${kube_flags[@]}" describe foos kubectl "${kube_flags[@]}" describe foos/test kubectl "${kube_flags[@]}" describe foos | grep listlabel=true @@ -1630,15 +1629,15 @@ run_non_native_resource_tests() { kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" '' # Test that we can create a new resource of type Bar - kubectl "${kube_flags[@]}" create -f hack/testdata/TPR/bar.yaml "${kube_flags[@]}" + kubectl "${kube_flags[@]}" create -f hack/testdata/CRD/bar.yaml "${kube_flags[@]}" - # Test that we can list this new third party resource + # Test that we can list this new custom resource kube::test::get_object_assert bars "{{range.items}}{{$id_field}}:{{end}}" 'test:' # Test that we can watch the resource. # Start watcher in background with process substitution, # so we can read from stdout asynchronously. - kube::log::status "Testing ThirdPartyResource watching" + kube::log::status "Testing CustomResource watching" exec 3< <(kubectl "${kube_flags[@]}" get bars --request-timeout=1m --watch-only -o name & echo $! ; wait) local watch_pid read <&3 watch_pid @@ -1668,7 +1667,7 @@ run_non_native_resource_tests() { kube::test::wait_object_assert bars "{{range.items}}{{$id_field}}:{{end}}" '' # Test that we can create single item via apply - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/foo.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/foo.yaml # Test that we have create a foo named test kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" 'test:' @@ -1677,7 +1676,7 @@ run_non_native_resource_tests() { kube::test::get_object_assert foos/test '{{.someField}}' 'field1' # Test that apply an empty patch doesn't change fields - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/foo.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/foo.yaml # Test that the field has the same value after re-apply kube::test::get_object_assert foos/test '{{.someField}}' 'field1' @@ -1686,7 +1685,7 @@ run_non_native_resource_tests() { kube::test::get_object_assert foos/test '{{.nestedField.someSubfield}}' 'subfield1' # Update a subfield and then apply the change - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/foo-updated-subfield.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/foo-updated-subfield.yaml # Test that apply has updated the subfield kube::test::get_object_assert foos/test '{{.nestedField.someSubfield}}' 'modifiedSubfield' @@ -1695,7 +1694,7 @@ run_non_native_resource_tests() { kube::test::get_object_assert foos/test '{{.nestedField.otherSubfield}}' 'subfield2' # Delete a subfield and then apply the change - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/foo-deleted-subfield.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/foo-deleted-subfield.yaml # Test that apply has deleted the field kube::test::get_object_assert foos/test '{{.nestedField.otherSubfield}}' '' @@ -1704,19 +1703,19 @@ run_non_native_resource_tests() { kube::test::get_object_assert foos/test '{{.nestedField.newSubfield}}' '' # Add a field and then apply the change - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/foo-added-subfield.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/foo-added-subfield.yaml # Test that apply has added the field kube::test::get_object_assert foos/test '{{.nestedField.newSubfield}}' 'subfield3' # Delete the resource - kubectl "${kube_flags[@]}" delete -f hack/testdata/TPR/foo.yaml + kubectl "${kube_flags[@]}" delete -f hack/testdata/CRD/foo.yaml # Make sure it's gone kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" '' # Test that we can create list via apply - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/multi-tpr-list.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/multi-crd-list.yaml # Test that we have create a foo and a bar from a list kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" 'test-list:' @@ -1727,7 +1726,7 @@ run_non_native_resource_tests() { kube::test::get_object_assert bars/test-list '{{.someField}}' 'field1' # Test that re-apply an list doesn't change anything - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/multi-tpr-list.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/multi-crd-list.yaml # Test that the field has the same value after re-apply kube::test::get_object_assert foos/test-list '{{.someField}}' 'field1' @@ -1738,7 +1737,7 @@ run_non_native_resource_tests() { kube::test::get_object_assert bars/test-list '{{.someField}}' 'field1' # Update fields and then apply the change - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/multi-tpr-list-updated-field.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/multi-crd-list-updated-field.yaml # Test that apply has updated the fields kube::test::get_object_assert foos/test-list '{{.someField}}' 'modifiedField' @@ -1749,7 +1748,7 @@ run_non_native_resource_tests() { kube::test::get_object_assert bars/test-list '{{.otherField}}' 'field2' # Delete fields and then apply the change - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/multi-tpr-list-deleted-field.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/multi-crd-list-deleted-field.yaml # Test that apply has deleted the fields kube::test::get_object_assert foos/test-list '{{.otherField}}' '' @@ -1760,14 +1759,14 @@ run_non_native_resource_tests() { kube::test::get_object_assert bars/test-list '{{.newField}}' '' # Add a field and then apply the change - kubectl "${kube_flags[@]}" apply -f hack/testdata/TPR/multi-tpr-list-added-field.yaml + kubectl "${kube_flags[@]}" apply -f hack/testdata/CRD/multi-crd-list-added-field.yaml # Test that apply has added the field kube::test::get_object_assert foos/test-list '{{.newField}}' 'field3' kube::test::get_object_assert bars/test-list '{{.newField}}' 'field3' # Delete the resource - kubectl "${kube_flags[@]}" delete -f hack/testdata/TPR/multi-tpr-list.yaml + kubectl "${kube_flags[@]}" delete -f hack/testdata/CRD/multi-crd-list.yaml # Make sure it's gone kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" '' @@ -1779,19 +1778,19 @@ run_non_native_resource_tests() { kube::test::get_object_assert bars "{{range.items}}{{$id_field}}:{{end}}" '' # apply --prune on foo.yaml that has foo/test - kubectl apply --prune -l pruneGroup=true -f hack/testdata/TPR/foo.yaml "${kube_flags[@]}" --prune-whitelist=company.com/v1/Foo --prune-whitelist=company.com/v1/Bar - # check right tprs exist + kubectl apply --prune -l pruneGroup=true -f hack/testdata/CRD/foo.yaml "${kube_flags[@]}" --prune-whitelist=company.com/v1/Foo --prune-whitelist=company.com/v1/Bar + # check right crds exist kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" 'test:' kube::test::get_object_assert bars "{{range.items}}{{$id_field}}:{{end}}" '' # apply --prune on bar.yaml that has bar/test - kubectl apply --prune -l pruneGroup=true -f hack/testdata/TPR/bar.yaml "${kube_flags[@]}" --prune-whitelist=company.com/v1/Foo --prune-whitelist=company.com/v1/Bar - # check right tprs exist + kubectl apply --prune -l pruneGroup=true -f hack/testdata/CRD/bar.yaml "${kube_flags[@]}" --prune-whitelist=company.com/v1/Foo --prune-whitelist=company.com/v1/Bar + # check right crds exist kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" '' kube::test::get_object_assert bars "{{range.items}}{{$id_field}}:{{end}}" 'test:' # Delete the resource - kubectl "${kube_flags[@]}" delete -f hack/testdata/TPR/bar.yaml + kubectl "${kube_flags[@]}" delete -f hack/testdata/CRD/bar.yaml # Make sure it's gone kube::test::get_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" '' @@ -1799,7 +1798,7 @@ run_non_native_resource_tests() { # Test 'kubectl create' with namespace, and namespace cleanup. kubectl "${kube_flags[@]}" create namespace non-native-resources - kubectl "${kube_flags[@]}" create -f hack/testdata/TPR/bar.yaml --namespace=non-native-resources + kubectl "${kube_flags[@]}" create -f hack/testdata/CRD/bar.yaml --namespace=non-native-resources kube::test::get_object_assert bars '{{len .items}}' '1' --namespace=non-native-resources kubectl "${kube_flags[@]}" delete namespace non-native-resources # Make sure objects go away. @@ -4518,10 +4517,10 @@ runTests() { fi ##################################### - # Third Party Resources # + # CustomResourceDefinitions # ##################################### - # customresourcedefinitions cleanup after themselves. Run these first, then TPRs + # customresourcedefinitions cleanup after themselves. if kube::test::if_supports_resource "${customresourcedefinitions}" ; then record_command run_crd_tests fi diff --git a/hack/testdata/TPR/bar.yaml b/hack/testdata/CRD/bar.yaml similarity index 100% rename from hack/testdata/TPR/bar.yaml rename to hack/testdata/CRD/bar.yaml diff --git a/hack/testdata/TPR/foo-added-subfield.yaml b/hack/testdata/CRD/foo-added-subfield.yaml similarity index 100% rename from hack/testdata/TPR/foo-added-subfield.yaml rename to hack/testdata/CRD/foo-added-subfield.yaml diff --git a/hack/testdata/TPR/foo-deleted-subfield.yaml b/hack/testdata/CRD/foo-deleted-subfield.yaml similarity index 100% rename from hack/testdata/TPR/foo-deleted-subfield.yaml rename to hack/testdata/CRD/foo-deleted-subfield.yaml diff --git a/hack/testdata/TPR/foo-updated-subfield.yaml b/hack/testdata/CRD/foo-updated-subfield.yaml similarity index 100% rename from hack/testdata/TPR/foo-updated-subfield.yaml rename to hack/testdata/CRD/foo-updated-subfield.yaml diff --git a/hack/testdata/TPR/foo.yaml b/hack/testdata/CRD/foo.yaml similarity index 100% rename from hack/testdata/TPR/foo.yaml rename to hack/testdata/CRD/foo.yaml diff --git a/hack/testdata/TPR/multi-tpr-list-added-field.yaml b/hack/testdata/CRD/multi-crd-list-added-field.yaml similarity index 100% rename from hack/testdata/TPR/multi-tpr-list-added-field.yaml rename to hack/testdata/CRD/multi-crd-list-added-field.yaml diff --git a/hack/testdata/TPR/multi-tpr-list-deleted-field.yaml b/hack/testdata/CRD/multi-crd-list-deleted-field.yaml similarity index 100% rename from hack/testdata/TPR/multi-tpr-list-deleted-field.yaml rename to hack/testdata/CRD/multi-crd-list-deleted-field.yaml diff --git a/hack/testdata/TPR/multi-tpr-list-updated-field.yaml b/hack/testdata/CRD/multi-crd-list-updated-field.yaml similarity index 100% rename from hack/testdata/TPR/multi-tpr-list-updated-field.yaml rename to hack/testdata/CRD/multi-crd-list-updated-field.yaml diff --git a/hack/testdata/TPR/multi-tpr-list.yaml b/hack/testdata/CRD/multi-crd-list.yaml similarity index 100% rename from hack/testdata/TPR/multi-tpr-list.yaml rename to hack/testdata/CRD/multi-crd-list.yaml diff --git a/pkg/master/controller/crdregistration/crdregistration_controller.go b/pkg/master/controller/crdregistration/crdregistration_controller.go index 5323206f9d6..c3a87b418a4 100644 --- a/pkg/master/controller/crdregistration/crdregistration_controller.go +++ b/pkg/master/controller/crdregistration/crdregistration_controller.go @@ -60,10 +60,8 @@ type crdRegistrationController struct { queue workqueue.RateLimitingInterface } -// NewAutoRegistrationController returns a controller which will register TPR GroupVersions with the auto APIService registration +// NewAutoRegistrationController returns a controller which will register CRD GroupVersions with the auto APIService registration // controller so they automatically stay in sync. -// In order to stay sane with both TPR and CRD present, we have a single controller that manages both. When choosing whether to have an -// APIService, we simply iterate through both. func NewAutoRegistrationController(crdinformer crdinformers.CustomResourceDefinitionInformer, apiServiceRegistration AutoAPIServiceRegistration) *crdRegistrationController { c := &crdRegistrationController{ crdLister: crdinformer.Lister(), @@ -213,8 +211,8 @@ func (c *crdRegistrationController) handleVersionUpdate(groupVersion schema.Grou Spec: apiregistration.APIServiceSpec{ Group: groupVersion.Group, Version: groupVersion.Version, - GroupPriorityMinimum: 1000, // TPRs should have relatively low priority - VersionPriority: 100, // TPRs should have relatively low priority + GroupPriorityMinimum: 1000, // CRDs should have relatively low priority + VersionPriority: 100, // CRDs should have relatively low priority }, }) From 3775a50cb809e4e32dd0310833840daa21c35590 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Fri, 22 Sep 2017 13:55:54 -0400 Subject: [PATCH 21/51] add --selector flag support --- hack/make-rules/test-cmd-util.sh | 39 ++++++++ pkg/kubectl/cmd/drain.go | 165 +++++++++++++++++++++---------- 2 files changed, 152 insertions(+), 52 deletions(-) diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index eca925cd2c9..031bed64575 100755 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -4177,6 +4177,38 @@ run_certificates_tests() { set +o errexit } +run_cluster_management_tests() { + set -o nounset + set -o errexit + + kube::log::status "Testing cluster-management commands" + + kube::test::get_object_assert nodes "{{range.items}}{{$id_field}}:{{end}}" '127.0.0.1:' + + ### kubectl drain command fails when both --selector and a node argument are given + # Pre-condition: node exists and contains label test=label + kubectl label node "127.0.0.1" "test=label" + kube::test::get_object_assert "nodes 127.0.0.1" '{{.metadata.labels.test}}' 'label' + response=$(! kubectl drain "127.0.0.1" --selector test=label 2>&1) + kube::test::if_has_string "${response}" 'cannot specify both a node name' + + ### kubectl cordon command fails when no arguments are passed + # Pre-condition: node exists + response=$(! kubectl cordon 2>&1) + kube::test::if_has_string "${response}" 'error\: USAGE\: cordon NODE' + + ### kubectl cordon selects all nodes with an empty --selector= + # Pre-condition: node "127.0.0.1" is uncordoned + kubectl uncordon "127.0.0.1" + response=$(kubectl cordon --selector=) + kube::test::if_has_string "${response}" 'node "127.0.0.1" cordoned' + # Post-condition: node "127.0.0.1" is cordoned + kube::test::get_object_assert "nodes 127.0.0.1" "{{.spec.unschedulable}}" 'true' + + set +o nounset + set +o errexit +} + run_plugins_tests() { set -o nounset set -o errexit @@ -4766,6 +4798,13 @@ runTests() { record_command run_certificates_tests fi + ###################### + # Cluster Management # + ###################### + if kube::test::if_supports_resource "${nodes}" ; then + record_command run_cluster_management_tests + fi + ########### # Plugins # ########### diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index 80128d86c3a..4eb70b6ff08 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -24,8 +24,6 @@ import ( "strings" "time" - "k8s.io/apimachinery/pkg/util/json" - "github.com/jonboulle/clockwork" "github.com/spf13/cobra" @@ -36,6 +34,8 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/json" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/wait" restclient "k8s.io/client-go/rest" @@ -60,8 +60,9 @@ type DrainOptions struct { Timeout time.Duration backOff clockwork.Clock DeleteLocalData bool + Selector string mapper meta.RESTMapper - nodeInfo *resource.Info + nodeInfos []*resource.Info Out io.Writer ErrOut io.Writer typer runtime.ObjectTyper @@ -111,6 +112,7 @@ func NewCmdCordon(f cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.CheckErr(options.RunCordonOrUncordon(true)) }, } + cmd.Flags().StringVarP(&options.Selector, "selector", "l", options.Selector, "Selector (label query) to filter on") return cmd } @@ -136,6 +138,7 @@ func NewCmdUncordon(f cmdutil.Factory, out io.Writer) *cobra.Command { cmdutil.CheckErr(options.RunCordonOrUncordon(false)) }, } + cmd.Flags().StringVarP(&options.Selector, "selector", "l", options.Selector, "Selector (label query) to filter on") return cmd } @@ -191,6 +194,7 @@ func NewCmdDrain(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { cmd.Flags().BoolVar(&options.DeleteLocalData, "delete-local-data", false, "Continue even if there are pods using emptyDir (local data that will be deleted when the node is drained).") cmd.Flags().IntVar(&options.GracePeriodSeconds, "grace-period", -1, "Period of time in seconds given to each pod to terminate gracefully. If negative, the default value specified in the pod will be used.") cmd.Flags().DurationVar(&options.Timeout, "timeout", 0, "The length of time to wait before giving up, zero means infinite") + cmd.Flags().StringVarP(&options.Selector, "selector", "l", options.Selector, "Selector (label query) to filter on") return cmd } @@ -198,8 +202,16 @@ func NewCmdDrain(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { // arguments and looks up the node using Builder func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { var err error - if len(args) != 1 { - return cmdutil.UsageErrorf(cmd, "USAGE: %s [flags]", cmd.Use) + o.Selector = cmdutil.GetFlagString(cmd, "selector") + + if len(args) == 0 && !cmd.Flags().Changed("selector") { + return cmdutil.UsageErrorf(cmd, fmt.Sprintf("USAGE: %s [flags]", cmd.Use)) + } + if len(args) > 0 && len(o.Selector) > 0 { + return cmdutil.UsageErrorf(cmd, "error: cannot specify both a node name and a --selector option") + } + if len(args) > 0 && len(args) != 1 { + return cmdutil.UsageErrorf(cmd, fmt.Sprintf("USAGE: %s [flags]", cmd.Use)) } if o.client, err = o.Factory.ClientSet(); err != nil { @@ -211,6 +223,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { return err } + o.nodeInfos = []*resource.Info{} o.mapper, o.typer = o.Factory.Object() cmdNamespace, _, err := o.Factory.DefaultNamespace() @@ -218,9 +231,19 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { return err } + nameArgs := []string{"nodes"} + if len(args) > 0 { + nameArgs = append(nameArgs, args[0]) + if strings.Contains(args[0], "/") { + nameArgs = []string{args[0]} + } + } + r := o.Factory.NewBuilder(). NamespaceParam(cmdNamespace).DefaultNamespace(). - ResourceNames("node", args[0]). + SelectorParam(o.Selector). + ResourceTypeOrNameArgs(true, nameArgs...). + Flatten(). Do() if err = r.Err(); err != nil { @@ -231,7 +254,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { if err != nil { return err } - o.nodeInfo = info + o.nodeInfos = append(o.nodeInfos, info) return nil }) } @@ -242,26 +265,51 @@ func (o *DrainOptions) RunDrain() error { return err } - err := o.deleteOrEvictPodsSimple() - if err == nil { - cmdutil.PrintSuccess(o.mapper, false, o.Out, "node", o.nodeInfo.Name, false, "drained") + drainedNodes := sets.NewString() + var fatal error + + for _, info := range o.nodeInfos { + err := o.deleteOrEvictPodsSimple(info) + if err == nil { + drainedNodes.Insert(info.Name) + cmdutil.PrintSuccess(o.mapper, false, o.Out, "node", info.Name, false, "drained") + } else { + fmt.Fprintf(o.ErrOut, "error: unable to drain node %q, aborting command...\n\n", info.Name) + remainingNodes := []string{} + fatal = err + for _, remainingInfo := range o.nodeInfos { + if drainedNodes.Has(remainingInfo.Name) { + continue + } + remainingNodes = append(remainingNodes, remainingInfo.Name) + } + + if len(remainingNodes) > 0 { + fmt.Fprintf(o.ErrOut, "There are pending nodes to be drained:\n") + for _, nodeName := range remainingNodes { + fmt.Fprintf(o.ErrOut, " %s\n", nodeName) + } + } + break + } } - return err + + return fatal } -func (o *DrainOptions) deleteOrEvictPodsSimple() error { - pods, err := o.getPodsForDeletion() +func (o *DrainOptions) deleteOrEvictPodsSimple(nodeInfo *resource.Info) error { + pods, err := o.getPodsForDeletion(nodeInfo) if err != nil { return err } err = o.deleteOrEvictPods(pods) if err != nil { - pendingPods, newErr := o.getPodsForDeletion() + pendingPods, newErr := o.getPodsForDeletion(nodeInfo) if newErr != nil { return newErr } - fmt.Fprintf(o.ErrOut, "There are pending pods when an error occurred: %v\n", err) + fmt.Fprintf(o.ErrOut, "There are pending pods in node %q when an error occurred: %v\n", nodeInfo.Name, err) for _, pendingPod := range pendingPods { fmt.Fprintf(o.ErrOut, "%s/%s\n", "pod", pendingPod.Name) } @@ -393,11 +441,11 @@ func (ps podStatuses) Message() string { return strings.Join(msgs, "; ") } -// getPodsForDeletion returns all the pods we're going to delete. If there are -// any pods preventing us from deleting, we return that list in an error. -func (o *DrainOptions) getPodsForDeletion() (pods []api.Pod, err error) { +// getPodsForDeletion receives resource info for a node, and returns all the pods from the given node that we +// are planning on deleting. If there are any pods preventing us from deleting, we return that list in an error. +func (o *DrainOptions) getPodsForDeletion(nodeInfo *resource.Info) (pods []api.Pod, err error) { podList, err := o.client.Core().Pods(metav1.NamespaceAll).List(metav1.ListOptions{ - FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": o.nodeInfo.Name}).String()}) + FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": nodeInfo.Name}).String()}) if err != nil { return pods, err } @@ -625,41 +673,54 @@ func (o *DrainOptions) RunCordonOrUncordon(desired bool) error { return err } - if o.nodeInfo.Mapping.GroupVersionKind.Kind == "Node" { - obj, err := o.nodeInfo.Mapping.ConvertToVersion(o.nodeInfo.Object, o.nodeInfo.Mapping.GroupVersionKind.GroupVersion()) - if err != nil { - return err - } - oldData, err := json.Marshal(obj) - if err != nil { - return err - } - node, ok := obj.(*corev1.Node) - if !ok { - return fmt.Errorf("unexpected Type%T, expected Node", obj) - } - unsched := node.Spec.Unschedulable - if unsched == desired { - cmdutil.PrintSuccess(o.mapper, false, o.Out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, false, already(desired)) + cordonOrUncordon := "cordon" + if !desired { + cordonOrUncordon = "un" + cordonOrUncordon + } + + for _, nodeInfo := range o.nodeInfos { + if nodeInfo.Mapping.GroupVersionKind.Kind == "Node" { + obj, err := nodeInfo.Mapping.ConvertToVersion(nodeInfo.Object, nodeInfo.Mapping.GroupVersionKind.GroupVersion()) + if err != nil { + fmt.Printf("error: unable to %s node %q: %v", cordonOrUncordon, nodeInfo.Name, err) + continue + } + oldData, err := json.Marshal(obj) + if err != nil { + fmt.Printf("error: unable to %s node %q: %v", cordonOrUncordon, nodeInfo.Name, err) + continue + } + node, ok := obj.(*corev1.Node) + if !ok { + fmt.Fprintf(o.ErrOut, "error: unable to %s node %q: unexpected Type%T, expected Node", cordonOrUncordon, nodeInfo.Name, obj) + continue + } + unsched := node.Spec.Unschedulable + if unsched == desired { + cmdutil.PrintSuccess(o.mapper, false, o.Out, nodeInfo.Mapping.Resource, nodeInfo.Name, false, already(desired)) + } else { + helper := resource.NewHelper(o.restClient, nodeInfo.Mapping) + node.Spec.Unschedulable = desired + newData, err := json.Marshal(obj) + if err != nil { + fmt.Fprintf(o.ErrOut, "error: unable to %s node %q: %v", cordonOrUncordon, nodeInfo.Name, err) + continue + } + patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, obj) + if err != nil { + fmt.Printf("error: unable to %s node %q: %v", cordonOrUncordon, nodeInfo.Name, err) + continue + } + _, err = helper.Patch(cmdNamespace, nodeInfo.Name, types.StrategicMergePatchType, patchBytes) + if err != nil { + fmt.Printf("error: unable to %s node %q: %v", cordonOrUncordon, nodeInfo.Name, err) + continue + } + cmdutil.PrintSuccess(o.mapper, false, o.Out, nodeInfo.Mapping.Resource, nodeInfo.Name, false, changed(desired)) + } } else { - helper := resource.NewHelper(o.restClient, o.nodeInfo.Mapping) - node.Spec.Unschedulable = desired - newData, err := json.Marshal(obj) - if err != nil { - return err - } - patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, obj) - if err != nil { - return err - } - _, err = helper.Patch(cmdNamespace, o.nodeInfo.Name, types.StrategicMergePatchType, patchBytes) - if err != nil { - return err - } - cmdutil.PrintSuccess(o.mapper, false, o.Out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, false, changed(desired)) + cmdutil.PrintSuccess(o.mapper, false, o.Out, nodeInfo.Mapping.Resource, nodeInfo.Name, false, "skipped") } - } else { - cmdutil.PrintSuccess(o.mapper, false, o.Out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, false, "skipped") } return nil From b73f4acdee16b2dda96b7aa01120953fce7dd897 Mon Sep 17 00:00:00 2001 From: Jiaying Zhang Date: Mon, 2 Oct 2017 09:33:26 -0700 Subject: [PATCH 22/51] Fixes test/e2e_node/gpu_device_plugin.go test failure. --- test/e2e_node/gpu_device_plugin.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/test/e2e_node/gpu_device_plugin.go b/test/e2e_node/gpu_device_plugin.go index 476c4ca5cc9..c8d9c89c392 100644 --- a/test/e2e_node/gpu_device_plugin.go +++ b/test/e2e_node/gpu_device_plugin.go @@ -18,6 +18,7 @@ package e2e_node import ( "os/exec" + "path/filepath" "regexp" "time" @@ -59,7 +60,7 @@ var _ = framework.KubeDescribe("NVIDIA GPU Device Plugin [Feature:GPUDevicePlugi By("Waiting for GPUs to become available on the local node") Eventually(func() bool { return framework.NumberOfNVIDIAGPUs(getLocalNode(f)) > 0 - }, 10*time.Second, time.Second).Should(BeTrue()) + }, 10*time.Second, framework.Poll).Should(BeTrue()) if framework.NumberOfNVIDIAGPUs(getLocalNode(f)) < 2 { Skip("Not enough GPUs to execute this test (at least two needed)") @@ -138,6 +139,9 @@ func newDecimalResourceList(name v1.ResourceName, quantity int64) v1.ResourceLis // TODO: Find a uniform way to deal with systemctl/initctl/service operations. #34494 func restartKubelet(f *framework.Framework) { + beforeSocks, err := filepath.Glob("/var/lib/kubelet/device-plugins/nvidiaGPU*.sock") + framework.ExpectNoError(err) + Expect(len(beforeSocks)).NotTo(BeZero()) stdout, err := exec.Command("sudo", "systemctl", "list-units", "kubelet*", "--state=running").CombinedOutput() framework.ExpectNoError(err) regex := regexp.MustCompile("(kubelet-[0-9]+)") @@ -146,19 +150,21 @@ func restartKubelet(f *framework.Framework) { kube := matches[0] framework.Logf("Get running kubelet with systemctl: %v, %v", string(stdout), kube) stdout, err = exec.Command("sudo", "systemctl", "restart", kube).CombinedOutput() - if err == nil { - return - } - framework.Failf("Failed to restart kubelet with systemctl: %v, %v", err, stdout) + framework.ExpectNoError(err, "Failed to restart kubelet with systemctl: %v, %v", err, stdout) + Eventually(func() ([]string, error) { + return filepath.Glob("/var/lib/kubelet/device-plugins/nvidiaGPU*.sock") + }, 5*time.Minute, framework.Poll).ShouldNot(ConsistOf(beforeSocks)) } func getDeviceId(f *framework.Framework, podName string, contName string, restartCount int32) string { // Wait till pod has been restarted at least restartCount times. Eventually(func() bool { p, err := f.PodClient().Get(podName, metav1.GetOptions{}) - framework.ExpectNoError(err) + if err != nil || len(p.Status.ContainerStatuses) < 1 { + return false + } return p.Status.ContainerStatuses[0].RestartCount >= restartCount - }, time.Minute, time.Second).Should(BeTrue()) + }, 5*time.Minute, framework.Poll).Should(BeTrue()) logs, err := framework.GetPodLogs(f.ClientSet, f.Namespace.Name, podName, contName) if err != nil { framework.Failf("GetPodLogs for pod %q failed: %v", podName, err) From 9de1d1f57736fd6e5c45f7c41398de31073181cc Mon Sep 17 00:00:00 2001 From: Mike Danese Date: Mon, 2 Oct 2017 18:11:25 -0700 Subject: [PATCH 23/51] stop assigning satnam reviews --- cluster/vagrant/OWNERS | 1 - pkg/cloudprovider/OWNERS | 1 - staging/src/k8s.io/apimachinery/pkg/api/errors/OWNERS | 1 - staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS | 1 - 4 files changed, 4 deletions(-) diff --git a/cluster/vagrant/OWNERS b/cluster/vagrant/OWNERS index f90049369f8..3be25134ef5 100644 --- a/cluster/vagrant/OWNERS +++ b/cluster/vagrant/OWNERS @@ -23,7 +23,6 @@ reviewers: - jbeda - madhusudancs - jayunit100 -- satnam6502 - cjcullen - david-mcmahon - mfojtik diff --git a/pkg/cloudprovider/OWNERS b/pkg/cloudprovider/OWNERS index 249a4a546b1..cac94e2b4b3 100644 --- a/pkg/cloudprovider/OWNERS +++ b/pkg/cloudprovider/OWNERS @@ -34,7 +34,6 @@ reviewers: - jszczepkowski - markturansky - girishkalele -- satnam6502 - jdef - freehan - jingxu97 diff --git a/staging/src/k8s.io/apimachinery/pkg/api/errors/OWNERS b/staging/src/k8s.io/apimachinery/pkg/api/errors/OWNERS index ff82254f831..af32c1fdf75 100755 --- a/staging/src/k8s.io/apimachinery/pkg/api/errors/OWNERS +++ b/staging/src/k8s.io/apimachinery/pkg/api/errors/OWNERS @@ -20,7 +20,6 @@ reviewers: - dims - hongchaodeng - krousey -- satnam6502 - cjcullen - david-mcmahon - goltermann diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS b/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS index e9de724aa6b..9d8627ad124 100755 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/OWNERS @@ -22,7 +22,6 @@ reviewers: - euank - markturansky - fgrzadkowski -- satnam6502 - fabioy - ingvagabund - david-mcmahon From fe92a554255070ee37429e69d0baf5c5870621f2 Mon Sep 17 00:00:00 2001 From: Di Xu Date: Thu, 28 Sep 2017 17:38:11 +0800 Subject: [PATCH 24/51] add timeout for Openstack cloud provider --- pkg/cloudprovider/providers/openstack/openstack.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index de13127cbb2..eb038dc34fe 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -52,6 +52,7 @@ import ( const ( ProviderName = "openstack" AvailabilityZone = "availability_zone" + defaultTimeOut = 60 * time.Second ) var ErrNotFound = errors.New("Failed to find object") @@ -101,7 +102,8 @@ type RouterOpts struct { } type MetadataOpts struct { - SearchOrder string `gcfg:"search-order"` + SearchOrder string `gcfg:"search-order"` + RequestTimeout MyDuration `gcfg:"request-timeout"` } // OpenStack is an implementation of cloud provider Interface for OpenStack. @@ -290,6 +292,12 @@ func newOpenStack(cfg Config) (*OpenStack, error) { return nil, err } + emptyDuration := MyDuration{} + if cfg.Metadata.RequestTimeout == emptyDuration { + cfg.Metadata.RequestTimeout.Duration = time.Duration(defaultTimeOut) + } + provider.HTTPClient.Timeout = cfg.Metadata.RequestTimeout.Duration + os := OpenStack{ provider: provider, region: cfg.Global.Region, From 8c25265314f69d2618ab90f8b588897f57a45e1d Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Sun, 1 Oct 2017 22:57:08 -0400 Subject: [PATCH 25/51] Change default --cert-dir for kubelet to a non-transient location --- cmd/kubeadm/app/preflight/checks.go | 2 -- cmd/kubelet/app/options/options.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/kubeadm/app/preflight/checks.go b/cmd/kubeadm/app/preflight/checks.go index 02ae6e12d73..7e48e5d59b3 100644 --- a/cmd/kubeadm/app/preflight/checks.go +++ b/cmd/kubeadm/app/preflight/checks.go @@ -650,7 +650,6 @@ func RunInitMasterChecks(cfg *kubeadmapi.MasterConfiguration) error { PortOpenCheck{port: 10252}, HTTPProxyCheck{Proto: "https", Host: cfg.API.AdvertiseAddress, Port: int(cfg.API.BindPort)}, DirAvailableCheck{Path: filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName)}, - DirAvailableCheck{Path: "/var/lib/kubelet"}, FileContentCheck{Path: bridgenf, Content: []byte{'1'}}, SwapCheck{}, InPathCheck{executable: "ip", mandatory: true}, @@ -711,7 +710,6 @@ func RunJoinNodeChecks(cfg *kubeadmapi.NodeConfiguration) error { ServiceCheck{Service: "docker", CheckIfActive: true}, PortOpenCheck{port: 10250}, DirAvailableCheck{Path: filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName)}, - DirAvailableCheck{Path: "/var/lib/kubelet"}, FileAvailableCheck{Path: cfg.CACertPath}, FileAvailableCheck{Path: filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.KubeletKubeConfigFileName)}, FileContentCheck{Path: bridgenf, Content: []byte{'1'}}, diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index 8d3074b815c..8c5f50e83b4 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -120,7 +120,7 @@ func NewKubeletFlags() *KubeletFlags { RequireKubeConfig: false, KubeConfig: flag.NewStringFlag("/var/lib/kubelet/kubeconfig"), ContainerRuntimeOptions: *NewContainerRuntimeOptions(), - CertDirectory: "/var/run/kubernetes", + CertDirectory: "/var/lib/kubelet/pki", RootDirectory: v1alpha1.DefaultRootDir, // DEPRECATED: auto detecting cloud providers goes against the initiative // for out-of-tree cloud providers as we'll now depend on cAdvisor integrations From 80fd010e834de6b6a1ba2d3218bb8633eb8f8294 Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Thu, 28 Sep 2017 15:39:17 -0700 Subject: [PATCH 26/51] Remove swagger 1.2 validation --- pkg/kubectl/cmd/apply.go | 2 +- pkg/kubectl/cmd/convert.go | 2 +- pkg/kubectl/cmd/create.go | 3 +- pkg/kubectl/cmd/replace.go | 4 +- pkg/kubectl/cmd/rollingupdate.go | 2 +- pkg/kubectl/cmd/testing/fake.go | 4 +- pkg/kubectl/cmd/util/editor/editoptions.go | 2 +- pkg/kubectl/cmd/util/factory.go | 2 +- .../cmd/util/factory_object_mapping.go | 51 +++++-------------- pkg/kubectl/cmd/util/helpers.go | 12 ----- 10 files changed, 23 insertions(+), 61 deletions(-) diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index 3a006880caa..9bbc45fc04e 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -188,7 +188,7 @@ func parsePruneResources(mapper meta.RESTMapper, gvks []string) ([]pruneResource } func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, options *ApplyOptions) error { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) + schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { return err } diff --git a/pkg/kubectl/cmd/convert.go b/pkg/kubectl/cmd/convert.go index c5c4afb74c7..58e3268ef53 100644 --- a/pkg/kubectl/cmd/convert.go +++ b/pkg/kubectl/cmd/convert.go @@ -128,7 +128,7 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C // build the builder o.builder = f.NewBuilder() if !o.local { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) + schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { return err } diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index 31eaa484f64..5ed32cb813f 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -115,7 +115,7 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt if options.EditBeforeCreate { return RunEditOnCreate(f, out, errOut, cmd, &options.FilenameOptions) } - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) + schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { return err } @@ -196,7 +196,6 @@ func RunEditOnCreate(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Comman FilenameOptions: *options, ValidateOptions: cmdutil.ValidateOptions{ EnableValidation: cmdutil.GetFlagBool(cmd, "validate"), - SchemaCacheDir: cmdutil.GetFlagString(cmd, "schema-cache-dir"), }, Output: cmdutil.GetFlagString(cmd, "output"), WindowsLineEndings: cmdutil.GetFlagBool(cmd, "windows-line-endings"), diff --git a/pkg/kubectl/cmd/replace.go b/pkg/kubectl/cmd/replace.go index 330971c56db..d6f5e26357c 100644 --- a/pkg/kubectl/cmd/replace.go +++ b/pkg/kubectl/cmd/replace.go @@ -92,7 +92,7 @@ func NewCmdReplace(f cmdutil.Factory, out io.Writer) *cobra.Command { } func RunReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, options *resource.FilenameOptions) error { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) + schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { return err } @@ -167,7 +167,7 @@ func RunReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str } func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string, shortOutput bool, options *resource.FilenameOptions) error { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) + schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { return err } diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index b8449042b59..3f6ac6d046b 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -194,7 +194,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args mapper, typer := f.Object() if len(filename) != 0 { - schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) + schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) if err != nil { return err } diff --git a/pkg/kubectl/cmd/testing/fake.go b/pkg/kubectl/cmd/testing/fake.go index 522cf5b3dac..cb46de93789 100644 --- a/pkg/kubectl/cmd/testing/fake.go +++ b/pkg/kubectl/cmd/testing/fake.go @@ -415,7 +415,7 @@ func (f *FakeFactory) ResolveImage(name string) (string, error) { return name, nil } -func (f *FakeFactory) Validator(validate bool, openapi bool, cacheDir string) (validation.Schema, error) { +func (f *FakeFactory) Validator(validate bool) (validation.Schema, error) { return f.tf.Validator, f.tf.Err } @@ -718,7 +718,7 @@ func (f *fakeAPIFactory) AttachablePodForObject(object runtime.Object, timeout t } } -func (f *fakeAPIFactory) Validator(validate bool, openapi bool, cacheDir string) (validation.Schema, error) { +func (f *fakeAPIFactory) Validator(validate bool) (validation.Schema, error) { return f.tf.Validator, f.tf.Err } diff --git a/pkg/kubectl/cmd/util/editor/editoptions.go b/pkg/kubectl/cmd/util/editor/editoptions.go index 96cd207f9bc..f125efa60bb 100644 --- a/pkg/kubectl/cmd/util/editor/editoptions.go +++ b/pkg/kubectl/cmd/util/editor/editoptions.go @@ -230,7 +230,7 @@ func (o *EditOptions) Run() error { glog.V(4).Infof("User edited:\n%s", string(edited)) // Apply validation - schema, err := o.f.Validator(o.EnableValidation, o.UseOpenAPI, o.SchemaCacheDir) + schema, err := o.f.Validator(o.EnableValidation) if err != nil { return preservedFile(err, file, o.ErrOut) } diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index eb25c5a00d1..032840b2cb8 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -233,7 +233,7 @@ type ObjectMappingFactory interface { AttachablePodForObject(object runtime.Object, timeout time.Duration) (*api.Pod, error) // Returns a schema that can validate objects stored on disk. - Validator(validate bool, openapi bool, cacheDir string) (validation.Schema, error) + Validator(validate bool) (validation.Schema, error) // SwaggerSchema returns the schema declaration for the provided group version kind. SwaggerSchema(schema.GroupVersionKind) (*swagger.ApiDeclaration, error) // OpenAPISchema returns the schema openapi schema definiton diff --git a/pkg/kubectl/cmd/util/factory_object_mapping.go b/pkg/kubectl/cmd/util/factory_object_mapping.go index 2b51808cf84..3686f73a505 100644 --- a/pkg/kubectl/cmd/util/factory_object_mapping.go +++ b/pkg/kubectl/cmd/util/factory_object_mapping.go @@ -22,13 +22,11 @@ import ( "errors" "fmt" "os" - "path" "sort" "sync" "time" swagger "github.com/emicklei/go-restful-swagger12" - "github.com/golang/glog" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" @@ -409,43 +407,20 @@ func (f *ring1Factory) AttachablePodForObject(object runtime.Object, timeout tim return pod, err } -func (f *ring1Factory) Validator(validate, openapi bool, cacheDir string) (validation.Schema, error) { - if validate { - if openapi { - resources, err := f.OpenAPISchema() - if err == nil { - return validation.ConjunctiveSchema{ - openapivalidation.NewSchemaValidation(resources), - validation.NoDoubleKeySchema{}, - }, nil - } - - glog.Warningf("Failed to download OpenAPI (%v), falling back to swagger", err) - } - - discovery, err := f.clientAccessFactory.DiscoveryClient() - if err != nil { - return nil, err - } - dir := cacheDir - if len(dir) > 0 { - version, err := discovery.ServerVersion() - if err == nil { - dir = path.Join(cacheDir, version.String()) - } else { - dir = "" // disable caching as a fallback - } - } - swaggerSchema := &clientSwaggerSchema{ - c: discovery.RESTClient(), - cacheDir: dir, - } - return validation.ConjunctiveSchema{ - swaggerSchema, - validation.NoDoubleKeySchema{}, - }, nil +func (f *ring1Factory) Validator(validate bool) (validation.Schema, error) { + if !validate { + return validation.NullSchema{}, nil } - return validation.NullSchema{}, nil + + resources, err := f.OpenAPISchema() + if err != nil { + return nil, err + } + + return validation.ConjunctiveSchema{ + openapivalidation.NewSchemaValidation(resources), + validation.NoDoubleKeySchema{}, + }, nil } func (f *ring1Factory) SwaggerSchema(gvk schema.GroupVersionKind) (*swagger.ApiDeclaration, error) { diff --git a/pkg/kubectl/cmd/util/helpers.go b/pkg/kubectl/cmd/util/helpers.go index 36aac301fba..02a76775950 100644 --- a/pkg/kubectl/cmd/util/helpers.go +++ b/pkg/kubectl/cmd/util/helpers.go @@ -395,20 +395,10 @@ func GetPodRunningTimeoutFlag(cmd *cobra.Command) (time.Duration, error) { func AddValidateFlags(cmd *cobra.Command) { cmd.Flags().Bool("validate", true, "If true, use a schema to validate the input before sending it") - cmd.Flags().String("schema-cache-dir", fmt.Sprintf("~/%s/%s", clientcmd.RecommendedHomeDir, clientcmd.RecommendedSchemaName), fmt.Sprintf("If non-empty, load/store cached API schemas in this directory, default is '$HOME/%s/%s'", clientcmd.RecommendedHomeDir, clientcmd.RecommendedSchemaName)) - cmd.Flags().Bool("openapi-validation", true, "If true, use openapi rather than swagger for validation.") - cmd.MarkFlagFilename("schema-cache-dir") } func AddValidateOptionFlags(cmd *cobra.Command, options *ValidateOptions) { cmd.Flags().BoolVar(&options.EnableValidation, "validate", true, "If true, use a schema to validate the input before sending it") - cmd.Flags().StringVar(&options.SchemaCacheDir, "schema-cache-dir", fmt.Sprintf("~/%s/%s", clientcmd.RecommendedHomeDir, clientcmd.RecommendedSchemaName), fmt.Sprintf("If non-empty, load/store cached API schemas in this directory, default is '$HOME/%s/%s'", clientcmd.RecommendedHomeDir, clientcmd.RecommendedSchemaName)) - cmd.Flags().BoolVar(&options.UseOpenAPI, "openapi-validation", true, "If true, use openapi rather than swagger for validation") - cmd.MarkFlagFilename("schema-cache-dir") -} - -func AddOpenAPIFlags(cmd *cobra.Command) { - cmd.Flags().Bool("openapi-validation", true, "If true, use openapi rather than swagger for validation") } func AddFilenameOptionFlags(cmd *cobra.Command, options *resource.FilenameOptions, usage string) { @@ -446,8 +436,6 @@ func AddGeneratorFlags(cmd *cobra.Command, defaultGenerator string) { type ValidateOptions struct { EnableValidation bool - UseOpenAPI bool - SchemaCacheDir string } func ReadConfigDataFromReader(reader io.Reader, source string) ([]byte, error) { From 019a15c30b961c2c5e3c2e0f94f7c639afcea8f9 Mon Sep 17 00:00:00 2001 From: Dane LeBlanc Date: Tue, 3 Oct 2017 11:19:50 -0400 Subject: [PATCH 27/51] Add IPv6 option for e2e iPerf test The e2e iPerf test case currently only runs in IPv4 mode. This change add an option to run an iPerf test in IPv6 mode (i.e. by running iPerf with a "-V" command line flag), so that the test can be run on IPv6-only clusters. --- test/e2e/network/networking_perf.go | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/test/e2e/network/networking_perf.go b/test/e2e/network/networking_perf.go index c826bafcab6..e8a7b608ecb 100644 --- a/test/e2e/network/networking_perf.go +++ b/test/e2e/network/networking_perf.go @@ -36,9 +36,8 @@ const ( smallClusterTimeout = 200 * time.Second ) -// Declared as Flakey since it has not been proven to run in parallel on small nodes or slow networks in CI -// TODO jayunit100 : Retag this test according to semantics from #22401 -var _ = SIGDescribe("Networking IPerf [Experimental] [Slow] [Feature:Networking-Performance]", func() { +// networkingIPerf test runs iperf on a container in either IPv4 or IPv6 mode. +func networkingIPerfTest(isIPv6 bool) { f := framework.NewDefaultFramework("network-perf") @@ -49,6 +48,11 @@ var _ = SIGDescribe("Networking IPerf [Experimental] [Slow] [Feature:Networking- numServer := 1 maxBandwidthBits := gceBandwidthBitsEstimate + familyStr := "" + if isIPv6 { + familyStr = "-V " + } + It(fmt.Sprintf("should transfer ~ 1GB onto the service endpoint %v servers (maximum of %v clients)", numServer, numClient), func() { nodes := framework.GetReadySchedulableNodesOrDie(f.ClientSet) totalPods := len(nodes.Items) @@ -68,7 +72,7 @@ var _ = SIGDescribe("Networking IPerf [Experimental] [Slow] [Feature:Networking- Args: []string{ "/bin/sh", "-c", - "/usr/local/bin/iperf -s -p 8001 ", + "/usr/local/bin/iperf " + familyStr + "-s -p 8001 ", }, Ports: []v1.ContainerPort{{ContainerPort: 8001}}, }}, @@ -96,7 +100,7 @@ var _ = SIGDescribe("Networking IPerf [Experimental] [Slow] [Feature:Networking- Args: []string{ "/bin/sh", "-c", - "/usr/local/bin/iperf -c service-for-" + appName + " -p 8002 --reportstyle C && sleep 5", + "/usr/local/bin/iperf " + familyStr + "-c service-for-" + appName + " -p 8002 --reportstyle C && sleep 5", }, }, }, @@ -153,4 +157,16 @@ var _ = SIGDescribe("Networking IPerf [Experimental] [Slow] [Feature:Networking- framework.Logf("%v had bandwidth %v. Ratio to expected (%v) was %f", ipClient, bandwidth, expectedBandwidth, float64(bandwidth)/float64(expectedBandwidth)) } }) +} + +// Declared as Flakey since it has not been proven to run in parallel on small nodes or slow networks in CI +// TODO jayunit100 : Retag this test according to semantics from #22401 +var _ = SIGDescribe("Networking IPerf IPv4 [Experimental] [Feature:Networking-IPv4] [Slow] [Feature:Networking-Performance]", func() { + networkingIPerfTest(false) +}) + +// Declared as Flakey since it has not been proven to run in parallel on small nodes or slow networks in CI +// TODO jayunit100 : Retag this test according to semantics from #22401 +var _ = SIGDescribe("Networking IPerf IPv6 [Experimental] [Feature:Networking-IPv6] [Slow] [Feature:Networking-Performance]", func() { + networkingIPerfTest(true) }) From 6b1f1d14148fe3962594d8f4c9ca15d1c6171819 Mon Sep 17 00:00:00 2001 From: p0lyn0mial Date: Tue, 3 Oct 2017 18:08:30 +0200 Subject: [PATCH 28/51] removes Authorizer and ExternalClientSet from kubeapiserver's admission initializer. --- cmd/kube-apiserver/app/server.go | 17 +++------ .../cmd/federation-apiserver/app/server.go | 15 +++----- pkg/kubeapiserver/admission/BUILD | 7 +--- pkg/kubeapiserver/admission/init_test.go | 38 +------------------ pkg/kubeapiserver/admission/initializer.go | 13 ------- plugin/pkg/admission/gc/BUILD | 1 + plugin/pkg/admission/gc/gc_admission_test.go | 28 +++++++++++--- .../admission/limitranger/admission_test.go | 2 +- .../namespace/autoprovision/admission_test.go | 2 +- .../namespace/exists/admission_test.go | 2 +- .../podnodeselector/admission_test.go | 2 +- .../admission_test.go | 2 +- .../src/k8s.io/apiserver/pkg/server/config.go | 5 +++ .../apiserver/pkg/server/options/admission.go | 5 ++- .../apiserver/pkg/server/options/coreapi.go | 1 + .../sample-apiserver/pkg/cmd/server/start.go | 2 +- 16 files changed, 52 insertions(+), 90 deletions(-) diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index fb4e3d0cb55..5f6c634aeec 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -57,7 +57,6 @@ import ( "k8s.io/apiserver/pkg/storage/etcd3/preflight" clientgoinformers "k8s.io/client-go/informers" clientgoclientset "k8s.io/client-go/kubernetes" - clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/cmd/kube-apiserver/app/options" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" @@ -417,13 +416,10 @@ func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transp // TODO: get rid of KUBE_API_VERSIONS or define sane behaviour if set glog.Errorf("Failed to create clientset with KUBE_API_VERSIONS=%q. KUBE_API_VERSIONS is only for testing. Things will break.", kubeAPIVersions) } - externalClient, err := clientset.NewForConfig(genericConfig.LoopbackClientConfig) - if err != nil { - return nil, nil, nil, nil, nil, fmt.Errorf("failed to create external clientset: %v", err) - } - sharedInformers := informers.NewSharedInformerFactory(client, 10*time.Minute) - clientgoExternalClient, err := clientgoclientset.NewForConfig(genericConfig.LoopbackClientConfig) + kubeClientConfig := genericConfig.LoopbackClientConfig + sharedInformers := informers.NewSharedInformerFactory(client, 10*time.Minute) + clientgoExternalClient, err := clientgoclientset.NewForConfig(kubeClientConfig) if err != nil { return nil, nil, nil, nil, nil, fmt.Errorf("failed to create real external clientset: %v", err) } @@ -457,9 +453,7 @@ func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transp pluginInitializer, err := BuildAdmissionPluginInitializer( s, client, - externalClient, sharedInformers, - genericConfig.Authorizer, serviceResolver, proxyTransport, ) @@ -489,6 +483,7 @@ func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transp versionedInformers, certBytes, keyBytes, + kubeClientConfig, pluginInitializer) if err != nil { return nil, nil, nil, nil, nil, fmt.Errorf("failed to initialize admission: %v", err) @@ -497,7 +492,7 @@ func BuildGenericConfig(s *options.ServerRunOptions, proxyTransport *http.Transp } // BuildAdmissionPluginInitializer constructs the admission plugin initializer -func BuildAdmissionPluginInitializer(s *options.ServerRunOptions, client internalclientset.Interface, externalClient clientset.Interface, sharedInformers informers.SharedInformerFactory, apiAuthorizer authorizer.Authorizer, serviceResolver aggregatorapiserver.ServiceResolver, proxyTransport *http.Transport) (admission.PluginInitializer, error) { +func BuildAdmissionPluginInitializer(s *options.ServerRunOptions, client internalclientset.Interface, sharedInformers informers.SharedInformerFactory, serviceResolver aggregatorapiserver.ServiceResolver, proxyTransport *http.Transport) (admission.PluginInitializer, error) { var cloudConfig []byte if s.CloudProvider.CloudConfigFile != "" { @@ -515,7 +510,7 @@ func BuildAdmissionPluginInitializer(s *options.ServerRunOptions, client interna // do not require us to open watches for all items tracked by quota. quotaRegistry := quotainstall.NewRegistry(nil, nil) - pluginInitializer := kubeapiserveradmission.NewPluginInitializer(client, externalClient, sharedInformers, apiAuthorizer, cloudConfig, restMapper, quotaRegistry) + pluginInitializer := kubeapiserveradmission.NewPluginInitializer(client, sharedInformers, cloudConfig, restMapper, quotaRegistry) pluginInitializer = pluginInitializer.SetServiceResolver(serviceResolver) pluginInitializer = pluginInitializer.SetProxyTransport(proxyTransport) diff --git a/federation/cmd/federation-apiserver/app/server.go b/federation/cmd/federation-apiserver/app/server.go index b8ffbc4aff4..3baaa71a7e0 100644 --- a/federation/cmd/federation-apiserver/app/server.go +++ b/federation/cmd/federation-apiserver/app/server.go @@ -42,7 +42,6 @@ import ( serverstorage "k8s.io/apiserver/pkg/server/storage" clientgoinformers "k8s.io/client-go/informers" clientgoclientset "k8s.io/client-go/kubernetes" - clientset "k8s.io/client-go/kubernetes" openapicommon "k8s.io/kube-openapi/pkg/common" federationv1beta1 "k8s.io/kubernetes/federation/apis/federation/v1beta1" "k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options" @@ -181,17 +180,14 @@ func NonBlockingRun(s *options.ServerRunOptions, stopCh <-chan struct{}) error { return fmt.Errorf("invalid Authentication Config: %v", err) } - client, err := internalclientset.NewForConfig(genericConfig.LoopbackClientConfig) + kubeClientConfig := genericConfig.LoopbackClientConfig + client, err := internalclientset.NewForConfig(kubeClientConfig) if err != nil { return fmt.Errorf("failed to create clientset: %v", err) } - externalClient, err := clientset.NewForConfig(genericConfig.LoopbackClientConfig) - if err != nil { - return fmt.Errorf("failed to create external clientset: %v", err) - } - sharedInformers := informers.NewSharedInformerFactory(client, 10*time.Minute) - clientgoExternalClient, err := clientgoclientset.NewForConfig(genericConfig.LoopbackClientConfig) + sharedInformers := informers.NewSharedInformerFactory(client, 10*time.Minute) + clientgoExternalClient, err := clientgoclientset.NewForConfig(kubeClientConfig) if err != nil { return fmt.Errorf("failed to create real external clientset: %v", err) } @@ -214,13 +210,14 @@ func NonBlockingRun(s *options.ServerRunOptions, stopCh <-chan struct{}) error { // NOTE: we do not provide informers to the quota registry because admission level decisions // do not require us to open watches for all items tracked by quota. quotaRegistry := quotainstall.NewRegistry(nil, nil) - pluginInitializer := kubeapiserveradmission.NewPluginInitializer(client, externalClient, sharedInformers, apiAuthorizer, cloudConfig, nil, quotaRegistry) + pluginInitializer := kubeapiserveradmission.NewPluginInitializer(client, sharedInformers, cloudConfig, nil, quotaRegistry) err = s.Admission.ApplyTo( genericConfig, versionedInformers, nil, nil, + kubeClientConfig, pluginInitializer, ) if err != nil { diff --git a/pkg/kubeapiserver/admission/BUILD b/pkg/kubeapiserver/admission/BUILD index ae4b077170d..5de49b24ade 100644 --- a/pkg/kubeapiserver/admission/BUILD +++ b/pkg/kubeapiserver/admission/BUILD @@ -10,11 +10,7 @@ go_test( name = "go_default_test", srcs = ["init_test.go"], library = ":go_default_library", - deps = [ - "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - ], + deps = ["//vendor/k8s.io/apiserver/pkg/admission:go_default_library"], ) go_library( @@ -26,7 +22,6 @@ go_library( "//pkg/quota:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/apiserver/pkg/admission/initializer:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], diff --git a/pkg/kubeapiserver/admission/init_test.go b/pkg/kubeapiserver/admission/init_test.go index be25c86ebf9..80152a291bc 100644 --- a/pkg/kubeapiserver/admission/init_test.go +++ b/pkg/kubeapiserver/admission/init_test.go @@ -21,50 +21,14 @@ import ( "testing" "k8s.io/apiserver/pkg/admission" - genericadmissioninit "k8s.io/apiserver/pkg/admission/initializer" - "k8s.io/apiserver/pkg/authorization/authorizer" ) -// TestAuthorizer is a testing struct for testing that fulfills the authorizer interface. -type TestAuthorizer struct{} - -func (t *TestAuthorizer) Authorize(a authorizer.Attributes) (authorized bool, reason string, err error) { - return false, "", nil -} - -var _ authorizer.Authorizer = &TestAuthorizer{} - type doNothingAdmission struct{} func (doNothingAdmission) Admit(a admission.Attributes) error { return nil } func (doNothingAdmission) Handles(o admission.Operation) bool { return false } func (doNothingAdmission) Validate() error { return nil } -// WantAuthorizerAdmission is a testing struct that fulfills the WantsAuthorizer -// interface. -type WantAuthorizerAdmission struct { - doNothingAdmission - auth authorizer.Authorizer -} - -func (self *WantAuthorizerAdmission) SetAuthorizer(a authorizer.Authorizer) { - self.auth = a -} - -var _ admission.Interface = &WantAuthorizerAdmission{} -var _ genericadmissioninit.WantsAuthorizer = &WantAuthorizerAdmission{} - -// TestWantsAuthorizer ensures that the authorizer is injected when the WantsAuthorizer -// interface is implemented. -func TestWantsAuthorizer(t *testing.T) { - initializer := NewPluginInitializer(nil, nil, nil, &TestAuthorizer{}, nil, nil, nil) - wantAuthorizerAdmission := &WantAuthorizerAdmission{} - initializer.Initialize(wantAuthorizerAdmission) - if wantAuthorizerAdmission.auth == nil { - t.Errorf("expected authorizer to be initialized but found nil") - } -} - type WantsCloudConfigAdmissionPlugin struct { doNothingAdmission cloudConfig []byte @@ -76,7 +40,7 @@ func (self *WantsCloudConfigAdmissionPlugin) SetCloudConfig(cloudConfig []byte) func TestCloudConfigAdmissionPlugin(t *testing.T) { cloudConfig := []byte("cloud-configuration") - initializer := NewPluginInitializer(nil, nil, nil, &TestAuthorizer{}, cloudConfig, nil, nil) + initializer := NewPluginInitializer(nil, nil, cloudConfig, nil, nil) wantsCloudConfigAdmission := &WantsCloudConfigAdmissionPlugin{} initializer.Initialize(wantsCloudConfigAdmission) diff --git a/pkg/kubeapiserver/admission/initializer.go b/pkg/kubeapiserver/admission/initializer.go index daf6e41f77d..d90e9bc63b3 100644 --- a/pkg/kubeapiserver/admission/initializer.go +++ b/pkg/kubeapiserver/admission/initializer.go @@ -22,7 +22,6 @@ import ( "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apiserver/pkg/admission" - admissioninit "k8s.io/apiserver/pkg/admission/initializer" "k8s.io/apiserver/pkg/authorization/authorizer" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" @@ -99,18 +98,14 @@ var _ admission.PluginInitializer = &PluginInitializer{} // all public, this construction method is pointless boilerplate. func NewPluginInitializer( internalClient internalclientset.Interface, - externalClient clientset.Interface, sharedInformers informers.SharedInformerFactory, - authz authorizer.Authorizer, cloudConfig []byte, restMapper meta.RESTMapper, quotaRegistry quota.Registry, ) *PluginInitializer { return &PluginInitializer{ internalClient: internalClient, - externalClient: externalClient, informers: sharedInformers, - authorizer: authz, cloudConfig: cloudConfig, restMapper: restMapper, quotaRegistry: quotaRegistry, @@ -136,18 +131,10 @@ func (i *PluginInitializer) Initialize(plugin admission.Interface) { wants.SetInternalKubeClientSet(i.internalClient) } - if wants, ok := plugin.(admissioninit.WantsExternalKubeClientSet); ok { - wants.SetExternalKubeClientSet(i.externalClient) - } - if wants, ok := plugin.(WantsInternalKubeInformerFactory); ok { wants.SetInternalKubeInformerFactory(i.informers) } - if wants, ok := plugin.(admissioninit.WantsAuthorizer); ok { - wants.SetAuthorizer(i.authorizer) - } - if wants, ok := plugin.(WantsCloudConfig); ok { wants.SetCloudConfig(i.cloudConfig) } diff --git a/plugin/pkg/admission/gc/BUILD b/plugin/pkg/admission/gc/BUILD index d4adb0f97a4..1240cf4a046 100644 --- a/plugin/pkg/admission/gc/BUILD +++ b/plugin/pkg/admission/gc/BUILD @@ -32,6 +32,7 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", + "//vendor/k8s.io/apiserver/pkg/admission/initializer:go_default_library", "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", ], diff --git a/plugin/pkg/admission/gc/gc_admission_test.go b/plugin/pkg/admission/gc/gc_admission_test.go index 691be3da3b6..30a25f89b69 100644 --- a/plugin/pkg/admission/gc/gc_admission_test.go +++ b/plugin/pkg/admission/gc/gc_admission_test.go @@ -24,6 +24,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/admission/initializer" "k8s.io/apiserver/pkg/authentication/user" "k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/kubernetes/pkg/api" @@ -69,7 +70,7 @@ func (fakeAuthorizer) Authorize(a authorizer.Attributes) (bool, string, error) { } // newGCPermissionsEnforcement returns the admission controller configured for testing. -func newGCPermissionsEnforcement() *gcPermissionsEnforcement { +func newGCPermissionsEnforcement() (*gcPermissionsEnforcement, error) { // the pods/status endpoint is ignored by this plugin since old kubelets // corrupt them. the pod status strategy ensures status updates cannot mutate // ownerRef. @@ -83,9 +84,18 @@ func newGCPermissionsEnforcement() *gcPermissionsEnforcement { Handler: admission.NewHandler(admission.Create, admission.Update), whiteList: whiteList, } - pluginInitializer := kubeadmission.NewPluginInitializer(nil, nil, nil, fakeAuthorizer{}, nil, api.Registry.RESTMapper(), nil) - pluginInitializer.Initialize(gcAdmit) - return gcAdmit + + genericPluginInitializer, err := initializer.New(nil, nil, fakeAuthorizer{}, nil, nil) + if err != nil { + return nil, err + } + pluginInitializer := kubeadmission.NewPluginInitializer(nil, nil, nil, api.Registry.RESTMapper(), nil) + initializersChain := admission.PluginInitializers{} + initializersChain = append(initializersChain, genericPluginInitializer) + initializersChain = append(initializersChain, pluginInitializer) + + initializersChain.Initialize(gcAdmit) + return gcAdmit, nil } func TestGCAdmission(t *testing.T) { @@ -245,7 +255,10 @@ func TestGCAdmission(t *testing.T) { checkError: expectNoError, }, } - gcAdmit := newGCPermissionsEnforcement() + gcAdmit, err := newGCPermissionsEnforcement() + if err != nil { + t.Error(err) + } for _, tc := range tests { operation := admission.Create @@ -490,7 +503,10 @@ func TestBlockOwnerDeletionAdmission(t *testing.T) { checkError: expectNoError, }, } - gcAdmit := newGCPermissionsEnforcement() + gcAdmit, err := newGCPermissionsEnforcement() + if err != nil { + t.Error(err) + } for _, tc := range tests { operation := admission.Create diff --git a/plugin/pkg/admission/limitranger/admission_test.go b/plugin/pkg/admission/limitranger/admission_test.go index 1b3f4ba0bda..f6fd2c9259a 100644 --- a/plugin/pkg/admission/limitranger/admission_test.go +++ b/plugin/pkg/admission/limitranger/admission_test.go @@ -744,7 +744,7 @@ func newHandlerForTest(c clientset.Interface) (admission.Interface, informers.Sh if err != nil { return nil, f, err } - pluginInitializer := kubeadmission.NewPluginInitializer(c, nil, f, nil, nil, nil, nil) + pluginInitializer := kubeadmission.NewPluginInitializer(c, f, nil, nil, nil) pluginInitializer.Initialize(handler) err = admission.Validate(handler) return handler, f, err diff --git a/plugin/pkg/admission/namespace/autoprovision/admission_test.go b/plugin/pkg/admission/namespace/autoprovision/admission_test.go index b4e7227433e..f7429d02531 100644 --- a/plugin/pkg/admission/namespace/autoprovision/admission_test.go +++ b/plugin/pkg/admission/namespace/autoprovision/admission_test.go @@ -38,7 +38,7 @@ import ( func newHandlerForTest(c clientset.Interface) (admission.Interface, informers.SharedInformerFactory, error) { f := informers.NewSharedInformerFactory(c, 5*time.Minute) handler := NewProvision() - pluginInitializer := kubeadmission.NewPluginInitializer(c, nil, f, nil, nil, nil, nil) + pluginInitializer := kubeadmission.NewPluginInitializer(c, f, nil, nil, nil) pluginInitializer.Initialize(handler) err := admission.Validate(handler) return handler, f, err diff --git a/plugin/pkg/admission/namespace/exists/admission_test.go b/plugin/pkg/admission/namespace/exists/admission_test.go index 00bdd805f63..79f23bb3db2 100644 --- a/plugin/pkg/admission/namespace/exists/admission_test.go +++ b/plugin/pkg/admission/namespace/exists/admission_test.go @@ -37,7 +37,7 @@ import ( func newHandlerForTest(c clientset.Interface) (admission.Interface, informers.SharedInformerFactory, error) { f := informers.NewSharedInformerFactory(c, 5*time.Minute) handler := NewExists() - pluginInitializer := kubeadmission.NewPluginInitializer(c, nil, f, nil, nil, nil, nil) + pluginInitializer := kubeadmission.NewPluginInitializer(c, f, nil, nil, nil) pluginInitializer.Initialize(handler) err := admission.Validate(handler) return handler, f, err diff --git a/plugin/pkg/admission/podnodeselector/admission_test.go b/plugin/pkg/admission/podnodeselector/admission_test.go index 0075468a89a..09c6779b96e 100644 --- a/plugin/pkg/admission/podnodeselector/admission_test.go +++ b/plugin/pkg/admission/podnodeselector/admission_test.go @@ -241,7 +241,7 @@ func TestIgnoreUpdatingInitializedPod(t *testing.T) { func newHandlerForTest(c clientset.Interface) (*podNodeSelector, informers.SharedInformerFactory, error) { f := informers.NewSharedInformerFactory(c, 5*time.Minute) handler := NewPodNodeSelector(nil) - pluginInitializer := kubeadmission.NewPluginInitializer(c, nil, f, nil, nil, nil, nil) + pluginInitializer := kubeadmission.NewPluginInitializer(c, f, nil, nil, nil) pluginInitializer.Initialize(handler) err := admission.Validate(handler) return handler, f, err diff --git a/plugin/pkg/admission/podtolerationrestriction/admission_test.go b/plugin/pkg/admission/podtolerationrestriction/admission_test.go index 4673aa0692c..d95dd5d374f 100644 --- a/plugin/pkg/admission/podtolerationrestriction/admission_test.go +++ b/plugin/pkg/admission/podtolerationrestriction/admission_test.go @@ -342,7 +342,7 @@ func newHandlerForTest(c clientset.Interface) (*podTolerationsPlugin, informers. return nil, nil, err } handler := NewPodTolerationsPlugin(pluginConfig) - pluginInitializer := kubeadmission.NewPluginInitializer(c, nil, f, nil, nil, nil, nil) + pluginInitializer := kubeadmission.NewPluginInitializer(c, f, nil, nil, nil) pluginInitializer.Initialize(handler) err = admission.Validate(handler) return handler, f, err diff --git a/staging/src/k8s.io/apiserver/pkg/server/config.go b/staging/src/k8s.io/apiserver/pkg/server/config.go index 69c0e4497eb..9ededc43110 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config.go @@ -192,6 +192,11 @@ type RecommendedConfig struct { // RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo. It uses an in-cluster client config // by default, or the kubeconfig given with kubeconfig command line flag. SharedInformerFactory informers.SharedInformerFactory + + // ClientConfig holds the kubernetes client configuration. + // This value is set by RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo. + // By default in-cluster client config is used. + ClientConfig *restclient.Config } type SecureServingInfo struct { diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go index bbfd2f7332c..5b3e3ab3f40 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go @@ -27,6 +27,7 @@ import ( "k8s.io/apiserver/pkg/server" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" ) // AdmissionOptions holds the admission options @@ -72,13 +73,13 @@ func (a *AdmissionOptions) AddFlags(fs *pflag.FlagSet) { // In case admission plugin names were not provided by a custer-admin they will be prepared from the recommended/default values. // In addition the method lazily initializes a generic plugin that is appended to the list of pluginInitializers // note this method uses: -// genericconfig.LoopbackClientConfig // genericconfig.Authorizer func (a *AdmissionOptions) ApplyTo( c *server.Config, informers informers.SharedInformerFactory, serverIdentifyingClientCert []byte, serverIdentifyingClientKey []byte, + clientConfig *rest.Config, pluginInitializers ...admission.PluginInitializer, ) error { pluginNames := a.PluginNames @@ -91,7 +92,7 @@ func (a *AdmissionOptions) ApplyTo( return fmt.Errorf("failed to read plugin config: %v", err) } - clientset, err := kubernetes.NewForConfig(c.LoopbackClientConfig) + clientset, err := kubernetes.NewForConfig(clientConfig) if err != nil { return err } diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/coreapi.go b/staging/src/k8s.io/apiserver/pkg/server/options/coreapi.go index edcf3a7b058..d46dece4a78 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/coreapi.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/coreapi.go @@ -73,6 +73,7 @@ func (o *CoreAPIOptions) ApplyTo(config *server.RecommendedConfig) error { if err != nil { return fmt.Errorf("failed to create Kubernetes clientset: %v", err) } + config.ClientConfig = kubeconfig config.SharedInformerFactory = clientgoinformers.NewSharedInformerFactory(clientgoExternalClient, 10*time.Minute) return nil diff --git a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go index c2381e511cc..bd194cde9d1 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go @@ -119,7 +119,7 @@ func (o WardleServerOptions) Config() (*apiserver.Config, error) { return nil, err } - if err := o.Admission.ApplyTo(&serverConfig.Config, serverConfig.SharedInformerFactory, nil, nil, admissionInitializer); err != nil { + if err := o.Admission.ApplyTo(&serverConfig.Config, serverConfig.SharedInformerFactory, nil, nil, serverConfig.ClientConfig, admissionInitializer); err != nil { return nil, err } From 249caa95b500c90d1b095b46ba400d73d8dac61b Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Sun, 24 Sep 2017 20:40:33 -0700 Subject: [PATCH 29/51] Rewrite `kubectl explain` to use openapi This removes all dependencies on swagger 1.2 for explain. --- pkg/kubectl/BUILD | 4 +- pkg/kubectl/cmd/BUILD | 1 + pkg/kubectl/cmd/explain.go | 16 +- pkg/kubectl/cmd/util/openapi/openapi.go | 21 ++ pkg/kubectl/explain.go | 251 ------------------ pkg/kubectl/explain/BUILD | 34 +++ pkg/kubectl/explain/explain.go | 64 +++++ pkg/kubectl/explain/field_lookup.go | 107 ++++++++ pkg/kubectl/explain/fields_printer.go | 84 ++++++ pkg/kubectl/explain/fields_printer_builder.go | 36 +++ pkg/kubectl/explain/formatter.go | 120 +++++++++ pkg/kubectl/explain/model_printer.go | 129 +++++++++ .../explain/recursive_fields_printer.go | 77 ++++++ pkg/kubectl/explain/typename.go | 66 +++++ 14 files changed, 751 insertions(+), 259 deletions(-) delete mode 100644 pkg/kubectl/explain.go create mode 100644 pkg/kubectl/explain/BUILD create mode 100644 pkg/kubectl/explain/explain.go create mode 100644 pkg/kubectl/explain/field_lookup.go create mode 100644 pkg/kubectl/explain/fields_printer.go create mode 100644 pkg/kubectl/explain/fields_printer_builder.go create mode 100644 pkg/kubectl/explain/formatter.go create mode 100644 pkg/kubectl/explain/model_printer.go create mode 100644 pkg/kubectl/explain/recursive_fields_printer.go create mode 100644 pkg/kubectl/explain/typename.go diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index 5a846e5f788..e80fb2a593d 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -91,7 +91,6 @@ go_library( "deployment.go", "doc.go", "env_file.go", - "explain.go", "generate.go", "history.go", "interfaces.go", @@ -118,7 +117,6 @@ go_library( deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//pkg/api:go_default_library", - "//pkg/api/util:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/api/v1/pod:go_default_library", "//pkg/apis/apps:go_default_library", @@ -142,7 +140,6 @@ go_library( "//pkg/kubectl/util/slice:go_default_library", "//pkg/printers:go_default_library", "//pkg/printers/internalversion:go_default_library", - "//vendor/github.com/emicklei/go-restful-swagger12:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", @@ -196,6 +193,7 @@ filegroup( ":package-srcs", "//pkg/kubectl/apps:all-srcs", "//pkg/kubectl/cmd:all-srcs", + "//pkg/kubectl/explain:all-srcs", "//pkg/kubectl/metricsutil:all-srcs", "//pkg/kubectl/plugins:all-srcs", "//pkg/kubectl/proxy:all-srcs", diff --git a/pkg/kubectl/cmd/BUILD b/pkg/kubectl/cmd/BUILD index 3f60d639fc7..10477403998 100644 --- a/pkg/kubectl/cmd/BUILD +++ b/pkg/kubectl/cmd/BUILD @@ -84,6 +84,7 @@ go_library( "//pkg/kubectl/cmd/util:go_default_library", "//pkg/kubectl/cmd/util/editor:go_default_library", "//pkg/kubectl/cmd/util/openapi:go_default_library", + "//pkg/kubectl/explain:go_default_library", "//pkg/kubectl/metricsutil:go_default_library", "//pkg/kubectl/plugins:go_default_library", "//pkg/kubectl/proxy:go_default_library", diff --git a/pkg/kubectl/cmd/explain.go b/pkg/kubectl/cmd/explain.go index 5f10c14a5b5..55d095690b5 100644 --- a/pkg/kubectl/cmd/explain.go +++ b/pkg/kubectl/cmd/explain.go @@ -24,9 +24,9 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/explain" "k8s.io/kubernetes/pkg/kubectl/util/i18n" ) @@ -80,7 +80,7 @@ func RunExplain(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, ar // TODO: After we figured out the new syntax to separate group and resource, allow // the users to use it in explain (kubectl explain ). // Refer to issue #16039 for why we do this. Refer to PR #15808 that used "/" syntax. - inModel, fieldsPath, err := kubectl.SplitAndParseResourceRequest(args[0], mapper) + inModel, fieldsPath, err := explain.SplitAndParseResourceRequest(args[0], mapper) if err != nil { return err } @@ -108,14 +108,20 @@ func RunExplain(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, ar } else { apiVersion, err = schema.ParseGroupVersion(apiVersionString) if err != nil { - return nil + return err } } + gvk = apiVersion.WithKind(gvk.Kind) - schema, err := f.SwaggerSchema(apiVersion.WithKind(gvk.Kind)) + resources, err := f.OpenAPISchema() if err != nil { return err } - return kubectl.PrintModelDescription(inModel, fieldsPath, out, schema, recursive) + schema := resources.LookupResource(gvk) + if schema == nil { + return fmt.Errorf("Couldn't find resource for %q", gvk) + } + + return explain.PrintModelDescription(fieldsPath, out, schema, recursive) } diff --git a/pkg/kubectl/cmd/util/openapi/openapi.go b/pkg/kubectl/cmd/util/openapi/openapi.go index 8e6cf0639f4..bc479f66b52 100644 --- a/pkg/kubectl/cmd/util/openapi/openapi.go +++ b/pkg/kubectl/cmd/util/openapi/openapi.go @@ -18,6 +18,7 @@ package openapi import ( "fmt" + "sort" "strings" "k8s.io/apimachinery/pkg/runtime/schema" @@ -181,6 +182,26 @@ func (k *Kind) GetName() string { return fmt.Sprintf("Kind(%v)", properties) } +// IsRequired returns true if `field` is a required field for this type. +func (k *Kind) IsRequired(field string) bool { + for _, f := range k.RequiredFields { + if f == field { + return true + } + } + return false +} + +// Keys returns a alphabetically sorted list of keys. +func (k *Kind) Keys() []string { + keys := make([]string, 0) + for key := range k.Fields { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} + // Map is an object who values must all be of the same `SubType`. // The key of the object is always of type `string`. type Map struct { diff --git a/pkg/kubectl/explain.go b/pkg/kubectl/explain.go deleted file mode 100644 index 06190ab9ecd..00000000000 --- a/pkg/kubectl/explain.go +++ /dev/null @@ -1,251 +0,0 @@ -/* -Copyright 2014 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 kubectl - -import ( - "fmt" - "io" - "strings" - - "github.com/emicklei/go-restful-swagger12" - - "k8s.io/apimachinery/pkg/api/meta" - apiutil "k8s.io/kubernetes/pkg/api/util" -) - -var allModels = make(map[string]*swagger.NamedModel) - -// SplitAndParseResourceRequest separates the users input into a model and fields -func SplitAndParseResourceRequest(inResource string, mapper meta.RESTMapper) (string, []string, error) { - inResource, fieldsPath := splitDotNotation(inResource) - inResource, _ = mapper.ResourceSingularizer(inResource) - return inResource, fieldsPath, nil -} - -// PrintModelDescription prints the description of a specific model or dot path. -// If recursive, all components nested within the fields of the schema will be -// printed. -func PrintModelDescription(inModel string, fieldsPath []string, w io.Writer, swaggerSchema *swagger.ApiDeclaration, recursive bool) error { - apiVer := apiutil.GetVersion(swaggerSchema.ApiVersion) + "." - - var pointedModel *swagger.NamedModel - for i := range swaggerSchema.Models.List { - name := swaggerSchema.Models.List[i].Name - - allModels[name] = &swaggerSchema.Models.List[i] - if strings.ToLower(name) == strings.ToLower(apiVer+inModel) { - pointedModel = &swaggerSchema.Models.List[i] - } - } - if pointedModel == nil { - return fmt.Errorf("requested resource %q is not defined", inModel) - } - - if len(fieldsPath) == 0 { - return printTopLevelResourceInfo(w, pointedModel, recursive) - } - - var pointedModelAsProp *swagger.NamedModelProperty - for _, field := range fieldsPath { - if prop, nextModel, isModel := getField(pointedModel, field); prop != nil { - if isModel { - pointedModelAsProp = prop - pointedModel = allModels[nextModel] - } else { - return printPrimitive(w, prop) - } - } else { - return fmt.Errorf("field %q does not exist", field) - } - } - return printModelInfo(w, pointedModel, pointedModelAsProp, recursive) -} - -func splitDotNotation(model string) (string, []string) { - var fieldsPath []string - dotModel := strings.Split(model, ".") - if len(dotModel) >= 1 { - fieldsPath = dotModel[1:] - } - return dotModel[0], fieldsPath -} - -func getPointedModel(prop *swagger.ModelProperty) (string, bool) { - if prop.Ref != nil { - return *prop.Ref, true - } else if *prop.Type == "array" && prop.Items.Ref != nil { - return *prop.Items.Ref, true - } - return "", false -} - -func getField(model *swagger.NamedModel, sField string) (*swagger.NamedModelProperty, string, bool) { - for _, prop := range model.Model.Properties.List { - if prop.Name == sField { - pointedModel, isModel := getPointedModel(&prop.Property) - return &prop, pointedModel, isModel - } - } - return nil, "", false -} - -func printModelInfo(w io.Writer, model *swagger.NamedModel, modelProp *swagger.NamedModelProperty, recursive bool) error { - t, _ := getFieldType(&modelProp.Property) - fmt.Fprintf(w, "RESOURCE: %s <%s>\n\n", modelProp.Name, t) - fieldDesc, _ := wrapAndIndentText(modelProp.Property.Description, " ", 80) - fmt.Fprintf(w, "DESCRIPTION:\n%s\n\n%s\n", fieldDesc, indentText(model.Model.Description, " ")) - return printFields(w, model, recursive) -} - -func printPrimitive(w io.Writer, field *swagger.NamedModelProperty) error { - t, _ := getFieldType(&field.Property) - fmt.Fprintf(w, "FIELD: %s <%s>\n\n", field.Name, t) - d, _ := wrapAndIndentText(field.Property.Description, " ", 80) - fmt.Fprintf(w, "DESCRIPTION:\n%s\n", d) - return nil -} - -func printTopLevelResourceInfo(w io.Writer, model *swagger.NamedModel, recursive bool) error { - fmt.Fprintf(w, "DESCRIPTION:\n%s\n", model.Model.Description) - return printFields(w, model, recursive) -} - -func printFields(w io.Writer, model *swagger.NamedModel, recursive bool) error { - fmt.Fprint(w, "\nFIELDS:\n") - for _, field := range model.Model.Properties.List { - fieldType, err := getFieldType(&field.Property) - if err != nil { - return err - } - - if arrayContains(model.Model.Required, field.Name) { - fmt.Fprintf(w, " %s\t<%s> -required-\n", field.Name, fieldType) - } else { - fmt.Fprintf(w, " %s\t<%s>\n", field.Name, fieldType) - } - - if recursive { - pointedModel, isModel := getPointedModel(&field.Property) - if isModel { - for _, nestedField := range allModels[pointedModel].Model.Properties.List { - t, _ := getFieldType(&nestedField.Property) - fmt.Fprintf(w, " %s\t<%s>\n", nestedField.Name, t) - } - } - } else { - fieldDesc, _ := wrapAndIndentText(field.Property.Description, " ", 80) - fmt.Fprintf(w, "%s\n\n", fieldDesc) - } - } - fmt.Fprint(w, "\n") - return nil -} - -func getFieldType(prop *swagger.ModelProperty) (string, error) { - if prop.Type == nil { - return "Object", nil - } else if *prop.Type == "any" { - // Swagger Spec doesn't return information for maps. - return "map[string]string", nil - } else if *prop.Type == "array" { - if prop.Items == nil { - return "", fmt.Errorf("error in swagger spec. Property: %v contains an array without type", prop) - } - if prop.Items.Ref != nil { - fieldType := "[]Object" - return fieldType, nil - } - fieldType := "[]" + *prop.Items.Type - return fieldType, nil - } - return *prop.Type, nil -} - -func wrapAndIndentText(desc, indent string, lim int) (string, error) { - words := strings.Split(strings.Replace(strings.TrimSpace(desc), "\n", " ", -1), " ") - n := len(words) - - for i := 0; i < n; i++ { - if len(words[i]) > lim { - if strings.Contains(words[i], "/") { - s := breakURL(words[i]) - words = append(words[:i], append(s, words[i+1:]...)...) - i = i + len(s) - 1 - } else { - fmt.Println(len(words[i])) - return "", fmt.Errorf("there are words longer that the break limit is") - } - } - } - - var lines []string - line := []string{indent} - lineL := len(indent) - for i := 0; i < len(words); i++ { - w := words[i] - - if strings.HasSuffix(w, "/") && lineL+len(w)-1 < lim { - prev := line[len(line)-1] - if strings.HasSuffix(prev, "/") { - if i+1 < len(words)-1 && !strings.HasSuffix(words[i+1], "/") { - w = strings.TrimSuffix(w, "/") - } - - line[len(line)-1] = prev + w - lineL += len(w) - } else { - line = append(line, w) - lineL += len(w) + 1 - } - } else if lineL+len(w) < lim { - line = append(line, w) - lineL += len(w) + 1 - } else { - lines = append(lines, strings.Join(line, " ")) - line = []string{indent, w} - lineL = len(indent) + len(w) - } - } - lines = append(lines, strings.Join(line, " ")) - - return strings.Join(lines, "\n"), nil -} - -func breakURL(url string) []string { - var buf []string - for _, part := range strings.Split(url, "/") { - buf = append(buf, part+"/") - } - return buf -} - -func indentText(text, indent string) string { - lines := strings.Split(text, "\n") - for i := range lines { - lines[i] = indent + lines[i] - } - return strings.Join(lines, "\n") -} - -func arrayContains(s []string, e string) bool { - for _, a := range s { - if a == e { - return true - } - } - return false -} diff --git a/pkg/kubectl/explain/BUILD b/pkg/kubectl/explain/BUILD new file mode 100644 index 00000000000..457ce2dd853 --- /dev/null +++ b/pkg/kubectl/explain/BUILD @@ -0,0 +1,34 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "explain.go", + "field_lookup.go", + "fields_printer.go", + "fields_printer_builder.go", + "formatter.go", + "model_printer.go", + "recursive_fields_printer.go", + "typename.go", + ], + visibility = ["//visibility:public"], + deps = [ + "//pkg/kubectl/cmd/util/openapi:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/meta: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/kubectl/explain/explain.go b/pkg/kubectl/explain/explain.go new file mode 100644 index 00000000000..d794ea70e3d --- /dev/null +++ b/pkg/kubectl/explain/explain.go @@ -0,0 +1,64 @@ +/* +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 explain + +import ( + "io" + "strings" + + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" +) + +type fieldsPrinter interface { + PrintFields(openapi.Schema) error +} + +func splitDotNotation(model string) (string, []string) { + var fieldsPath []string + dotModel := strings.Split(model, ".") + if len(dotModel) >= 1 { + fieldsPath = dotModel[1:] + } + return dotModel[0], fieldsPath +} + +// SplitAndParseResourceRequest separates the users input into a model and fields +func SplitAndParseResourceRequest(inResource string, mapper meta.RESTMapper) (string, []string, error) { + inResource, fieldsPath := splitDotNotation(inResource) + inResource, _ = mapper.ResourceSingularizer(inResource) + return inResource, fieldsPath, nil +} + +// PrintModelDescription prints the description of a specific model or dot path. +// If recursive, all components nested within the fields of the schema will be +// printed. +func PrintModelDescription(fieldsPath []string, w io.Writer, schema openapi.Schema, recursive bool) error { + fieldName := "" + if len(fieldsPath) != 0 { + fieldName = fieldsPath[len(fieldsPath)-1] + } + + // Go down the fieldsPath to find what we're trying to explain + schema, err := LookupSchemaForField(schema, fieldsPath) + if err != nil { + return err + } + b := fieldsPrinterBuilder{Recursive: recursive} + f := &Formatter{Writer: w, Wrap: 80} + return PrintModel(fieldName, f, b, schema) +} diff --git a/pkg/kubectl/explain/field_lookup.go b/pkg/kubectl/explain/field_lookup.go new file mode 100644 index 00000000000..b766fbf3b40 --- /dev/null +++ b/pkg/kubectl/explain/field_lookup.go @@ -0,0 +1,107 @@ +/* +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 explain + +import ( + "fmt" + + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" +) + +// fieldLookup walks through a schema by following a path, and returns +// the final schema. +type fieldLookup struct { + // Path to walk + Path []string + + // Return information: Schema found, or error. + Schema openapi.Schema + Error error +} + +// SaveLeafSchema is used to detect if we are done walking the path, and +// saves the schema as a match. +func (f *fieldLookup) SaveLeafSchema(schema openapi.Schema) bool { + if len(f.Path) != 0 { + return false + } + + f.Schema = schema + + return true +} + +// VisitArray is mostly a passthrough. +func (f *fieldLookup) VisitArray(a *openapi.Array) { + if f.SaveLeafSchema(a) { + return + } + + // Passthrough arrays. + a.SubType.Accept(f) +} + +// VisitMap is mostly a passthrough. +func (f *fieldLookup) VisitMap(m *openapi.Map) { + if f.SaveLeafSchema(m) { + return + } + + // Passthrough maps. + m.SubType.Accept(f) +} + +// VisitPrimitive stops the operation and returns itself as the found +// schema, even if it had more path to walk. +func (f *fieldLookup) VisitPrimitive(p *openapi.Primitive) { + // Even if Path is not empty (we're not expecting a leaf), + // return that primitive. + f.Schema = p +} + +// VisitKind unstacks fields as it finds them. +func (f *fieldLookup) VisitKind(k *openapi.Kind) { + if f.SaveLeafSchema(k) { + return + } + + subSchema, ok := k.Fields[f.Path[0]] + if !ok { + f.Error = fmt.Errorf("field %q does not exist", f.Path[0]) + return + } + + f.Path = f.Path[1:] + subSchema.Accept(f) +} + +// VisitReference is mostly a passthrough. +func (f *fieldLookup) VisitReference(r openapi.Reference) { + if f.SaveLeafSchema(r) { + return + } + + // Passthrough references. + r.SubSchema().Accept(f) +} + +// LookupSchemaForField looks for the schema of a given path in a base schema. +func LookupSchemaForField(schema openapi.Schema, path []string) (openapi.Schema, error) { + f := &fieldLookup{Path: path} + schema.Accept(f) + return f.Schema, f.Error +} diff --git a/pkg/kubectl/explain/fields_printer.go b/pkg/kubectl/explain/fields_printer.go new file mode 100644 index 00000000000..8da066085bc --- /dev/null +++ b/pkg/kubectl/explain/fields_printer.go @@ -0,0 +1,84 @@ +/* +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 explain + +import ( + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" +) + +// indentDesc is the level of indentation for descriptions. +const indentDesc = 2 + +// regularFieldsPrinter prints fields with their type and description. +type regularFieldsPrinter struct { + Writer *Formatter + Error error +} + +var _ openapi.SchemaVisitor = ®ularFieldsPrinter{} +var _ fieldsPrinter = ®ularFieldsPrinter{} + +// VisitArray prints a Array type. It is just a passthrough. +func (f *regularFieldsPrinter) VisitArray(a *openapi.Array) { + a.SubType.Accept(f) +} + +// VisitKind prints a Kind type. It prints each key in the kind, with +// the type, the required flag, and the description. +func (f *regularFieldsPrinter) VisitKind(k *openapi.Kind) { + for _, key := range k.Keys() { + v := k.Fields[key] + required := "" + if k.IsRequired(key) { + required = " -required-" + } + + if err := f.Writer.Write("%s\t<%s>%s", key, GetTypeName(v), required); err != nil { + f.Error = err + return + } + if err := f.Writer.Indent(indentDesc).WriteWrapped("%s", v.GetDescription()); err != nil { + f.Error = err + return + } + if err := f.Writer.Write(""); err != nil { + f.Error = err + return + } + } +} + +// VisitMap prints a Map type. It is just a passthrough. +func (f *regularFieldsPrinter) VisitMap(m *openapi.Map) { + m.SubType.Accept(f) +} + +// VisitPrimitive prints a Primitive type. It stops the recursion. +func (f *regularFieldsPrinter) VisitPrimitive(p *openapi.Primitive) { + // Nothing to do. Shouldn't really happen. +} + +// VisitReference prints a Reference type. It is just a passthrough. +func (f *regularFieldsPrinter) VisitReference(r openapi.Reference) { + r.SubSchema().Accept(f) +} + +// PrintFields will write the types from schema. +func (f *regularFieldsPrinter) PrintFields(schema openapi.Schema) error { + schema.Accept(f) + return f.Error +} diff --git a/pkg/kubectl/explain/fields_printer_builder.go b/pkg/kubectl/explain/fields_printer_builder.go new file mode 100644 index 00000000000..8a2fc045eba --- /dev/null +++ b/pkg/kubectl/explain/fields_printer_builder.go @@ -0,0 +1,36 @@ +/* +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 explain + +// fieldsPrinterBuilder builds either a regularFieldsPrinter or a +// recursiveFieldsPrinter based on the argument. +type fieldsPrinterBuilder struct { + Recursive bool +} + +// BuildFieldsPrinter builds the appropriate fieldsPrinter. +func (f fieldsPrinterBuilder) BuildFieldsPrinter(writer *Formatter) fieldsPrinter { + if f.Recursive { + return &recursiveFieldsPrinter{ + Writer: writer, + } + } + + return ®ularFieldsPrinter{ + Writer: writer, + } +} diff --git a/pkg/kubectl/explain/formatter.go b/pkg/kubectl/explain/formatter.go new file mode 100644 index 00000000000..5543dbf1bb9 --- /dev/null +++ b/pkg/kubectl/explain/formatter.go @@ -0,0 +1,120 @@ +/* +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 explain + +import ( + "fmt" + "io" + "strings" +) + +// Formatter helps you write with indentation, and can wrap text as needed. +type Formatter struct { + IndentLevel int + Wrap int + Writer io.Writer +} + +// Indent creates a new Formatter that will indent the code by that much more. +func (f Formatter) Indent(indent int) *Formatter { + f.IndentLevel = f.IndentLevel + indent + return &f +} + +// Write writes a string with the indentation set for the +// Formatter. This is not wrapping text. +func (f *Formatter) Write(str string, a ...interface{}) error { + // Don't indent empty lines + if str == "" { + _, err := io.WriteString(f.Writer, "\n") + return err + } + + indent := "" + for i := 0; i < f.IndentLevel; i++ { + indent = indent + " " + } + _, err := io.WriteString(f.Writer, indent+fmt.Sprintf(str, a...)+"\n") + return err +} + +// WriteWrapped writes a string with the indentation set for the +// Formatter, and wraps as needed. +func (f *Formatter) WriteWrapped(str string, a ...interface{}) error { + if f.Wrap == 0 { + return f.Write(str, a...) + } + text := fmt.Sprintf(str, a...) + strs := wrapString(text, f.Wrap-f.IndentLevel) + for _, substr := range strs { + if err := f.Write(substr); err != nil { + return err + } + } + return nil +} + +type line struct { + wrap int + words []string +} + +func (l *line) String() string { + return strings.Join(l.words, " ") +} + +func (l *line) Empty() bool { + return len(l.words) == 0 +} + +func (l *line) Len() int { + return len(l.String()) +} + +// Add adds the word to the line, returns true if we could, false if we +// didn't have enough room. It's always possible to add to an empty line. +func (l *line) Add(word string) bool { + newLine := line{ + wrap: l.wrap, + words: append(l.words, word), + } + if newLine.Len() <= l.wrap || len(l.words) == 0 { + l.words = newLine.words + return true + } + return false +} + +func wrapString(str string, wrap int) []string { + words := strings.Fields(str) + wrapped := []string{} + l := line{wrap: wrap} + + for _, word := range words { + if l.Add(word) == false { + wrapped = append(wrapped, l.String()) + l = line{wrap: wrap} + if l.Add(word) == false { + panic("Couldn't add to empty line.") + } + } + } + if !l.Empty() { + wrapped = append(wrapped, l.String()) + } + return wrapped +} diff --git a/pkg/kubectl/explain/model_printer.go b/pkg/kubectl/explain/model_printer.go new file mode 100644 index 00000000000..1f8d9208695 --- /dev/null +++ b/pkg/kubectl/explain/model_printer.go @@ -0,0 +1,129 @@ +/* +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 explain + +import ( + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" +) + +// fieldIndentLevel is the level of indentation for fields. +const fieldIndentLevel = 3 + +// descriptionIndentLevel is the level of indentation for the +// description. +const descriptionIndentLevel = 5 + +// modelPrinter prints a schema in Writer. Its "Builder" will decide if +// it's recursive or not. +type modelPrinter struct { + Name string + Type string + Descriptions []string + Writer *Formatter + Builder fieldsPrinterBuilder + Error error +} + +var _ openapi.SchemaVisitor = &modelPrinter{} + +// PrintDescription prints the description for a given schema. There +// might be multiple description, since we collect descriptions when we +// go through references, arrays and maps. +func (m *modelPrinter) PrintDescription(schema openapi.Schema) error { + if err := m.Writer.Write("DESCRIPTION:"); err != nil { + return err + } + for i, desc := range append(m.Descriptions, schema.GetDescription()) { + if desc == "" { + continue + } + if i != 0 { + if err := m.Writer.Write(""); err != nil { + return err + } + } + if err := m.Writer.Indent(descriptionIndentLevel).WriteWrapped(desc); err != nil { + return err + } + } + return nil +} + +// VisitArray recurses inside the subtype, while collecting the type if +// not done yet, and the description. +func (m *modelPrinter) VisitArray(a *openapi.Array) { + m.Descriptions = append(m.Descriptions, a.GetDescription()) + if m.Type == "" { + m.Type = GetTypeName(a) + } + a.SubType.Accept(m) +} + +// VisitKind prints a full resource with its fields. +func (m *modelPrinter) VisitKind(k *openapi.Kind) { + if m.Type == "" { + m.Type = GetTypeName(k) + } + if m.Name != "" { + m.Writer.Write("RESOURCE: %s <%s>\n", m.Name, m.Type) + } + + if err := m.PrintDescription(k); err != nil { + m.Error = err + return + } + if err := m.Writer.Write("\nFIELDS:"); err != nil { + m.Error = err + return + } + m.Error = m.Builder.BuildFieldsPrinter(m.Writer.Indent(fieldIndentLevel)).PrintFields(k) +} + +// VisitMap recurses inside the subtype, while collecting the type if +// not done yet, and the description. +func (m *modelPrinter) VisitMap(om *openapi.Map) { + m.Descriptions = append(m.Descriptions, om.GetDescription()) + if m.Type == "" { + m.Type = GetTypeName(om) + } + om.SubType.Accept(m) +} + +// VisitPrimitive prints a field type and its description. +func (m *modelPrinter) VisitPrimitive(p *openapi.Primitive) { + if m.Type == "" { + m.Type = GetTypeName(p) + } + if err := m.Writer.Write("FIELD: %s <%s>\n", m.Name, m.Type); err != nil { + m.Error = err + return + } + m.Error = m.PrintDescription(p) +} + +// VisitReference recurses inside the subtype, while collecting the description. +func (m *modelPrinter) VisitReference(r openapi.Reference) { + m.Descriptions = append(m.Descriptions, r.GetDescription()) + r.SubSchema().Accept(m) +} + +// PrintModel prints the description of a schema in writer. +func PrintModel(name string, writer *Formatter, builder fieldsPrinterBuilder, schema openapi.Schema) error { + m := &modelPrinter{Name: name, Writer: writer, Builder: builder} + schema.Accept(m) + return m.Error +} diff --git a/pkg/kubectl/explain/recursive_fields_printer.go b/pkg/kubectl/explain/recursive_fields_printer.go new file mode 100644 index 00000000000..dfa37931c05 --- /dev/null +++ b/pkg/kubectl/explain/recursive_fields_printer.go @@ -0,0 +1,77 @@ +/* +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 explain + +import ( + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" +) + +// indentPerLevel is the level of indentation for each field recursion. +const indentPerLevel = 3 + +// recursiveFieldsPrinter recursively prints all the fields for a given +// schema. +type recursiveFieldsPrinter struct { + Writer *Formatter + Error error +} + +var _ openapi.SchemaVisitor = &recursiveFieldsPrinter{} +var _ fieldsPrinter = &recursiveFieldsPrinter{} + +// VisitArray is just a passthrough. +func (f *recursiveFieldsPrinter) VisitArray(a *openapi.Array) { + a.SubType.Accept(f) +} + +// VisitKind prints all its fields with their type, and then recurses +// inside each of these (pre-order). +func (f *recursiveFieldsPrinter) VisitKind(k *openapi.Kind) { + for _, key := range k.Keys() { + v := k.Fields[key] + f.Writer.Write("%s\t<%s>", key, GetTypeName(v)) + subFields := &recursiveFieldsPrinter{ + Writer: f.Writer.Indent(indentPerLevel), + } + if err := subFields.PrintFields(v); err != nil { + f.Error = err + return + } + } +} + +// VisitMap is just a passthrough. +func (f *recursiveFieldsPrinter) VisitMap(m *openapi.Map) { + m.SubType.Accept(f) +} + +// VisitPrimitive does nothing, since it doesn't have sub-fields. +func (f *recursiveFieldsPrinter) VisitPrimitive(p *openapi.Primitive) { + // Nothing to do. +} + +// VisitReference is just a passthrough. +func (f *recursiveFieldsPrinter) VisitReference(r openapi.Reference) { + r.SubSchema().Accept(f) +} + +// PrintFields will recursively print all the fields for the given +// schema. +func (f *recursiveFieldsPrinter) PrintFields(schema openapi.Schema) error { + schema.Accept(f) + return f.Error +} diff --git a/pkg/kubectl/explain/typename.go b/pkg/kubectl/explain/typename.go new file mode 100644 index 00000000000..b90580e614f --- /dev/null +++ b/pkg/kubectl/explain/typename.go @@ -0,0 +1,66 @@ +/* +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 explain + +import ( + "fmt" + + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" +) + +// typeName finds the name of a schema +type typeName struct { + Name string +} + +var _ openapi.SchemaVisitor = &typeName{} + +// VisitArray adds the [] prefix and recurses. +func (t *typeName) VisitArray(a *openapi.Array) { + s := &typeName{} + a.SubType.Accept(s) + t.Name = fmt.Sprintf("[]%s", s.Name) +} + +// VisitKind just returns "Object". +func (t *typeName) VisitKind(k *openapi.Kind) { + t.Name = "Object" +} + +// VisitMap adds the map[string] prefix and recurses. +func (t *typeName) VisitMap(m *openapi.Map) { + s := &typeName{} + m.SubType.Accept(s) + t.Name = fmt.Sprintf("map[string]%s", s.Name) +} + +// VisitPrimitive returns the name of the primitive. +func (t *typeName) VisitPrimitive(p *openapi.Primitive) { + t.Name = p.Type +} + +// VisitReference is just a passthrough. +func (t *typeName) VisitReference(r openapi.Reference) { + r.SubSchema().Accept(t) +} + +// GetTypeName returns the type of a schema. +func GetTypeName(schema openapi.Schema) string { + t := &typeName{} + schema.Accept(t) + return t.Name +} From 996bc521ee14cea898acf42a0134a3dc77c18e62 Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Thu, 28 Sep 2017 09:31:45 -0700 Subject: [PATCH 30/51] openapi: Add fake resource to simplify tests --- pkg/kubectl/cmd/util/openapi/testing/BUILD | 2 ++ .../cmd/util/openapi/testing/openapi.go | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/pkg/kubectl/cmd/util/openapi/testing/BUILD b/pkg/kubectl/cmd/util/openapi/testing/BUILD index 665c1675e16..2c899b43e80 100644 --- a/pkg/kubectl/cmd/util/openapi/testing/BUILD +++ b/pkg/kubectl/cmd/util/openapi/testing/BUILD @@ -9,9 +9,11 @@ go_library( name = "go_default_library", srcs = ["openapi.go"], deps = [ + "//pkg/kubectl/cmd/util/openapi:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/github.com/googleapis/gnostic/compiler:go_default_library", "//vendor/gopkg.in/yaml.v2:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/pkg/kubectl/cmd/util/openapi/testing/openapi.go b/pkg/kubectl/cmd/util/openapi/testing/openapi.go index 55554814b60..e08f1defcd0 100644 --- a/pkg/kubectl/cmd/util/openapi/testing/openapi.go +++ b/pkg/kubectl/cmd/util/openapi/testing/openapi.go @@ -21,6 +21,9 @@ import ( "os" "sync" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" + yaml "gopkg.in/yaml.v2" "github.com/googleapis/gnostic/OpenAPIv2" @@ -87,3 +90,33 @@ func (f *FakeClient) OpenAPISchema() (*openapi_v2.Document, error) { return f.fake.OpenAPISchema() } + +// FakeResources is a wrapper to directly load the openapi schema from a +// file, and get the schema for given GVK. This is only for test since +// it's assuming that the file is there and everything will go fine. +type FakeResources struct { + fake Fake +} + +var _ openapi.Resources = &FakeResources{} + +// NewFakeResources creates a new FakeResources. +func NewFakeResources(path string) *FakeResources { + return &FakeResources{ + fake: Fake{Path: path}, + } +} + +// LookupResource will read the schema, parse it and return the +// resources. It doesn't return errors and will panic instead. +func (f *FakeResources) LookupResource(gvk schema.GroupVersionKind) openapi.Schema { + s, err := f.fake.OpenAPISchema() + if err != nil { + panic(err) + } + resources, err := openapi.NewOpenAPIData(s) + if err != nil { + panic(err) + } + return resources.LookupResource(gvk) +} From 094116ac9a0f5794881792db1be21099b510f4cf Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Thu, 28 Sep 2017 09:34:24 -0700 Subject: [PATCH 31/51] Add test for explain --- pkg/kubectl/explain/BUILD | 20 ++- pkg/kubectl/explain/field_lookup_test.go | 77 +++++++++++ pkg/kubectl/explain/fields_printer_test.go | 66 ++++++++++ pkg/kubectl/explain/formatter_test.go | 91 +++++++++++++ pkg/kubectl/explain/model_printer_test.go | 122 ++++++++++++++++++ .../explain/recursive_fields_printer_test.go | 61 +++++++++ pkg/kubectl/explain/test-swagger.json | 78 +++++++++++ pkg/kubectl/explain/typename_test.go | 80 ++++++++++++ 8 files changed, 594 insertions(+), 1 deletion(-) create mode 100644 pkg/kubectl/explain/field_lookup_test.go create mode 100644 pkg/kubectl/explain/fields_printer_test.go create mode 100644 pkg/kubectl/explain/formatter_test.go create mode 100644 pkg/kubectl/explain/model_printer_test.go create mode 100644 pkg/kubectl/explain/recursive_fields_printer_test.go create mode 100644 pkg/kubectl/explain/test-swagger.json create mode 100644 pkg/kubectl/explain/typename_test.go diff --git a/pkg/kubectl/explain/BUILD b/pkg/kubectl/explain/BUILD index 457ce2dd853..d55a25c5354 100644 --- a/pkg/kubectl/explain/BUILD +++ b/pkg/kubectl/explain/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", @@ -32,3 +32,21 @@ filegroup( tags = ["automanaged"], visibility = ["//visibility:public"], ) + +go_test( + name = "go_default_test", + srcs = [ + "field_lookup_test.go", + "fields_printer_test.go", + "formatter_test.go", + "model_printer_test.go", + "recursive_fields_printer_test.go", + "typename_test.go", + ], + data = ["test-swagger.json"], + library = ":go_default_library", + deps = [ + "//pkg/kubectl/cmd/util/openapi/testing:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + ], +) diff --git a/pkg/kubectl/explain/field_lookup_test.go b/pkg/kubectl/explain/field_lookup_test.go new file mode 100644 index 00000000000..4120c31f336 --- /dev/null +++ b/pkg/kubectl/explain/field_lookup_test.go @@ -0,0 +1,77 @@ +/* +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 explain + +import ( + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestFindField(t *testing.T) { + schema := resources.LookupResource(schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "OneKind", + }) + if schema == nil { + t.Fatal("Counldn't find schema v1.OneKind") + } + + tests := []struct { + path []string + + err string + expectedPath string + }{ + { + path: []string{}, + expectedPath: "OneKind", + }, + { + path: []string{"field1"}, + expectedPath: "OneKind.field1", + }, + { + path: []string{"field1", "array"}, + expectedPath: "OtherKind.array", + }, + { + path: []string{"field1", "what?"}, + err: `field "what?" does not exist`, + }, + } + + for _, test := range tests { + path, err := LookupSchemaForField(schema, test.path) + + gotErr := "" + if err != nil { + gotErr = err.Error() + } + + gotPath := "" + if path != nil { + gotPath = path.GetPath().String() + } + + if gotErr != test.err && gotPath != test.expectedPath { + t.Errorf("LookupSchemaForField(schema, %v) = (%v, %v), expected (%s, %v)", + test.path, gotErr, gotPath, test.expectedPath, test.err) + } + } +} diff --git a/pkg/kubectl/explain/fields_printer_test.go b/pkg/kubectl/explain/fields_printer_test.go new file mode 100644 index 00000000000..0e04c631f85 --- /dev/null +++ b/pkg/kubectl/explain/fields_printer_test.go @@ -0,0 +1,66 @@ +/* +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 explain + +import ( + "bytes" + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestFields(t *testing.T) { + schema := resources.LookupResource(schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "OneKind", + }) + if schema == nil { + t.Fatal("Couldn't find schema v1.OneKind") + } + + want := `field1 -required- + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut lacus ac + enim vulputate imperdiet ac accumsan risus. Integer vel accumsan lectus. + Praesent tempus nulla id tortor luctus, quis varius nulla laoreet. Ut orci + nisi, suscipit id velit sed, blandit eleifend turpis. Curabitur tempus ante at + lectus viverra, a mattis augue euismod. Morbi quam ligula, porttitor sit amet + lacus non, interdum pulvinar tortor. Praesent accumsan risus et ipsum dictum, + vel ullamcorper lorem egestas. + +field2 <[]map[string]string> + This is an array of object of PrimitiveDef + +` + + buf := bytes.Buffer{} + f := Formatter{ + Writer: &buf, + Wrap: 80, + } + s, err := LookupSchemaForField(schema, []string{}) + if err != nil { + t.Fatalf("Invalid path %v: %v", []string{}, err) + } + if err := (fieldsPrinterBuilder{Recursive: false}).BuildFieldsPrinter(&f).PrintFields(s); err != nil { + t.Fatalf("Failed to print fields: %v", err) + } + got := buf.String() + if got != want { + t.Errorf("Got:\n%v\nWant:\n%v\n", buf.String(), want) + } +} diff --git a/pkg/kubectl/explain/formatter_test.go b/pkg/kubectl/explain/formatter_test.go new file mode 100644 index 00000000000..15aaf0a9873 --- /dev/null +++ b/pkg/kubectl/explain/formatter_test.go @@ -0,0 +1,91 @@ +/* +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 explain + +import ( + "bytes" + "testing" +) + +func TestFormatterWrite(t *testing.T) { + buf := bytes.Buffer{} + f := Formatter{ + Writer: &buf, + } + + f.Write("Lorem ipsum dolor sit amet, consectetur adipiscing elit.") + // Indent creates a new Formatter + f.Indent(5).Write("Morbi at turpis faucibus, gravida dolor ut, fringilla velit.") + // So Indent(2) doesn't indent to 7 here. + f.Indent(2).Write("Etiam maximus urna at tellus faucibus mattis.") + + want := `Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Morbi at turpis faucibus, gravida dolor ut, fringilla velit. + Etiam maximus urna at tellus faucibus mattis. +` + + if buf.String() != want { + t.Errorf("Got:\n%v\nWant:\n%v\n", buf.String(), want) + } +} + +func TestFormatterWrappedWrite(t *testing.T) { + buf := bytes.Buffer{} + f := Formatter{ + Writer: &buf, + Wrap: 50, + } + + f.WriteWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at turpis faucibus, gravida dolor ut, fringilla velit.") + f.Indent(10).WriteWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at turpis faucibus, gravida dolor ut, fringilla velit.") + // Test long words (especially urls) on their own line. + f.Indent(20).WriteWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit. ThisIsAVeryLongWordThatDoesn'tFitOnALineOnItsOwn. Morbi at turpis faucibus, gravida dolor ut, fringilla velit.") + + want := `Lorem ipsum dolor sit amet, consectetur adipiscing +elit. Morbi at turpis faucibus, gravida dolor ut, +fringilla velit. + Lorem ipsum dolor sit amet, consectetur + adipiscing elit. Morbi at turpis + faucibus, gravida dolor ut, fringilla + velit. + Lorem ipsum dolor sit amet, + consectetur adipiscing elit. + ThisIsAVeryLongWordThatDoesn'tFitOnALineOnItsOwn. + Morbi at turpis faucibus, + gravida dolor ut, fringilla + velit. +` + + if buf.String() != want { + t.Errorf("Got:\n%v\nWant:\n%v\n", buf.String(), want) + } +} + +func TestDefaultWrap(t *testing.T) { + buf := bytes.Buffer{} + f := Formatter{ + Writer: &buf, + // Wrap is not set + } + + f.WriteWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at turpis faucibus, gravida dolor ut, fringilla velit. Etiam maximus urna at tellus faucibus mattis.") + want := `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi at turpis faucibus, gravida dolor ut, fringilla velit. Etiam maximus urna at tellus faucibus mattis. +` + if buf.String() != want { + t.Errorf("Got:\n%v\nWant:\n%v\n", buf.String(), want) + } +} diff --git a/pkg/kubectl/explain/model_printer_test.go b/pkg/kubectl/explain/model_printer_test.go new file mode 100644 index 00000000000..66b9b07eafc --- /dev/null +++ b/pkg/kubectl/explain/model_printer_test.go @@ -0,0 +1,122 @@ +/* +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 explain + +import ( + "bytes" + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestModel(t *testing.T) { + schema := resources.LookupResource(schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "OneKind", + }) + if schema == nil { + t.Fatal("Couldn't find schema v1.OneKind") + } + + tests := []struct { + path []string + want string + }{ + { + want: `DESCRIPTION: + OneKind has a short description + +FIELDS: + field1 -required- + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut lacus ac + enim vulputate imperdiet ac accumsan risus. Integer vel accumsan lectus. + Praesent tempus nulla id tortor luctus, quis varius nulla laoreet. Ut orci + nisi, suscipit id velit sed, blandit eleifend turpis. Curabitur tempus ante + at lectus viverra, a mattis augue euismod. Morbi quam ligula, porttitor sit + amet lacus non, interdum pulvinar tortor. Praesent accumsan risus et ipsum + dictum, vel ullamcorper lorem egestas. + + field2 <[]map[string]string> + This is an array of object of PrimitiveDef + +`, + path: []string{}, + }, + { + want: `RESOURCE: field1 + +DESCRIPTION: + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut lacus ac + enim vulputate imperdiet ac accumsan risus. Integer vel accumsan lectus. + Praesent tempus nulla id tortor luctus, quis varius nulla laoreet. Ut orci + nisi, suscipit id velit sed, blandit eleifend turpis. Curabitur tempus ante + at lectus viverra, a mattis augue euismod. Morbi quam ligula, porttitor sit + amet lacus non, interdum pulvinar tortor. Praesent accumsan risus et ipsum + dictum, vel ullamcorper lorem egestas. + + This is another kind of Kind + +FIELDS: + array <[]integer> + This array must be an array of int + + int + This int must be an int + + object + This is an object of string + + primitive + + string -required- + This string must be a string + +`, + path: []string{"field1"}, + }, + { + want: `FIELD: string + +DESCRIPTION: + This string must be a string +`, + path: []string{"field1", "string"}, + }, + { + want: `FIELD: array <[]integer> + +DESCRIPTION: + This array must be an array of int + + This is an int in an array +`, + path: []string{"field1", "array"}, + }, + } + + for _, test := range tests { + buf := bytes.Buffer{} + if err := PrintModelDescription(test.path, &buf, schema, false); err != nil { + t.Fatalf("Failed to PrintModelDescription for path %v: %v", test.path, err) + } + got := buf.String() + if got != test.want { + t.Errorf("Got:\n%v\nWant:\n%v\n", buf.String(), test.want) + } + } +} diff --git a/pkg/kubectl/explain/recursive_fields_printer_test.go b/pkg/kubectl/explain/recursive_fields_printer_test.go new file mode 100644 index 00000000000..75571ab4ee5 --- /dev/null +++ b/pkg/kubectl/explain/recursive_fields_printer_test.go @@ -0,0 +1,61 @@ +/* +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 explain + +import ( + "bytes" + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestRecursiveFields(t *testing.T) { + schema := resources.LookupResource(schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "OneKind", + }) + if schema == nil { + t.Fatal("Couldn't find schema v1.OneKind") + } + + want := `field1 + array <[]integer> + int + object + primitive + string +field2 <[]map[string]string> +` + + buf := bytes.Buffer{} + f := Formatter{ + Writer: &buf, + Wrap: 80, + } + s, err := LookupSchemaForField(schema, []string{}) + if err != nil { + t.Fatalf("Invalid path %v: %v", []string{}, err) + } + if err := (fieldsPrinterBuilder{Recursive: true}).BuildFieldsPrinter(&f).PrintFields(s); err != nil { + t.Fatalf("Failed to print fields: %v", err) + } + got := buf.String() + if got != want { + t.Errorf("Got:\n%v\nWant:\n%v\n", buf.String(), want) + } +} diff --git a/pkg/kubectl/explain/test-swagger.json b/pkg/kubectl/explain/test-swagger.json new file mode 100644 index 00000000000..a7634b0679a --- /dev/null +++ b/pkg/kubectl/explain/test-swagger.json @@ -0,0 +1,78 @@ +{ + "swagger": "2.0", + "info": { + "title": "Kubernetes", + "version": "v1.9.0" + }, + "paths": {}, + "definitions": { + "PrimitiveDef": { + "type": "string" + }, + "OneKind": { + "description": "OneKind has a short description", + "required": [ + "field1", + ], + "properties": { + "field1": { + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut lacus ac enim vulputate imperdiet ac accumsan risus. Integer vel accumsan lectus. Praesent tempus nulla id tortor luctus, quis varius nulla laoreet. Ut orci nisi, suscipit id velit sed, blandit eleifend turpis. Curabitur tempus ante at lectus viverra, a mattis augue euismod. Morbi quam ligula, porttitor sit amet lacus non, interdum pulvinar tortor. Praesent accumsan risus et ipsum dictum, vel ullamcorper lorem egestas.", + "$ref": "#/definitions/OtherKind" + }, + "field2": { + "description": "This is an array of object of PrimitiveDef", + "type": "array", + "items": { + "description": "This is an object of PrimitiveDef", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/PrimitiveDef" + } + } + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "", + "kind": "OneKind", + "version": "v1" + } + ] + }, + "OtherKind": { + "description": "This is another kind of Kind", + "required": [ + "string", + ], + "properties": { + "string": { + "description": "This string must be a string", + "type": "string", + }, + "int": { + "description": "This int must be an int", + "type": "integer", + }, + "array": { + "description": "This array must be an array of int", + "type": "array", + "items": { + "description": "This is an int in an array", + "type": "integer", + } + }, + "object": { + "description": "This is an object of string", + "type": "object", + "additionalProperties": { + "description": "this is a string in an object", + "type": "string", + } + }, + "primitive": { + "$ref": "#/definitions/PrimitiveDef" + } + } + } + } +} diff --git a/pkg/kubectl/explain/typename_test.go b/pkg/kubectl/explain/typename_test.go new file mode 100644 index 00000000000..aa3e5a2abeb --- /dev/null +++ b/pkg/kubectl/explain/typename_test.go @@ -0,0 +1,80 @@ +/* +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 explain + +import ( + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" + tst "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi/testing" +) + +var resources = tst.NewFakeResources("test-swagger.json") + +func TestReferenceTypename(t *testing.T) { + schema := resources.LookupResource(schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "OneKind", + }) + if schema == nil { + t.Fatal("Couldn't find schema v1.OneKind") + } + + tests := []struct { + path []string + expected string + }{ + { + // Kind is "Object" + path: []string{}, + expected: "Object", + }, + { + // Reference is equal to pointed type "Object" + path: []string{"field1"}, + expected: "Object", + }, + { + // Reference is equal to pointed type "string" + path: []string{"field1", "primitive"}, + expected: "string", + }, + { + // Array of object of reference to string + path: []string{"field2"}, + expected: "[]map[string]string", + }, + { + // Array of integer + path: []string{"field1", "array"}, + expected: "[]integer", + }, + } + + for _, test := range tests { + s, err := LookupSchemaForField(schema, test.path) + if err != nil { + t.Fatalf("Invalid test.path %v: %v", test.path, err) + } + got := GetTypeName(s) + if got != test.expected { + t.Errorf("Got %q, expected %q", got, test.expected) + } + } + +} From 6fecd04924d9992645a12e1f42c638b2b459f0de Mon Sep 17 00:00:00 2001 From: Jiaying Zhang Date: Mon, 2 Oct 2017 16:36:23 -0700 Subject: [PATCH 32/51] Fixes a regression introduced by PR 52290 that extended resource capacity may temporarily drop to zero after kubelet restarts and PODs restarted during that time window could fail to be scheduled. --- pkg/kubelet/kubelet_node_status.go | 9 ------- test/e2e/scheduling/nvidia-gpus.go | 39 ------------------------------ 2 files changed, 48 deletions(-) diff --git a/pkg/kubelet/kubelet_node_status.go b/pkg/kubelet/kubelet_node_status.go index d6d4d31ac03..24ac208ffe0 100644 --- a/pkg/kubelet/kubelet_node_status.go +++ b/pkg/kubelet/kubelet_node_status.go @@ -608,15 +608,6 @@ func (kl *Kubelet) setNodeStatusMachineInfo(node *v1.Node) { node.Status.Capacity[k] = v } } - // Remove stale extended resources. - for k := range node.Status.Capacity { - if v1helper.IsExtendedResourceName(k) { - if _, ok := currentCapacity[k]; !ok { - glog.V(2).Infof("delete capacity for %s", k) - delete(node.Status.Capacity, k) - } - } - } } } diff --git a/test/e2e/scheduling/nvidia-gpus.go b/test/e2e/scheduling/nvidia-gpus.go index 2e5a229077f..523fd1eea96 100644 --- a/test/e2e/scheduling/nvidia-gpus.go +++ b/test/e2e/scheduling/nvidia-gpus.go @@ -139,24 +139,6 @@ func areGPUsAvailableOnAllSchedulableNodes(f *framework.Framework) bool { return true } -func areGPUsAvailableOnAnySchedulableNodes(f *framework.Framework) bool { - framework.Logf("Getting list of Nodes from API server") - nodeList, err := f.ClientSet.CoreV1().Nodes().List(metav1.ListOptions{}) - framework.ExpectNoError(err, "getting node list") - for _, node := range nodeList.Items { - if node.Spec.Unschedulable { - continue - } - framework.Logf("gpuResourceName %s", gpuResourceName) - if val, ok := node.Status.Capacity[gpuResourceName]; ok && val.Value() > 0 { - framework.Logf("Nvidia GPUs available on Node: %q", node.Name) - return true - } - } - framework.Logf("Nvidia GPUs don't exist on all schedulable nodes") - return false -} - func getGPUsAvailable(f *framework.Framework) int64 { nodeList, err := f.ClientSet.CoreV1().Nodes().List(metav1.ListOptions{}) framework.ExpectNoError(err, "getting node list") @@ -225,27 +207,6 @@ var _ = SIGDescribe("[Feature:GPU]", func() { var _ = SIGDescribe("[Feature:GPUDevicePlugin]", func() { f := framework.NewDefaultFramework("device-plugin-gpus") It("run Nvidia GPU Device Plugin tests on Container Optimized OS only", func() { - // 1. Verifies GPU resource is successfully advertised on the nodes - // and we can run pods using GPUs. - By("Starting device plugin daemonset and running GPU pods") - testNvidiaGPUsOnCOS(f) - - // 2. Verifies that when the device plugin DaemonSet is removed, resource capacity drops to zero. - By("Deleting device plugin daemonset") - ds, err := framework.DsFromManifest(dsYamlUrl) - Expect(err).NotTo(HaveOccurred()) - falseVar := false - err = f.ClientSet.Extensions().DaemonSets(f.Namespace.Name).Delete(ds.Name, &metav1.DeleteOptions{OrphanDependents: &falseVar}) - framework.ExpectNoError(err, "failed to delete daemonset") - framework.Logf("Successfully deleted device plugin daemonset. Wait for resource to be removed.") - // Wait for Nvidia GPUs to be unavailable on all nodes. - Eventually(func() bool { - return !areGPUsAvailableOnAnySchedulableNodes(f) - }, 10*time.Minute, time.Second).Should(BeTrue()) - - // 3. Restarts the device plugin DaemonSet. Verifies GPU resource is successfully advertised - // on the nodes and we can run pods using GPUs. - By("Restarting device plugin daemonset and running GPU pods") testNvidiaGPUsOnCOS(f) }) }) From 41a1af42a90dd93fae7a304ef369b5068489771a Mon Sep 17 00:00:00 2001 From: andrewsykim Date: Tue, 3 Oct 2017 13:24:50 -0400 Subject: [PATCH 33/51] add note about kubeletremoved flag --api-servers --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce5b1ddda4f..7b56fad7b9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -667,6 +667,12 @@ Consider the following changes, limitations, and guidelines before you upgrade: Don't use these flags. Using deprecated flags causes the server to print a warning. Using a removed flag causes the server to abort the startup. +* The following deprecated flags were removed from `kubelet`: + + * `api-servers` - add apiserver addresses to the kubeconfig file instead. + + Don't use these flags. Using deprecated flags causes the kubelet to print a warning. Using a removed flag causes the kubelet to abort the startup. + * StatefulSet: The deprecated `pod.alpha.kubernetes.io/initialized` annotation for interrupting the StatefulSet Pod management is now ignored. StatefulSets with this annotation set to `true` or with no value will behave just as they did in previous versions. Dormant StatefulSets with the annotation set to `false` will become active after upgrading. * The CronJob object is now enabled by default at `v1beta1`. CronJob `v2alpha1` is still available, but it must be explicitly enabled. We recommend that you move any current CronJob objects to `batch/v1beta1.CronJob`. Be aware that if you specify the deprecated version, you may encounter Resource Not Found errors. These errors occur because the new controllers look for the new version during a rolling update. From 2ff87307c28b92ed99af90ce8e58b7eccb51ff89 Mon Sep 17 00:00:00 2001 From: Andy Goldstein Date: Mon, 2 Oct 2017 15:46:12 -0400 Subject: [PATCH 34/51] Support field selectors for CRDs Signed-off-by: Andy Goldstein --- .../pkg/apiserver/customresource_handler.go | 29 +++- .../apiserver/customresource_handler_test.go | 91 +++++++++++ .../test/integration/basic_test.go | 145 ++++++++++++++++++ 3 files changed, 262 insertions(+), 3 deletions(-) create mode 100644 staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index a64f0260efe..a9e382cd993 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -340,6 +340,8 @@ func (r *crdHandler) getServingInfoFor(crd *apiextensions.CustomResourceDefiniti selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, crd.Spec.Version, "namespaces") + "/" } + clusterScoped := crd.Spec.Scope == apiextensions.ClusterScoped + requestScope := handlers.RequestScope{ Namer: handlers.ContextBasedNaming{ GetContext: func(req *http.Request) apirequest.Context { @@ -347,7 +349,7 @@ func (r *crdHandler) getServingInfoFor(crd *apiextensions.CustomResourceDefiniti return ret }, SelfLinker: meta.NewAccessor(), - ClusterScoped: crd.Spec.Scope == apiextensions.ClusterScoped, + ClusterScoped: clusterScoped, SelfLinkPathPrefix: selfLinkPrefix, }, ContextFunc: func(req *http.Request) apirequest.Context { @@ -358,8 +360,11 @@ func (r *crdHandler) getServingInfoFor(crd *apiextensions.CustomResourceDefiniti Serializer: unstructuredNegotiatedSerializer{typer: typer, creator: creator}, ParameterCodec: parameterCodec, - Creater: creator, - Convertor: unstructured.UnstructuredObjectConverter{}, + Creater: creator, + Convertor: crdObjectConverter{ + UnstructuredObjectConverter: unstructured.UnstructuredObjectConverter{}, + clusterScoped: clusterScoped, + }, Defaulter: unstructuredDefaulter{parameterScheme}, Copier: UnstructuredCopier{}, Typer: typer, @@ -390,6 +395,24 @@ func (r *crdHandler) getServingInfoFor(crd *apiextensions.CustomResourceDefiniti return ret, nil } +// crdObjectConverter is a converter that supports field selectors for CRDs. +type crdObjectConverter struct { + unstructured.UnstructuredObjectConverter + clusterScoped bool +} + +func (c crdObjectConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { + // We currently only support metadata.namespace and metadata.name. + switch { + case label == "metadata.name": + return label, value, nil + case !c.clusterScoped && label == "metadata.namespace": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } +} + func (c *crdHandler) updateCustomResourceDefinition(oldObj, _ interface{}) { oldCRD := oldObj.(*apiextensions.CustomResourceDefinition) glog.V(4).Infof("Updating customresourcedefinition %s", oldCRD.Name) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go new file mode 100644 index 00000000000..81c3ac7050b --- /dev/null +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go @@ -0,0 +1,91 @@ +/* +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 apiserver + +import ( + "testing" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +func TestConvertFieldLabel(t *testing.T) { + tests := []struct { + name string + clusterScoped bool + label string + expectError bool + }{ + { + name: "cluster scoped - name is ok", + clusterScoped: true, + label: "metadata.name", + }, + { + name: "cluster scoped - namespace is not ok", + clusterScoped: true, + label: "metadata.namespace", + expectError: true, + }, + { + name: "cluster scoped - other field is not ok", + clusterScoped: true, + label: "some.other.field", + expectError: true, + }, + { + name: "namespace scoped - name is ok", + label: "metadata.name", + }, + { + name: "namespace scoped - namespace is ok", + label: "metadata.namespace", + }, + { + name: "namespace scoped - other field is not ok", + label: "some.other.field", + expectError: true, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + + c := crdObjectConverter{ + UnstructuredObjectConverter: unstructured.UnstructuredObjectConverter{}, + clusterScoped: test.clusterScoped, + } + + label, value, err := c.ConvertFieldLabel("", "", test.label, "value") + if e, a := test.expectError, err != nil; e != a { + t.Fatalf("err: expected %t, got %t", e, a) + } + if test.expectError { + if e, a := "field label not supported: "+test.label, err.Error(); e != a { + t.Errorf("err: expected %s, got %s", e, a) + } + return + } + + if e, a := test.label, label; e != a { + t.Errorf("label: expected %s, got %s", e, a) + } + if e, a := "value", value; e != a { + t.Errorf("value: expected %s, got %s", e, a) + } + }) + } +} diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go index 659b118d1ca..03bdd873b85 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go @@ -56,6 +56,7 @@ func TestNamespaceScopedCRUD(t *testing.T) { ns := "not-the-default" testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient) + testFieldSelector(t, ns, noxuDefinition, noxuVersionClient) } func TestClusterScopedCRUD(t *testing.T) { @@ -73,6 +74,7 @@ func TestClusterScopedCRUD(t *testing.T) { ns := "" testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient) + testFieldSelector(t, ns, noxuDefinition, noxuVersionClient) } func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, noxuVersionClient dynamic.Interface) { @@ -197,6 +199,149 @@ func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta } } +func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, noxuVersionClient dynamic.Interface) { + noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + initialList, err := noxuResourceClient.List(metav1.ListOptions{}) + if err != nil { + t.Fatal(err) + } + if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a { + t.Errorf("expected %v, got %v", e, a) + } + initialListTypeMeta, err := meta.TypeAccessor(initialList) + if err != nil { + t.Fatal(err) + } + if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Version, initialListTypeMeta.GetAPIVersion(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := noxuDefinition.Spec.Names.ListKind, initialListTypeMeta.GetKind(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + initialListListMeta, err := meta.ListAccessor(initialList) + if err != nil { + t.Fatal(err) + } + noxuWatch, err := noxuResourceClient.Watch( + metav1.ListOptions{ + ResourceVersion: initialListListMeta.GetResourceVersion(), + FieldSelector: "metadata.name=foo", + }, + ) + if err != nil { + t.Fatal(err) + } + defer noxuWatch.Stop() + + _, err = instantiateCustomResource(t, testserver.NewNoxuInstance(ns, "bar"), noxuResourceClient, noxuDefinition) + if err != nil { + t.Fatalf("unable to create noxu Instance:%v", err) + } + createdNoxuInstanceFoo, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, "foo"), noxuResourceClient, noxuDefinition) + if err != nil { + t.Fatalf("unable to create noxu Instance:%v", err) + } + + select { + case watchEvent := <-noxuWatch.ResultChan(): + if e, a := watch.Added, watchEvent.Type; e != a { + t.Errorf("expected %v, got %v", e, a) + break + } + createdObjectMeta, err := meta.Accessor(watchEvent.Object) + if err != nil { + t.Fatal(err) + } + // it should have a UUID + if len(createdObjectMeta.GetUID()) == 0 { + t.Errorf("missing uuid: %#v", watchEvent.Object) + } + if e, a := ns, createdObjectMeta.GetNamespace(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := "foo", createdObjectMeta.GetName(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + createdTypeMeta, err := meta.TypeAccessor(watchEvent.Object) + if err != nil { + t.Fatal(err) + } + if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Version, createdTypeMeta.GetAPIVersion(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := noxuDefinition.Spec.Names.Kind, createdTypeMeta.GetKind(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + case <-time.After(5 * time.Second): + t.Errorf("missing watch event") + } + + gottenNoxuInstance, err := noxuResourceClient.Get("foo", metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + if e, a := createdNoxuInstanceFoo, gottenNoxuInstance; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + + listWithItem, err := noxuResourceClient.List(metav1.ListOptions{FieldSelector: "metadata.name=foo"}) + if err != nil { + t.Fatal(err) + } + if e, a := 1, len(listWithItem.(*unstructured.UnstructuredList).Items); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := *createdNoxuInstanceFoo, listWithItem.(*unstructured.UnstructuredList).Items[0]; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + + if err := noxuResourceClient.Delete("bar", nil); err != nil { + t.Fatal(err) + } + if err := noxuResourceClient.Delete("foo", nil); err != nil { + t.Fatal(err) + } + + listWithoutItem, err := noxuResourceClient.List(metav1.ListOptions{}) + if err != nil { + t.Fatal(err) + } + if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + select { + case watchEvent := <-noxuWatch.ResultChan(): + if e, a := watch.Deleted, watchEvent.Type; e != a { + t.Errorf("expected %v, got %v", e, a) + break + } + deletedObjectMeta, err := meta.Accessor(watchEvent.Object) + if err != nil { + t.Fatal(err) + } + // it should have a UUID + createdObjectMeta, err := meta.Accessor(createdNoxuInstanceFoo) + if err != nil { + t.Fatal(err) + } + if e, a := createdObjectMeta.GetUID(), deletedObjectMeta.GetUID(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := ns, createdObjectMeta.GetNamespace(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := "foo", createdObjectMeta.GetName(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + case <-time.After(5 * time.Second): + t.Errorf("missing watch event") + } +} + func TestDiscovery(t *testing.T) { group := "mygroup.example.com" version := "v1beta1" From 67d4c408492593041f2327e5677edd896660db87 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 3 Oct 2017 15:45:06 -0400 Subject: [PATCH 35/51] Fix spam of multiattach errors in event logs We should be careful while generating multiattach errors. We seem to be generating too many of them because old code had minor bug. --- .../cache/desired_state_of_world.go | 19 ++++ .../attachdetach/reconciler/reconciler.go | 88 ++++++++++--------- .../reconciler/reconciler_test.go | 11 +++ 3 files changed, 76 insertions(+), 42 deletions(-) diff --git a/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go b/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go index f4481f71618..affd6229a72 100644 --- a/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go +++ b/pkg/controller/volume/attachdetach/cache/desired_state_of_world.go @@ -101,6 +101,10 @@ type DesiredStateOfWorld interface { // GetKeepTerminatedPodVolumesForNode determines if node wants volumes to be // mounted and attached for terminated pods GetKeepTerminatedPodVolumesForNode(k8stypes.NodeName) bool + + // Mark multiattach error as reported to prevent spamming multiple + // events for same error + SetMultiAttachError(v1.UniqueVolumeName, k8stypes.NodeName) } // VolumeToAttach represents a volume that should be attached to a node. @@ -329,6 +333,21 @@ func (dsw *desiredStateOfWorld) VolumeExists( return false } +func (dsw *desiredStateOfWorld) SetMultiAttachError( + volumeName v1.UniqueVolumeName, + nodeName k8stypes.NodeName) { + dsw.RLock() + defer dsw.RUnlock() + + nodeObj, nodeExists := dsw.nodesManaged[nodeName] + if nodeExists { + if volumeObj, volumeExists := nodeObj.volumesToAttach[volumeName]; volumeExists { + volumeObj.multiAttachErrorReported = true + dsw.nodesManaged[nodeName].volumesToAttach[volumeName] = volumeObj + } + } +} + // GetKeepTerminatedPodVolumesForNode determines if node wants volumes to be // mounted and attached for terminated pods func (dsw *desiredStateOfWorld) GetKeepTerminatedPodVolumesForNode(nodeName k8stypes.NodeName) bool { diff --git a/pkg/controller/volume/attachdetach/reconciler/reconciler.go b/pkg/controller/volume/attachdetach/reconciler/reconciler.go index 26133bb3bcd..ac81f98c6ae 100644 --- a/pkg/controller/volume/attachdetach/reconciler/reconciler.go +++ b/pkg/controller/volume/attachdetach/reconciler/reconciler.go @@ -241,48 +241,7 @@ func (rc *reconciler) reconcile() { } } - // Ensure volumes that should be attached are attached. - for _, volumeToAttach := range rc.desiredStateOfWorld.GetVolumesToAttach() { - if rc.actualStateOfWorld.VolumeNodeExists( - volumeToAttach.VolumeName, volumeToAttach.NodeName) { - // Volume/Node exists, touch it to reset detachRequestedTime - glog.V(5).Infof(volumeToAttach.GenerateMsgDetailed("Volume attached--touching", "")) - rc.actualStateOfWorld.ResetDetachRequestTime(volumeToAttach.VolumeName, volumeToAttach.NodeName) - } else { - // Don't even try to start an operation if there is already one running - if rc.attacherDetacher.IsOperationPending(volumeToAttach.VolumeName, "") { - glog.V(10).Infof("Operation for volume %q is already running. Can't start attach for %q", volumeToAttach.VolumeName, volumeToAttach.NodeName) - continue - } - - if rc.isMultiAttachForbidden(volumeToAttach.VolumeSpec) { - nodes := rc.actualStateOfWorld.GetNodesForVolume(volumeToAttach.VolumeName) - if len(nodes) > 0 { - if !volumeToAttach.MultiAttachErrorReported { - simpleMsg, detailedMsg := volumeToAttach.GenerateMsg("Multi-Attach error", "Volume is already exclusively attached to one node and can't be attached to another") - for _, pod := range volumeToAttach.ScheduledPods { - rc.recorder.Eventf(pod, v1.EventTypeWarning, kevents.FailedAttachVolume, simpleMsg) - } - volumeToAttach.MultiAttachErrorReported = true - glog.Warningf(detailedMsg) - } - continue - } - } - - // Volume/Node doesn't exist, spawn a goroutine to attach it - glog.V(5).Infof(volumeToAttach.GenerateMsgDetailed("Starting attacherDetacher.AttachVolume", "")) - err := rc.attacherDetacher.AttachVolume(volumeToAttach.VolumeToAttach, rc.actualStateOfWorld) - if err == nil { - glog.Infof(volumeToAttach.GenerateMsgDetailed("attacherDetacher.AttachVolume started", "")) - } - if err != nil && !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(volumeToAttach.GenerateErrorDetailed("attacherDetacher.AttachVolume failed to start", err).Error()) - } - } - } + rc.attachDesiredVolumes() // Update Node Status err := rc.nodeStatusUpdater.UpdateNodeStatuses() @@ -290,3 +249,48 @@ func (rc *reconciler) reconcile() { glog.Warningf("UpdateNodeStatuses failed with: %v", err) } } + +func (rc *reconciler) attachDesiredVolumes() { + // Ensure volumes that should be attached are attached. + for _, volumeToAttach := range rc.desiredStateOfWorld.GetVolumesToAttach() { + if rc.actualStateOfWorld.VolumeNodeExists(volumeToAttach.VolumeName, volumeToAttach.NodeName) { + // Volume/Node exists, touch it to reset detachRequestedTime + glog.V(5).Infof(volumeToAttach.GenerateMsgDetailed("Volume attached--touching", "")) + rc.actualStateOfWorld.ResetDetachRequestTime(volumeToAttach.VolumeName, volumeToAttach.NodeName) + continue + } + // Don't even try to start an operation if there is already one running + if rc.attacherDetacher.IsOperationPending(volumeToAttach.VolumeName, "") { + glog.V(10).Infof("Operation for volume %q is already running. Can't start attach for %q", volumeToAttach.VolumeName, volumeToAttach.NodeName) + continue + } + + if rc.isMultiAttachForbidden(volumeToAttach.VolumeSpec) { + nodes := rc.actualStateOfWorld.GetNodesForVolume(volumeToAttach.VolumeName) + if len(nodes) > 0 { + if !volumeToAttach.MultiAttachErrorReported { + simpleMsg, detailedMsg := volumeToAttach.GenerateMsg("Multi-Attach error", "Volume is already exclusively attached to one node and can't be attached to another") + for _, pod := range volumeToAttach.ScheduledPods { + rc.recorder.Eventf(pod, v1.EventTypeWarning, kevents.FailedAttachVolume, simpleMsg) + } + rc.desiredStateOfWorld.SetMultiAttachError(volumeToAttach.VolumeName, volumeToAttach.NodeName) + glog.Warningf(detailedMsg) + } + continue + } + } + + // Volume/Node doesn't exist, spawn a goroutine to attach it + glog.V(5).Infof(volumeToAttach.GenerateMsgDetailed("Starting attacherDetacher.AttachVolume", "")) + err := rc.attacherDetacher.AttachVolume(volumeToAttach.VolumeToAttach, rc.actualStateOfWorld) + if err == nil { + glog.Infof(volumeToAttach.GenerateMsgDetailed("attacherDetacher.AttachVolume started", "")) + } + if err != nil && !exponentialbackoff.IsExponentialBackoff(err) { + // Ignore exponentialbackoff.IsExponentialBackoff errors, they are expected. + // Log all other errors. + glog.Errorf(volumeToAttach.GenerateErrorDetailed("attacherDetacher.AttachVolume failed to start", err).Error()) + } + } + +} diff --git a/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go b/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go index 7792174b2fb..32a6c974095 100644 --- a/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go +++ b/pkg/controller/volume/attachdetach/reconciler/reconciler_test.go @@ -455,6 +455,17 @@ func Test_Run_OneVolumeAttachAndDetachMultipleNodesWithReadWriteOnce(t *testing. nodesForVolume := asw.GetNodesForVolume(generatedVolumeName) + // check if multiattach is marked + // at least one volume should be marked with multiattach error + nodeAttachedTo := nodesForVolume[0] + for _, volumeToAttach := range dsw.GetVolumesToAttach() { + if volumeToAttach.NodeName != nodeAttachedTo { + if !volumeToAttach.MultiAttachErrorReported { + t.Fatalf("Expected volume %q on node %q to have multiattach error", volumeToAttach.VolumeName, volumeToAttach.NodeName) + } + } + } + // Act podToDelete := "" if nodesForVolume[0] == nodeName1 { From 4be181739e8a02454c3ae6425ce64ee51b0c31c6 Mon Sep 17 00:00:00 2001 From: Dane LeBlanc Date: Tue, 3 Oct 2017 10:46:27 -0400 Subject: [PATCH 36/51] e2e tests need a ping6 test for IPv6-only clusters e2e tests provide only an (IPv4) ping test for external connectivity. We need a way to conditionally run a ping6 external connectivity check, and disable the (IPv4) ping-based external connectivity check, for end-to-end testing on IPv6-only clusters. This feature will be needed for creating gating IPv6 CI tests. fixes #53383 --- test/e2e/framework/util.go | 11 +++++++++-- test/e2e/network/networking.go | 10 ++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index bfc1deab145..2dcb56955e3 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -4503,15 +4503,22 @@ func LaunchWebserverPod(f *Framework, podName, nodeName string) (ip string) { return } +type PingCommand string + +const ( + IPv4PingCommand PingCommand = "ping" + IPv6PingCommand PingCommand = "ping6" +) + // CheckConnectivityToHost launches a pod to test connectivity to the specified // host. An error will be returned if the host is not reachable from the pod. // // An empty nodeName will use the schedule to choose where the pod is executed. -func CheckConnectivityToHost(f *Framework, nodeName, podName, host string, timeout int) error { +func CheckConnectivityToHost(f *Framework, nodeName, podName, host string, pingCmd PingCommand, timeout int) error { contName := fmt.Sprintf("%s-container", podName) command := []string{ - "ping", + string(pingCmd), "-c", "3", // send 3 pings "-W", "2", // wait at most 2 seconds for a reply "-w", strconv.Itoa(timeout), diff --git a/test/e2e/network/networking.go b/test/e2e/network/networking.go index 97034485055..50b8afa84cf 100644 --- a/test/e2e/network/networking.go +++ b/test/e2e/network/networking.go @@ -45,10 +45,16 @@ var _ = SIGDescribe("Networking", func() { } }) - It("should provide Internet connection for containers", func() { + It("should provide Internet connection for containers [Feature:Networking-IPv4]", func() { By("Running container which tries to ping 8.8.8.8") framework.ExpectNoError( - framework.CheckConnectivityToHost(f, "", "ping-test", "8.8.8.8", 30)) + framework.CheckConnectivityToHost(f, "", "ping-test", "8.8.8.8", framework.IPv4PingCommand, 30)) + }) + + It("should provide Internet connection for containers [Feature:Networking-IPv6][Experimental]", func() { + By("Running container which tries to ping google.com") + framework.ExpectNoError( + framework.CheckConnectivityToHost(f, "", "ping-test", "google.com", framework.IPv6PingCommand, 30)) }) // First test because it has no dependencies on variables created later on. From 74b4db24898b51948271e94b21d468df007c5c58 Mon Sep 17 00:00:00 2001 From: Andy Goldstein Date: Wed, 4 Oct 2017 09:32:05 -0400 Subject: [PATCH 37/51] Update bazel Signed-off-by: Andy Goldstein --- .../k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD index eb29291c7d4..be54b00ccbf 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( @@ -78,3 +79,10 @@ filegroup( ], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["customresource_handler_test.go"], + library = ":go_default_library", + deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library"], +) From db63350eacd62b8c80fd5e1ac3b3ca68fd3cf985 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Wed, 4 Oct 2017 10:46:49 -0400 Subject: [PATCH 38/51] Add /var/lib/kubelet error to known issues --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce5b1ddda4f..4dfc7bdb730 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -685,6 +685,10 @@ This section contains a list of known issues reported in Kubernetes 1.8 release. For more information, see [#53288](https://issue.k8s.io/53288). +* `kubeadm init` and `kubeadm join` invocations on newly installed systems can encounter a `/var/lib/kubelet is not empty` message during pre-flight checks that prevents setup. If this is the only pre-flight failure, it can be safely ignored with `--skip-preflight-checks`. + +For more information, see [#53356](https://issue.k8s.io/53356#issuecomment-333748618). + * A performance issue was identified in large-scale clusters when deleting thousands of pods simultaneously across hundreds of nodes. Kubelets in this scenario can encounter temporarily increased latency of `delete pod` API calls -- above the target service level objective of 1 second. If you run clusters with this usage pattern and if pod deletion latency could be an issue for you, you might want to wait until the issue is resolved before you upgrade. For more information and for updates on resolution of this issue, see [[#51899](https://github.com/kubernetes/kubernetes/pull/51899)](https://issue.k8s.io/51899). From 8a98063eabe3b9239a1fdf85aa7586ef7b458c25 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 20 Sep 2017 15:31:58 +0200 Subject: [PATCH 39/51] code-generator: rename _test to _examples --- .../code-generator/{_test => _examples}/apis/testgroup/doc.go | 0 .../{_test => _examples}/apis/testgroup/install/install.go | 4 ++-- .../{_test => _examples}/apis/testgroup/register.go | 0 .../{_test => _examples}/apis/testgroup/types.go | 0 .../{_test => _examples}/apis/testgroup/v1/doc.go | 0 .../{_test => _examples}/apis/testgroup/v1/register.go | 0 .../{_test => _examples}/apis/testgroup/v1/types.go | 0 .../apis/testgroup/v1/zz_generated.deepcopy.go | 0 .../apis/testgroup/zz_generated.deepcopy.go | 0 .../{_test => _examples}/clientset/internal/clientset.go | 0 .../{_test => _examples}/clientset/internal/doc.go | 0 .../clientset/internal/fake/clientset_generated.go | 0 .../{_test => _examples}/clientset/internal/fake/doc.go | 0 .../{_test => _examples}/clientset/internal/fake/register.go | 0 .../{_test => _examples}/clientset/internal/scheme/doc.go | 0 .../clientset/internal/scheme/register.go | 0 .../clientset/internal/typed/testgroup/internalversion/doc.go | 0 .../internal/typed/testgroup/internalversion/fake/doc.go | 0 .../testgroup/internalversion/fake/fake_testgroup_client.go | 0 .../typed/testgroup/internalversion/fake/fake_testtype.go | 0 .../typed/testgroup/internalversion/generated_expansion.go | 0 .../typed/testgroup/internalversion/testgroup_client.go | 0 .../internal/typed/testgroup/internalversion/testtype.go | 0 .../{_test => _examples}/clientset/versioned/clientset.go | 0 .../{_test => _examples}/clientset/versioned/doc.go | 0 .../clientset/versioned/fake/clientset_generated.go | 0 .../{_test => _examples}/clientset/versioned/fake/doc.go | 0 .../{_test => _examples}/clientset/versioned/fake/register.go | 0 .../{_test => _examples}/clientset/versioned/scheme/doc.go | 0 .../clientset/versioned/scheme/register.go | 0 .../clientset/versioned/typed/testgroup/v1/doc.go | 0 .../clientset/versioned/typed/testgroup/v1/fake/doc.go | 0 .../typed/testgroup/v1/fake/fake_testgroup_client.go | 0 .../versioned/typed/testgroup/v1/fake/fake_testtype.go | 0 .../versioned/typed/testgroup/v1/generated_expansion.go | 0 .../versioned/typed/testgroup/v1/testgroup_client.go | 0 .../clientset/versioned/typed/testgroup/v1/testtype.go | 0 .../informers/externalversions/factory.go | 0 .../informers/externalversions/generic.go | 0 .../externalversions/internalinterfaces/factory_interfaces.go | 0 .../informers/externalversions/testgroup/interface.go | 0 .../informers/externalversions/testgroup/v1/interface.go | 0 .../informers/externalversions/testgroup/v1/testtype.go | 0 .../{_test => _examples}/informers/internalversion/factory.go | 0 .../{_test => _examples}/informers/internalversion/generic.go | 0 .../internalversion/internalinterfaces/factory_interfaces.go | 0 .../informers/internalversion/testgroup/interface.go | 0 .../internalversion/testgroup/internalversion/interface.go | 0 .../internalversion/testgroup/internalversion/testtype.go | 0 .../listers/testgroup/internalversion/expansion_generated.go | 0 .../listers/testgroup/internalversion/testtype.go | 0 .../listers/testgroup/v1/expansion_generated.go | 0 .../{_test => _examples}/listers/testgroup/v1/testtype.go | 0 53 files changed, 2 insertions(+), 2 deletions(-) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/install/install.go (93%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/register.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/types.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/v1/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/v1/register.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/v1/types.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/v1/zz_generated.deepcopy.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/apis/testgroup/zz_generated.deepcopy.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/clientset.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/fake/clientset_generated.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/fake/register.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/scheme/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/scheme/register.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/typed/testgroup/internalversion/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/typed/testgroup/internalversion/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/typed/testgroup/internalversion/generated_expansion.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/typed/testgroup/internalversion/testgroup_client.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/internal/typed/testgroup/internalversion/testtype.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/clientset.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/fake/clientset_generated.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/fake/register.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/scheme/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/scheme/register.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/typed/testgroup/v1/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/typed/testgroup/v1/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/typed/testgroup/v1/generated_expansion.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/typed/testgroup/v1/testgroup_client.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/clientset/versioned/typed/testgroup/v1/testtype.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/externalversions/factory.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/externalversions/generic.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/externalversions/internalinterfaces/factory_interfaces.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/externalversions/testgroup/interface.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/externalversions/testgroup/v1/interface.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/externalversions/testgroup/v1/testtype.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/internalversion/factory.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/internalversion/generic.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/internalversion/internalinterfaces/factory_interfaces.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/internalversion/testgroup/interface.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/internalversion/testgroup/internalversion/interface.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/informers/internalversion/testgroup/internalversion/testtype.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/listers/testgroup/internalversion/expansion_generated.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/listers/testgroup/internalversion/testtype.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/listers/testgroup/v1/expansion_generated.go (100%) rename staging/src/k8s.io/code-generator/{_test => _examples}/listers/testgroup/v1/testtype.go (100%) diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/doc.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/doc.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/install/install.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/install/install.go similarity index 93% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/install/install.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/install/install.go index 647e3cbb585..4f47f2b72f4 100644 --- a/staging/src/k8s.io/code-generator/_test/apis/testgroup/install/install.go +++ b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/install/install.go @@ -22,8 +22,8 @@ import ( "k8s.io/apimachinery/pkg/apimachinery/announced" "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/code-generator/_test/apis/testgroup" - "k8s.io/code-generator/_test/apis/testgroup/v1" + "k8s.io/code-generator/_examples/apis/testgroup" + "k8s.io/code-generator/_examples/apis/testgroup/v1" ) // Install registers the API group and adds types to a scheme diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/register.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/register.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/register.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/register.go diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/types.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/types.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/types.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/types.go diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/doc.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/doc.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/register.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/register.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/register.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/register.go diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/types.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/types.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/types.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/types.go diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/zz_generated.deepcopy.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/v1/zz_generated.deepcopy.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/zz_generated.deepcopy.go diff --git a/staging/src/k8s.io/code-generator/_test/apis/testgroup/zz_generated.deepcopy.go b/staging/src/k8s.io/code-generator/_examples/apis/testgroup/zz_generated.deepcopy.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/apis/testgroup/zz_generated.deepcopy.go rename to staging/src/k8s.io/code-generator/_examples/apis/testgroup/zz_generated.deepcopy.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/clientset.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/clientset.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/clientset.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/clientset.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/clientset_generated.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/fake/clientset_generated.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/clientset_generated.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/fake/register.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/register.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/fake/register.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/register.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/scheme/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/scheme/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/scheme/register.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/register.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/scheme/register.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/register.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/generated_expansion.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/generated_expansion.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/generated_expansion.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testgroup_client.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testgroup_client.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testtype.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/clientset.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/clientset.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/clientset.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/clientset.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/clientset_generated.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/fake/clientset_generated.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/clientset_generated.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/fake/register.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/register.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/fake/register.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/register.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/scheme/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/scheme/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/scheme/register.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/register.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/scheme/register.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/register.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/generated_expansion.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/generated_expansion.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/generated_expansion.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testgroup_client.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testgroup_client.go diff --git a/staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testtype.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/externalversions/factory.go b/staging/src/k8s.io/code-generator/_examples/informers/externalversions/factory.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/externalversions/factory.go rename to staging/src/k8s.io/code-generator/_examples/informers/externalversions/factory.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/externalversions/generic.go b/staging/src/k8s.io/code-generator/_examples/informers/externalversions/generic.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/externalversions/generic.go rename to staging/src/k8s.io/code-generator/_examples/informers/externalversions/generic.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/externalversions/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/_examples/informers/externalversions/internalinterfaces/factory_interfaces.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/externalversions/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/code-generator/_examples/informers/externalversions/internalinterfaces/factory_interfaces.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/externalversions/testgroup/interface.go b/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/interface.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/externalversions/testgroup/interface.go rename to staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/interface.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/externalversions/testgroup/v1/interface.go b/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/interface.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/externalversions/testgroup/v1/interface.go rename to staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/interface.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/externalversions/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/externalversions/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/testtype.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/internalversion/factory.go b/staging/src/k8s.io/code-generator/_examples/informers/internalversion/factory.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/internalversion/factory.go rename to staging/src/k8s.io/code-generator/_examples/informers/internalversion/factory.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/internalversion/generic.go b/staging/src/k8s.io/code-generator/_examples/informers/internalversion/generic.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/internalversion/generic.go rename to staging/src/k8s.io/code-generator/_examples/informers/internalversion/generic.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/internalversion/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/_examples/informers/internalversion/internalinterfaces/factory_interfaces.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/internalversion/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/code-generator/_examples/informers/internalversion/internalinterfaces/factory_interfaces.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/internalversion/testgroup/interface.go b/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/interface.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/internalversion/testgroup/interface.go rename to staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/interface.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/internalversion/testgroup/internalversion/interface.go b/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/interface.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/internalversion/testgroup/internalversion/interface.go rename to staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/interface.go diff --git a/staging/src/k8s.io/code-generator/_test/informers/internalversion/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/informers/internalversion/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/testtype.go diff --git a/staging/src/k8s.io/code-generator/_test/listers/testgroup/internalversion/expansion_generated.go b/staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/listers/testgroup/internalversion/expansion_generated.go rename to staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/expansion_generated.go diff --git a/staging/src/k8s.io/code-generator/_test/listers/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/listers/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/testtype.go diff --git a/staging/src/k8s.io/code-generator/_test/listers/testgroup/v1/expansion_generated.go b/staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/listers/testgroup/v1/expansion_generated.go rename to staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/expansion_generated.go diff --git a/staging/src/k8s.io/code-generator/_test/listers/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/testtype.go similarity index 100% rename from staging/src/k8s.io/code-generator/_test/listers/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/testtype.go From cba2c0967fa30e2c02ba40d1e946cca6c79366db Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 20 Sep 2017 15:37:36 +0200 Subject: [PATCH 40/51] code-generator: turn hack/update-codegen.sh into re-usable generate-{internal,}-groups.sh scripts --- .../apis/example}/doc.go | 4 +- .../apis/example}/install/install.go | 8 +- .../apis/example}/register.go | 2 +- .../apis/example}/types.go | 5 +- .../apiserver/apis/example/v1/doc.go | 20 ++++ .../apiserver/apis/example/v1/register.go | 59 ++++++++++ .../apis/example}/v1/types.go | 3 + .../apis/example/v1/zz_generated.defaults.go | 32 +++++ .../testgroup => crd/apis/example}/v1/doc.go | 2 +- .../apis/example}/v1/register.go | 2 +- .../_examples/crd/apis/example/v1/types.go | 47 ++++++++ .../k8s.io/code-generator/generate-groups.sh | 86 ++++++++++++++ .../generate-internal-groups.sh | 109 ++++++++++++++++++ .../code-generator/hack/update-codegen.sh | 67 ++--------- .../code-generator/hack/verify-codegen.sh | 4 +- 15 files changed, 383 insertions(+), 67 deletions(-) rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => apiserver/apis/example}/doc.go (81%) rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => apiserver/apis/example}/install/install.go (85%) rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => apiserver/apis/example}/register.go (98%) rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => apiserver/apis/example}/types.go (80%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/doc.go create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/register.go rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => apiserver/apis/example}/v1/types.go (83%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.defaults.go rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => crd/apis/example}/v1/doc.go (92%) rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => crd/apis/example}/v1/register.go (94%) create mode 100644 staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/types.go create mode 100755 staging/src/k8s.io/code-generator/generate-groups.sh create mode 100755 staging/src/k8s.io/code-generator/generate-internal-groups.sh diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/doc.go similarity index 81% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/doc.go index 0ad64719f8d..4f75bbc964e 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/doc.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/doc.go @@ -15,5 +15,5 @@ limitations under the License. */ // +k8s:deepcopy-gen=package,register -// +groupName=testgroup.k8s.io -package testgroup // import "k8s.io/code-generator/_test/apis/testgroup" +// +groupName=example.apiserver.code-generator.k8s.io +package example // import "k8s.io/code-generator/_examples/apiserver/apis/example" diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/install/install.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go similarity index 85% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/install/install.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go index 4f47f2b72f4..b5182d690f0 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/install/install.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go @@ -22,17 +22,17 @@ import ( "k8s.io/apimachinery/pkg/apimachinery/announced" "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/code-generator/_examples/apis/testgroup" - "k8s.io/code-generator/_examples/apis/testgroup/v1" + "k8s.io/code-generator/_examples/apiserver/apis/example" + "k8s.io/code-generator/_examples/apiserver/apis/example/v1" ) // Install registers the API group and adds types to a scheme func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { if err := announced.NewGroupMetaFactory( &announced.GroupMetaFactoryArgs{ - GroupName: testgroup.SchemeGroupVersion.Group, + GroupName: example.SchemeGroupVersion.Group, VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version}, - AddInternalObjectsToScheme: testgroup.AddToScheme, + AddInternalObjectsToScheme: example.AddToScheme, }, announced.VersionToSchemeFunc{ v1.SchemeGroupVersion.Version: v1.AddToScheme, diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/register.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/register.go similarity index 98% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/register.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/register.go index 6a9dc8d429b..05578d50f54 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/register.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/register.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package testgroup +package example import ( "k8s.io/apimachinery/pkg/runtime" diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/types.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/types.go similarity index 80% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/types.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/types.go index 6a6874f9cea..b4fc976684f 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/types.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/types.go @@ -14,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package testgroup +package example import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// TestType is a top-level type. A client is created for it. type TestType struct { metav1.TypeMeta metav1.ObjectMeta @@ -29,6 +30,8 @@ type TestType struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// TestTypeList is a top-level list type. The client methods for lists are automatically created. +// You are not supposed to create a separated client for this one. type TestTypeList struct { metav1.TypeMeta metav1.ListMeta diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/doc.go new file mode 100644 index 00000000000..a93041949ef --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2016 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. +*/ + +// +k8s:deepcopy-gen=package,register +// +k8s:conversion-gen=k8s.io/code-generator/_examples/apiserver/apis/example +// +groupName=example.apiserver.code-generator.k8s.io +package v1 diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/register.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/register.go new file mode 100644 index 00000000000..99abd7d58fb --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/register.go @@ -0,0 +1,59 @@ +/* +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 v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +var SchemeGroupVersion = schema.GroupVersion{Group: "example.apiserver.code-generator.k8s.io", Version: "v1"} + +var ( + // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. + // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + SchemeBuilder runtime.SchemeBuilder + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +func init() { + // We only register manually written functions here. The registration of the + // generated functions takes place in the generated files. The separation + // makes the code compile even when the generated files are missing. + localSchemeBuilder.Register(addKnownTypes) +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +// Adds the list of known types to api.Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &TestType{}, + &TestTypeList{}, + ) + + scheme.AddKnownTypes(SchemeGroupVersion, + &metav1.Status{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/types.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/types.go similarity index 83% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/types.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/types.go index fcaa6a0b7b3..5c2ebc4d6f4 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/types.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/types.go @@ -21,6 +21,7 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// TestType is a top-level type. A client is created for it. type TestType struct { metav1.TypeMeta `json:",inline"` // +optional @@ -31,6 +32,8 @@ type TestType struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// TestTypeList is a top-level list type. The client methods for lists are automatically created. +// You are not supposed to create a separated client for this one. type TestTypeList struct { metav1.TypeMeta `json:",inline"` // +optional diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.defaults.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.defaults.go new file mode 100644 index 00000000000..6df448eb9fd --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.defaults.go @@ -0,0 +1,32 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by defaulter-gen. Do not edit it manually! + +package v1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + return nil +} diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/doc.go b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/doc.go similarity index 92% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/doc.go rename to staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/doc.go index adb242ddfef..53695eb9990 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/doc.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/doc.go @@ -15,5 +15,5 @@ limitations under the License. */ // +k8s:deepcopy-gen=package,register -// +groupName=testgroup.k8s.io +// +groupName=example.crd.code-generator.k8s.io package v1 diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/register.go b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/register.go similarity index 94% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/register.go rename to staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/register.go index 62df7b27052..97603b4341e 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/register.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/register.go @@ -22,7 +22,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" ) -var SchemeGroupVersion = schema.GroupVersion{Group: "testgroup.k8s.io", Version: "v1"} +var SchemeGroupVersion = schema.GroupVersion{Group: "example.crd.code-generator.k8s.io", Version: "v1"} var ( // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. diff --git a/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/types.go b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/types.go new file mode 100644 index 00000000000..5c2ebc4d6f4 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/types.go @@ -0,0 +1,47 @@ +/* +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 v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// TestType is a top-level type. A client is created for it. +type TestType struct { + metav1.TypeMeta `json:",inline"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + // +optional + Status TestTypeStatus `json:"status,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// TestTypeList is a top-level list type. The client methods for lists are automatically created. +// You are not supposed to create a separated client for this one. +type TestTypeList struct { + metav1.TypeMeta `json:",inline"` + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + Items []TestType `json:"items"` +} + +type TestTypeStatus struct { + Blah string +} diff --git a/staging/src/k8s.io/code-generator/generate-groups.sh b/staging/src/k8s.io/code-generator/generate-groups.sh new file mode 100755 index 00000000000..77dd97b216d --- /dev/null +++ b/staging/src/k8s.io/code-generator/generate-groups.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +# generate-groups generates everything for a project with external types only, e.g. a project based +# on CustomResourceDefinitions. + +if [ "$#" -le 4 ] || [ "${1}" == "--help" ]; then + cat < ... + + the generators comma separated to run (deepcopy,defaulter,client,lister,informer) or "all". + the output package name (e.g. github.com/example/project/pkg/generated). + the external types dir (e.g. github.com/example/api or github.com/example/project/pkg/apis). + the groups and their versions in the format "groupA:v1,v2 groupB:v1 groupC:v2", relative + to . + ... arbitrary flags passed to all generator binaries. + + +Examples: + $(basename $0) all github.com/example/project/pkg/client github.com/example/project/pkg/apis "foo:v1 bar:v1alpha1,v1beta1" + $(basename $0) deepcopy,client github.com/example/project/pkg/client github.com/example/project/pkg/apis "foo:v1 bar:v1alpha1,v1beta1" +EOF + exit 0 +fi + +GENS="$1" +OUTPUT_PKG="$2" +APIS_PKG="$3" +GROUPS_WITH_VERSIONS="$4" +shift 4 + +go install ./$(dirname "${0}")/cmd/{defaulter-gen,client-gen,lister-gen,informer-gen,deepcopy-gen} +function codegen::join() { local IFS="$1"; shift; echo "$*"; } + +# enumerate group versions +FQ_APIS=() # e.g. k8s.io/api/apps/v1 +for GVs in ${GROUPS_WITH_VERSIONS}; do + IFS=: read G Vs <<<"${GVs}" + + # enumerate versions + for V in ${Vs//,/ }; do + FQ_APIS+=(${APIS_PKG}/${G}/${V}) + done +done + +if [ "${GENS}" = "all" ] || grep -qw "deepcopy" <<<"${GENS}"; then + echo "Generating deepcopy funcs" + ${GOPATH}/bin/deepcopy-gen --input-dirs $(codegen::join , "${FQ_APIS[@]}") -O zz_generated.deepcopy --bounding-dirs ${APIS_PKG} "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "client" <<<"${GENS}"; then + echo "Generating clientset for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}/clientset" + ${GOPATH}/bin/client-gen --clientset-name versioned --input-base "" --input $(codegen::join , "${FQ_APIS[@]}") --clientset-path ${OUTPUT_PKG}/clientset "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "lister" <<<"${GENS}"; then + echo "Generating listers for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}/listers" + ${GOPATH}/bin/lister-gen --input-dirs $(codegen::join , "${FQ_APIS[@]}") --output-package ${OUTPUT_PKG}/listers "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "informer" <<<"${GENS}"; then + echo "Generating informers for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}/informers" + ${GOPATH}/bin/informer-gen \ + --input-dirs $(codegen::join , "${FQ_APIS[@]}") \ + --versioned-clientset-package ${OUTPUT_PKG}/clientset/versioned \ + --listers-package ${OUTPUT_PKG}/listers \ + --output-package ${OUTPUT_PKG}/informers \ + "$@" +fi diff --git a/staging/src/k8s.io/code-generator/generate-internal-groups.sh b/staging/src/k8s.io/code-generator/generate-internal-groups.sh new file mode 100755 index 00000000000..4f7f7e343d4 --- /dev/null +++ b/staging/src/k8s.io/code-generator/generate-internal-groups.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash + +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +# generate-internal-groups generates everything for a project with internal types, e.g. an +# user-provided API server based on k8s.io/apiserver. + +if [ "$#" -le 5 ] || [ "${1}" == "--help" ]; then + cat < ... + + the generators comma separated to run (deepcopy,defaulter,conversion,client,lister,informer) or "all". + the output package name (e.g. github.com/example/project/pkg/generated). + the internal types dir (e.g. github.com/example/project/pkg/apis). + the external types dir (e.g. github.com/example/project/pkg/apis or githubcom/example/apis). + the groups and their versions in the format "groupA:v1,v2 groupB:v1 groupC:v2", relative + to . + ... arbitrary flags passed to all generator binaries. + +Examples: + $(basename $0) all github.com/example/project/pkg/client github.com/example/project/pkg/apis github.com/example/project/pkg/apis "foo:v1 bar:v1alpha1,v1beta1" + $(basename $0) deepcopy,defaulter,conversion github.com/example/project/pkg/client github.com/example/project/pkg/apis github.com/example/project/apis "foo:v1 bar:v1alpha1,v1beta1" +EOF + exit 0 +fi + +GENS="$1" +OUTPUT_PKG="$2" +INT_APIS_PKG="$3" +EXT_APIS_PKG="$4" +GROUPS_WITH_VERSIONS="$5" +shift 5 + +go install ./$(dirname "${0}")/cmd/{defaulter-gen,conversion-gen,client-gen,lister-gen,informer-gen,deepcopy-gen} +function codegen::join() { local IFS="$1"; shift; echo "$*"; } + +# enumerate group versions +ALL_FQ_APIS=() # e.g. k8s.io/kubernetes/pkg/apis/apps k8s.io/api/apps/v1 +INT_FQ_APIS=() # e.g. k8s.io/kubernetes/pkg/apis/apps +EXT_FQ_APIS=() # e.g. k8s.io/api/apps/v1 +for GVs in ${GROUPS_WITH_VERSIONS}; do + IFS=: read G Vs <<<"${GVs}" + + if [ -n "${INT_APIS_PKG}" ]; then + ALL_FQ_APIS+=("${INT_APIS_PKG}/${G}") + INT_FQ_APIS+=("${INT_APIS_PKG}/${G}") + fi + + # enumerate versions + for V in ${Vs//,/ }; do + ALL_FQ_APIS+=("${EXT_APIS_PKG}/${G}/${V}") + EXT_FQ_APIS+=("${EXT_APIS_PKG}/${G}/${V}") + done +done + +if [ "${GENS}" = "all" ] || grep -qw "deepcopy" <<<"${GENS}"; then + echo "Generating deepcopy funcs" + ${GOPATH}/bin/deepcopy-gen --input-dirs $(codegen::join , "${ALL_FQ_APIS[@]}") -O zz_generated.deepcopy --bounding-dirs ${INT_APIS_PKG},${EXT_APIS_PKG} "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "defaulter" <<<"${GENS}"; then + echo "Generating defaulters" + ${GOPATH}/bin/defaulter-gen --input-dirs $(codegen::join , "${EXT_FQ_APIS[@]}") -O zz_generated.defaults "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "conversion" <<<"${GENS}"; then + echo "Generating conversions" + ${GOPATH}/bin/conversion-gen --input-dirs $(codegen::join , "${ALL_FQ_APIS[@]}") -O zz_generated.conversion "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "client" <<<"${GENS}"; then + echo "Generating clientset for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}/clientset" + if [ -n "${INT_APIS_PKG}" ]; then + ${GOPATH}/bin/client-gen --clientset-name internalversion --input-base "" --input $(codegen::join "/," "${INT_FQ_APIS[@]}")/ --clientset-path ${OUTPUT_PKG}/clientset "$@" + fi + ${GOPATH}/bin/client-gen --clientset-name versioned --input-base "" --input $(codegen::join , "${EXT_FQ_APIS[@]}") --clientset-path ${OUTPUT_PKG}/clientset "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "lister" <<<"${GENS}"; then + echo "Generating listers for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}/listers" + ${GOPATH}/bin/lister-gen --input-dirs $(codegen::join , "${ALL_FQ_APIS[@]}") --output-package ${OUTPUT_PKG}/listers "$@" +fi + +if [ "${GENS}" = "all" ] || grep -qw "informer" <<<"${GENS}"; then + echo "Generating informers for ${GROUPS_WITH_VERSIONS} at ${OUTPUT_PKG}/informers" + ${GOPATH}/bin/informer-gen \ + --input-dirs $(codegen::join , "${ALL_FQ_APIS[@]}") \ + --versioned-clientset-package ${OUTPUT_PKG}/clientset/versioned \ + --internal-clientset-package ${OUTPUT_PKG}/clientset/internalversion \ + --listers-package ${OUTPUT_PKG}/listers \ + --output-package ${OUTPUT_PKG}/informers \ + "$@" +fi diff --git a/staging/src/k8s.io/code-generator/hack/update-codegen.sh b/staging/src/k8s.io/code-generator/hack/update-codegen.sh index 198f6ff6109..3dd210eedaa 100755 --- a/staging/src/k8s.io/code-generator/hack/update-codegen.sh +++ b/staging/src/k8s.io/code-generator/hack/update-codegen.sh @@ -18,58 +18,15 @@ set -o errexit set -o nounset set -o pipefail -SCRIPT_PACKAGE=k8s.io/code-generator -SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. -SCRIPT_BASE=${SCRIPT_ROOT}/../.. -CODEGEN_PKG=${CODEGEN_PKG:-$(ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo "k8s.io/code-generator")} - -clientgen="${PWD}/client-gen-binary" -listergen="${PWD}/lister-gen" -informergen="${PWD}/informer-gen" -# Register function to be called on EXIT to remove generated binary. -function cleanup { - rm -f "${clientgen:-}" - rm -f "${listergen:-}" - rm -f "${informergen:-}" -} -trap cleanup EXIT - -function generate_group() { - local GROUP_NAME=$1 - local VERSION=$2 - local CLIENT_PKG=${SCRIPT_PACKAGE}/_test/clientset - local LISTERS_PKG=${SCRIPT_PACKAGE}/_test/listers - local INFORMERS_PKG=${SCRIPT_PACKAGE}/_test/informers - local APIS_PKG=${SCRIPT_PACKAGE}/_test/apis - local INPUT_APIS=( - ${GROUP_NAME}/ - ${GROUP_NAME}/${VERSION} - ) - - echo "Building client-gen" - go build -o "${clientgen}" ${CODEGEN_PKG}/cmd/client-gen - - echo "generating clientset for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${CLIENT_PKG}" - ${clientgen} --clientset-name="internal" --input-base ${APIS_PKG} --input ${INPUT_APIS[@]} --clientset-path ${CLIENT_PKG} --output-base=${SCRIPT_BASE} - ${clientgen} --clientset-name="versioned" --input-base ${APIS_PKG} --input ${GROUP_NAME}/${VERSION} --clientset-path ${CLIENT_PKG} --output-base=${SCRIPT_BASE} - - echo "Building lister-gen" - go build -o "${listergen}" ${CODEGEN_PKG}/cmd/lister-gen - - echo "generating listers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${LISTERS_PKG}" - ${listergen} --input-dirs ${APIS_PKG}/${GROUP_NAME} --input-dirs ${APIS_PKG}/${GROUP_NAME}/${VERSION} --output-package ${LISTERS_PKG} --output-base ${SCRIPT_BASE} - - echo "Building informer-gen" - go build -o "${informergen}" ${CODEGEN_PKG}/cmd/informer-gen - - echo "generating informers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${INFORMERS_PKG}" - ${informergen} \ - --input-dirs ${APIS_PKG}/${GROUP_NAME} --input-dirs ${APIS_PKG}/${GROUP_NAME}/${VERSION} \ - --versioned-clientset-package ${CLIENT_PKG}/versioned \ - --internal-clientset-package ${CLIENT_PKG}/internal \ - --listers-package ${LISTERS_PKG} \ - --output-package ${INFORMERS_PKG} \ - --output-base ${SCRIPT_BASE} -} - -generate_group testgroup v1 +# generate the code with: +# - --output-base because this script should also be able to run inside the vendor dir of +# k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir +# instead of the $GOPATH directly. For normal projects this can be dropped. +$(dirname ${BASH_SOURCE})/../generate-internal-groups.sh all \ + k8s.io/code-generator/_examples/apiserver k8s.io/code-generator/_examples/apiserver/apis k8s.io/code-generator/_examples/apiserver/apis \ + example:v1 \ + --output-base "$(dirname ${BASH_SOURCE})/../../.." +$(dirname ${BASH_SOURCE})/../generate-groups.sh all \ + k8s.io/code-generator/_examples/crd k8s.io/code-generator/_examples/crd/apis \ + example:v1 \ + --output-base "$(dirname ${BASH_SOURCE})/../../.." diff --git a/staging/src/k8s.io/code-generator/hack/verify-codegen.sh b/staging/src/k8s.io/code-generator/hack/verify-codegen.sh index 4c01d1d4684..e69e1107482 100755 --- a/staging/src/k8s.io/code-generator/hack/verify-codegen.sh +++ b/staging/src/k8s.io/code-generator/hack/verify-codegen.sh @@ -21,8 +21,8 @@ set -o pipefail SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. SCRIPT_BASE=${SCRIPT_ROOT}/../.. -DIFFROOT="${SCRIPT_ROOT}/_test" -TMP_DIFFROOT="${SCRIPT_ROOT}/_tmp/_test" +DIFFROOT="${SCRIPT_ROOT}/_examples" +TMP_DIFFROOT="${SCRIPT_ROOT}/_tmp/_examples" _tmp="${SCRIPT_ROOT}/_tmp" cleanup() { From abfb658d76e2cb2d5446decd8e7bdbf8f82d95ed Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 20 Sep 2017 15:38:48 +0200 Subject: [PATCH 41/51] sample-apiserver: port to k8s.io/code-generator/generate-internal-groups.sh --- hack/.golint_failures | 14 +++- .../hack/custom-boilerplate.go.txt | 16 +++++ .../sample-apiserver/hack/update-codegen.sh | 65 ++++--------------- .../admission/plugin/banflunder/admission.go | 4 +- .../plugin/banflunder/admission_test.go | 4 +- .../admission/wardleinitializer/interfaces.go | 2 +- .../wardleinitializer/wardleinitializer.go | 2 +- .../wardleinitializer_test.go | 4 +- .../pkg/apis/wardle/v1alpha1/doc.go | 2 +- .../sample-apiserver/pkg/cmd/server/start.go | 4 +- 10 files changed, 51 insertions(+), 66 deletions(-) create mode 100644 staging/src/k8s.io/sample-apiserver/hack/custom-boilerplate.go.txt diff --git a/hack/.golint_failures b/hack/.golint_failures index afd37390f12..c30b9d49801 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -765,8 +765,18 @@ staging/src/k8s.io/metrics/pkg/client/custom_metrics/fake staging/src/k8s.io/sample-apiserver/pkg/apis/wardle staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1 staging/src/k8s.io/sample-apiserver/pkg/apiserver -staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces -staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1 +staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake +staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces +staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces staging/src/k8s.io/sample-apiserver/pkg/cmd/server staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/fischer staging/src/k8s.io/sample-apiserver/pkg/registry/wardle/flunder diff --git a/staging/src/k8s.io/sample-apiserver/hack/custom-boilerplate.go.txt b/staging/src/k8s.io/sample-apiserver/hack/custom-boilerplate.go.txt new file mode 100644 index 00000000000..38f2d697beb --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/hack/custom-boilerplate.go.txt @@ -0,0 +1,16 @@ +/* +Copyright YEAR The Kubernetes sample-apiserver 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. +*/ + diff --git a/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh b/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh index fb717e793b2..788a4e266ac 100755 --- a/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh +++ b/staging/src/k8s.io/sample-apiserver/hack/update-codegen.sh @@ -18,58 +18,17 @@ set -o errexit set -o nounset set -o pipefail -SCRIPT_PACKAGE=k8s.io/sample-apiserver -SCRIPT_ROOT=$(dirname "${BASH_SOURCE}")/.. -SCRIPT_BASE=${SCRIPT_ROOT}/../.. -CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo k8s.io/code-generator)} +SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/.. +CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)} -clientgen="${PWD}/client-gen-binary" -listergen="${PWD}/lister-gen" -informergen="${PWD}/informer-gen" -# Register function to be called on EXIT to remove generated binary. -function cleanup { - rm -f "${clientgen:-}" - rm -f "${listergen:-}" - rm -f "${informergen:-}" -} -trap cleanup EXIT +# generate the code with: +# --output-base because this script should also be able to run inside the vendor dir of +# k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir +# instead of the $GOPATH directly. For normal projects this can be dropped. +${CODEGEN_PKG}/generate-internal-groups.sh all \ + k8s.io/sample-apiserver/pkg/client k8s.io/sample-apiserver/pkg/apis k8s.io/sample-apiserver/pkg/apis \ + wardle:v1alpha1 \ + --output-base "$(dirname ${BASH_SOURCE})/../../.." -function generate_group() { - local GROUP_NAME=$1 - local VERSION=$2 - local CLIENT_PKG=${SCRIPT_PACKAGE}/pkg/client - local LISTERS_PKG=${CLIENT_PKG}/listers_generated - local INFORMERS_PKG=${CLIENT_PKG}/informers_generated - local APIS_PKG=${SCRIPT_PACKAGE}/pkg/apis - local INPUT_APIS=( - ${GROUP_NAME}/ - ${GROUP_NAME}/${VERSION} - ) - - echo "Building client-gen" - go build -o "${clientgen}" ${CODEGEN_PKG}/cmd/client-gen - - echo "generating clientset for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${CLIENT_PKG}" - ${clientgen} --input-base ${APIS_PKG} --input ${INPUT_APIS[@]} --clientset-path ${CLIENT_PKG}/clientset_generated --output-base=${SCRIPT_BASE} - ${clientgen} --clientset-name="clientset" --input-base ${APIS_PKG} --input ${GROUP_NAME}/${VERSION} --clientset-path ${CLIENT_PKG}/clientset_generated --output-base=${SCRIPT_BASE} - - echo "Building lister-gen" - go build -o "${listergen}" ${CODEGEN_PKG}/cmd/lister-gen - - echo "generating listers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${LISTERS_PKG}" - ${listergen} --input-dirs ${APIS_PKG}/${GROUP_NAME} --input-dirs ${APIS_PKG}/${GROUP_NAME}/${VERSION} --output-package ${LISTERS_PKG} --output-base ${SCRIPT_BASE} - - echo "Building informer-gen" - go build -o "${informergen}" ${CODEGEN_PKG}/cmd/informer-gen - - echo "generating informers for group ${GROUP_NAME} and version ${VERSION} at ${SCRIPT_BASE}/${INFORMERS_PKG}" - ${informergen} \ - --input-dirs ${APIS_PKG}/${GROUP_NAME} --input-dirs ${APIS_PKG}/${GROUP_NAME}/${VERSION} \ - --versioned-clientset-package ${CLIENT_PKG}/clientset_generated/clientset \ - --internal-clientset-package ${CLIENT_PKG}/clientset_generated/internalclientset \ - --listers-package ${LISTERS_PKG} \ - --output-package ${INFORMERS_PKG} \ - --output-base ${SCRIPT_BASE} -} - -generate_group wardle v1alpha1 +# To use your own boilerplate text append: +# --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go index 53fc094a2a8..1b279763906 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission.go @@ -26,8 +26,8 @@ import ( "k8s.io/apiserver/pkg/admission" "k8s.io/sample-apiserver/pkg/admission/wardleinitializer" "k8s.io/sample-apiserver/pkg/apis/wardle" - informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" - listers "k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion" + informers "k8s.io/sample-apiserver/pkg/client/informers/internalversion" + listers "k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion" ) // Register registers a plugin diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission_test.go b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission_test.go index e082a2ab526..1b449abbb4a 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission_test.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/admission_test.go @@ -28,8 +28,8 @@ import ( "k8s.io/sample-apiserver/pkg/admission/plugin/banflunder" "k8s.io/sample-apiserver/pkg/admission/wardleinitializer" "k8s.io/sample-apiserver/pkg/apis/wardle" - "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake" - informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" + "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake" + informers "k8s.io/sample-apiserver/pkg/client/informers/internalversion" ) // TestBanfluderAdmissionPlugin tests various test cases against diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/interfaces.go b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/interfaces.go index f82f42012b9..93a095b6f85 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/interfaces.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/interfaces.go @@ -18,7 +18,7 @@ package wardleinitializer import ( "k8s.io/apiserver/pkg/admission" - informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" + informers "k8s.io/sample-apiserver/pkg/client/informers/internalversion" ) // WantsInternalWardleInformerFactory defines a function which sets InformerFactory for admission plugins that need it diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer.go b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer.go index 291c5cd190d..c53c8a4944a 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer.go @@ -18,7 +18,7 @@ package wardleinitializer import ( "k8s.io/apiserver/pkg/admission" - informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" + informers "k8s.io/sample-apiserver/pkg/client/informers/internalversion" ) type pluginInitializer struct { diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer_test.go b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer_test.go index 648fe6c04f1..9c306e315eb 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer_test.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/wardleinitializer_test.go @@ -22,8 +22,8 @@ import ( "k8s.io/apiserver/pkg/admission" "k8s.io/sample-apiserver/pkg/admission/wardleinitializer" - "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake" - informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" + "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake" + informers "k8s.io/sample-apiserver/pkg/client/informers/internalversion" ) // TestWantsInternalWardleInformerFactory ensures that the informer factory is injected diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/doc.go index 94e54a6ba53..06c174cf11d 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/doc.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/doc.go @@ -15,7 +15,7 @@ limitations under the License. */ // +k8s:deepcopy-gen=package,register -// +k8s:conversion-gen=k8s.io/kubernetes/vendor/k8s.io/sample-apiserver/pkg/apis/wardle +// +k8s:conversion-gen=k8s.io/sample-apiserver/pkg/apis/wardle // Package v1alpha1 is the v1alpha1 version of the API. // +groupName=wardle.k8s.io diff --git a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go index bd194cde9d1..8d15c8d846b 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go @@ -30,8 +30,8 @@ import ( "k8s.io/sample-apiserver/pkg/admission/wardleinitializer" "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" "k8s.io/sample-apiserver/pkg/apiserver" - clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset" - informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" + clientset "k8s.io/sample-apiserver/pkg/client/clientset/internalversion" + informers "k8s.io/sample-apiserver/pkg/client/informers/internalversion" ) const defaultEtcdPathPrefix = "/registry/wardle.kubernetes.io" From 873a550558589d5a5683eacb76b828dbe50c1c47 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 20 Sep 2017 17:28:49 +0200 Subject: [PATCH 42/51] verify-pkg-names.sh: exclude generated informers --- hack/verify-pkg-names.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/verify-pkg-names.sh b/hack/verify-pkg-names.sh index c6d27bdf155..7d103da9fb3 100755 --- a/hack/verify-pkg-names.sh +++ b/hack/verify-pkg-names.sh @@ -26,7 +26,7 @@ source "${KUBE_ROOT}/hack/lib/init.sh" kube::golang::verify_go_version cd "${KUBE_ROOT}" -if git --no-pager grep -E $'^(import |\t)[a-z]+[A-Z_][a-zA-Z]* "[^"]+"$' -- '**/*.go' ':(exclude)vendor/*' ':(exclude)staging/src/k8s.io/client-go/*vendor/*' ':(exclude)staging/src/k8s.io/metrics/*' ':(exclude)pkg/apis/admission/v1alpha1/zz_generated.conversion.go'; then +if git --no-pager grep -E $'^(import |\t)[a-z]+[A-Z_][a-zA-Z]* "[^"]+"$' -- '**/*.go' ':(exclude)vendor/*' ':(exclude)staging/src/k8s.io/client-go/*vendor/*' ':(exclude)staging/src/k8s.io/metrics/*' ':(exclude)pkg/apis/admission/v1alpha1/zz_generated.conversion.go' ':(exclude)staging/src/k8s.io/sample-apiserver/pkg/client/informers/*' ':(exclude)staging/src/k8s.io/code-generator/_examples/*informers/*'; then echo "!!! Some package aliases break go conventions." echo "To fix these errors, do not use capitalized or underlined characters" echo "in pkg aliases. Refer to https://blog.golang.org/package-names for more info." From 96b596133a7ca57b844aac597f1f6a9fb4e68187 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Thu, 28 Sep 2017 14:41:59 +0200 Subject: [PATCH 43/51] Update generated files --- .../example/v1/zz_generated.conversion.go | 113 ++++++++++++ .../example/v1/zz_generated.conversions.go | 113 ++++++++++++ .../apis/example}/v1/zz_generated.deepcopy.go | 0 .../apis/example}/zz_generated.deepcopy.go | 2 +- .../clientset/internalversion}/clientset.go | 20 +- .../clientset/internalversion}/doc.go | 2 +- .../fake/clientset_generated.go | 12 +- .../clientset/internalversion}/fake/doc.go | 0 .../internalversion/fake/register.go | 53 ++++++ .../clientset/internalversion}/scheme/doc.go | 0 .../internalversion}/scheme/register.go | 4 +- .../typed/example}/internalversion/doc.go | 0 .../internalversion/example_client.go} | 30 +-- .../example}/internalversion/fake/doc.go | 0 .../fake/fake_example_client.go | 38 ++++ .../internalversion/fake/fake_testtype.go | 50 ++--- .../internalversion/generated_expansion.go | 0 .../example}/internalversion/testtype.go | 42 ++--- .../clientset/versioned/clientset.go | 26 +-- .../clientset/versioned/doc.go | 0 .../versioned/fake/clientset_generated.go | 71 ++++++++ .../clientset/versioned/fake/doc.go | 0 .../clientset/versioned}/fake/register.go | 4 +- .../clientset/versioned/scheme/doc.go | 0 .../clientset/versioned/scheme/register.go | 53 ++++++ .../versioned/typed/example}/v1/doc.go | 0 .../typed/example/v1/example_client.go | 88 +++++++++ .../versioned/typed/example}/v1/fake/doc.go | 0 .../example/v1/fake/fake_example_client.go} | 8 +- .../typed/example/v1/fake/fake_testtype.go | 138 ++++++++++++++ .../typed/example}/v1/generated_expansion.go | 0 .../versioned/typed/example/v1/testtype.go | 172 ++++++++++++++++++ .../externalversions/example/interface.go | 44 +++++ .../externalversions/example/v1/interface.go | 43 +++++ .../externalversions/example/v1/testtype.go | 73 ++++++++ .../informers/externalversions/factory.go | 118 ++++++++++++ .../informers/externalversions/generic.go | 61 +++++++ .../internalinterfaces/factory_interfaces.go | 4 +- .../internalversion/example}/interface.go | 6 +- .../example}/internalversion/interface.go | 2 +- .../example}/internalversion/testtype.go | 20 +- .../informers/internalversion/factory.go | 16 +- .../informers/internalversion/generic.go | 8 +- .../internalinterfaces/factory_interfaces.go | 4 +- .../internalversion/expansion_generated.go | 0 .../example}/internalversion/testtype.go | 22 +-- .../example}/v1/expansion_generated.go | 0 .../apiserver/listers/example/v1/testtype.go | 94 ++++++++++ .../apis/example/v1/zz_generated.deepcopy.go | 130 +++++++++++++ .../crd/clientset/versioned/clientset.go | 98 ++++++++++ .../clientset/versioned}/doc.go | 2 +- .../versioned/fake/clientset_generated.go | 18 +- .../crd/clientset/versioned}/fake/doc.go | 0 .../clientset/versioned/fake/register.go | 4 +- .../crd/clientset/versioned}/scheme/doc.go | 0 .../clientset/versioned/scheme/register.go | 4 +- .../versioned/typed/example/v1/doc.go | 20 ++ .../typed/example/v1/example_client.go} | 30 +-- .../versioned/typed/example/v1}/fake/doc.go | 0 .../example/v1/fake/fake_example_client.go} | 8 +- .../typed/example}/v1/fake/fake_testtype.go | 50 ++--- .../typed/example/v1/generated_expansion.go | 19 ++ .../versioned/typed/example}/v1/testtype.go | 6 +- .../externalversions/example}/interface.go | 6 +- .../externalversions/example}/v1/interface.go | 2 +- .../externalversions/example}/v1/testtype.go | 16 +- .../informers/externalversions/factory.go | 12 +- .../informers/externalversions/generic.go | 6 +- .../internalinterfaces/factory_interfaces.go | 4 +- .../listers/example/v1/expansion_generated.go | 27 +++ .../listers/example}/v1/testtype.go | 2 +- staging/src/k8s.io/sample-apiserver/BUILD | 12 +- .../pkg/admission/plugin/banflunder/BUILD | 8 +- .../pkg/admission/wardleinitializer/BUILD | 6 +- .../pkg/apis/wardle/v1alpha1/BUILD | 1 + .../wardle/v1alpha1/zz_generated.defaults.go | 32 ++++ .../internalversion}/BUILD | 17 +- .../internalversion}/clientset.go | 4 +- .../client/clientset/internalversion/doc.go | 20 ++ .../internalversion}/fake/BUILD | 15 +- .../fake/clientset_generated.go | 6 +- .../internalversion}/fake/doc.go | 0 .../internalversion}/fake/register.go | 0 .../internalversion}/scheme/BUILD | 9 +- .../internalversion}/scheme/doc.go | 0 .../internalversion}/scheme/register.go | 0 .../typed/wardle/internalversion/BUILD | 13 +- .../typed/wardle/internalversion/doc.go | 0 .../typed/wardle/internalversion/fake/BUILD | 11 +- .../typed/wardle/internalversion/fake/doc.go | 0 .../internalversion/fake/fake_fischer.go | 0 .../internalversion/fake/fake_flunder.go | 0 .../fake/fake_wardle_client.go | 2 +- .../typed/wardle/internalversion/fischer.go | 2 +- .../typed/wardle/internalversion/flunder.go | 2 +- .../internalversion/generated_expansion.go | 0 .../wardle/internalversion/wardle_client.go | 2 +- .../clientset => clientset/versioned}/BUILD | 17 +- .../versioned}/clientset.go | 4 +- .../clientset => clientset/versioned}/doc.go | 2 +- .../versioned}/fake/BUILD | 15 +- .../versioned}/fake/clientset_generated.go | 6 +- .../client/clientset/versioned/fake/doc.go | 20 ++ .../versioned}/fake/register.go | 0 .../versioned}/scheme/BUILD | 9 +- .../client/clientset/versioned/scheme/doc.go | 20 ++ .../versioned}/scheme/register.go | 0 .../versioned}/typed/wardle/v1alpha1/BUILD | 13 +- .../versioned}/typed/wardle/v1alpha1/doc.go | 0 .../typed/wardle/v1alpha1/fake/BUILD | 11 +- .../typed/wardle/v1alpha1/fake/doc.go | 20 ++ .../wardle/v1alpha1/fake/fake_fischer.go | 0 .../wardle/v1alpha1/fake/fake_flunder.go | 0 .../v1alpha1/fake/fake_wardle_client.go | 2 +- .../typed/wardle/v1alpha1/fischer.go | 2 +- .../typed/wardle/v1alpha1/flunder.go | 2 +- .../wardle/v1alpha1/generated_expansion.go | 0 .../typed/wardle/v1alpha1/wardle_client.go | 2 +- .../externalversions/BUILD | 19 +- .../externalversions/factory.go | 10 +- .../externalversions/generic.go | 0 .../internalinterfaces/BUILD | 11 +- .../internalinterfaces/factory_interfaces.go | 2 +- .../informers/externalversions/wardle/BUILD | 28 +++ .../externalversions/wardle/interface.go | 4 +- .../externalversions/wardle/v1alpha1/BUILD | 15 +- .../wardle/v1alpha1/fischer.go | 10 +- .../wardle/v1alpha1/flunder.go | 10 +- .../wardle/v1alpha1/interface.go | 2 +- .../internalversion/BUILD | 19 +- .../internalversion/factory.go | 10 +- .../internalversion/generic.go | 0 .../internalversion}/internalinterfaces/BUILD | 11 +- .../internalinterfaces/factory_interfaces.go | 34 ++++ .../informers/internalversion/wardle/BUILD | 28 +++ .../internalversion/wardle/interface.go | 4 +- .../wardle/internalversion/BUILD | 15 +- .../wardle/internalversion/fischer.go | 10 +- .../wardle/internalversion/flunder.go | 10 +- .../wardle/internalversion/interface.go | 2 +- .../externalversions/wardle/BUILD | 31 ---- .../internalversion/wardle/BUILD | 31 ---- .../wardle/internalversion/BUILD | 9 +- .../internalversion/expansion_generated.go | 0 .../wardle/internalversion/fischer.go | 0 .../wardle/internalversion/flunder.go | 0 .../wardle/v1alpha1/BUILD | 9 +- .../wardle/v1alpha1/expansion_generated.go | 0 .../wardle/v1alpha1/fischer.go | 0 .../wardle/v1alpha1/flunder.go | 0 .../sample-apiserver/pkg/cmd/server/BUILD | 4 +- 151 files changed, 2158 insertions(+), 505 deletions(-) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversion.go create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversions.go rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => apiserver/apis/example}/v1/zz_generated.deepcopy.go (100%) rename staging/src/k8s.io/code-generator/_examples/{apis/testgroup => apiserver/apis/example}/zz_generated.deepcopy.go (99%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal => apiserver/clientset/internalversion}/clientset.go (79%) rename staging/src/k8s.io/{sample-apiserver/pkg/client/clientset_generated/internalclientset => code-generator/_examples/apiserver/clientset/internalversion}/doc.go (96%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal => apiserver/clientset/internalversion}/fake/clientset_generated.go (79%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal => apiserver/clientset/internalversion}/fake/doc.go (100%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/register.go rename staging/src/k8s.io/code-generator/_examples/{clientset/internal => apiserver/clientset/internalversion}/scheme/doc.go (100%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal => apiserver/clientset/internalversion}/scheme/register.go (92%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal/typed/testgroup => apiserver/clientset/internalversion/typed/example}/internalversion/doc.go (100%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal/typed/testgroup/internalversion/testgroup_client.go => apiserver/clientset/internalversion/typed/example/internalversion/example_client.go} (66%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal/typed/testgroup => apiserver/clientset/internalversion/typed/example}/internalversion/fake/doc.go (100%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_example_client.go rename staging/src/k8s.io/code-generator/_examples/{clientset/internal/typed/testgroup => apiserver/clientset/internalversion/typed/example}/internalversion/fake/fake_testtype.go (71%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal/typed/testgroup => apiserver/clientset/internalversion/typed/example}/internalversion/generated_expansion.go (100%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal/typed/testgroup => apiserver/clientset/internalversion/typed/example}/internalversion/testtype.go (77%) rename staging/src/k8s.io/code-generator/_examples/{ => apiserver}/clientset/versioned/clientset.go (77%) rename staging/src/k8s.io/code-generator/_examples/{ => apiserver}/clientset/versioned/doc.go (100%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/clientset_generated.go rename staging/src/k8s.io/code-generator/_examples/{ => apiserver}/clientset/versioned/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal => apiserver/clientset/versioned}/fake/register.go (93%) rename staging/src/k8s.io/code-generator/_examples/{ => apiserver}/clientset/versioned/scheme/doc.go (100%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/register.go rename staging/src/k8s.io/code-generator/_examples/{clientset/versioned/typed/testgroup => apiserver/clientset/versioned/typed/example}/v1/doc.go (100%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/example_client.go rename staging/src/k8s.io/code-generator/_examples/{clientset/versioned/typed/testgroup => apiserver/clientset/versioned/typed/example}/v1/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/_examples/{clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go => apiserver/clientset/versioned/typed/example/v1/fake/fake_example_client.go} (76%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_testtype.go rename staging/src/k8s.io/code-generator/_examples/{clientset/versioned/typed/testgroup => apiserver/clientset/versioned/typed/example}/v1/generated_expansion.go (100%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/testtype.go create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/interface.go create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/interface.go create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/testtype.go create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/factory.go create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/generic.go rename staging/src/k8s.io/{sample-apiserver/pkg/client/informers_generated => code-generator/_examples/apiserver/informers}/externalversions/internalinterfaces/factory_interfaces.go (88%) rename staging/src/k8s.io/code-generator/_examples/{informers/internalversion/testgroup => apiserver/informers/internalversion/example}/interface.go (83%) rename staging/src/k8s.io/code-generator/_examples/{informers/internalversion/testgroup => apiserver/informers/internalversion/example}/internalversion/interface.go (91%) rename staging/src/k8s.io/code-generator/_examples/{informers/internalversion/testgroup => apiserver/informers/internalversion/example}/internalversion/testtype.go (68%) rename staging/src/k8s.io/code-generator/_examples/{ => apiserver}/informers/internalversion/factory.go (85%) rename staging/src/k8s.io/code-generator/_examples/{ => apiserver}/informers/internalversion/generic.go (88%) rename staging/src/k8s.io/{sample-apiserver/pkg/client/informers_generated => code-generator/_examples/apiserver/informers}/internalversion/internalinterfaces/factory_interfaces.go (84%) rename staging/src/k8s.io/code-generator/_examples/{listers/testgroup => apiserver/listers/example}/internalversion/expansion_generated.go (100%) rename staging/src/k8s.io/code-generator/_examples/{listers/testgroup => apiserver/listers/example}/internalversion/testtype.go (81%) rename staging/src/k8s.io/code-generator/_examples/{listers/testgroup => apiserver/listers/example}/v1/expansion_generated.go (100%) create mode 100644 staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/v1/testtype.go create mode 100644 staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/zz_generated.deepcopy.go create mode 100644 staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/clientset.go rename staging/src/k8s.io/code-generator/_examples/{clientset/internal => crd/clientset/versioned}/doc.go (97%) rename staging/src/k8s.io/code-generator/_examples/{ => crd}/clientset/versioned/fake/clientset_generated.go (77%) rename staging/src/k8s.io/{sample-apiserver/pkg/client/clientset_generated/clientset => code-generator/_examples/crd/clientset/versioned}/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/_examples/{ => crd}/clientset/versioned/fake/register.go (94%) rename staging/src/k8s.io/{sample-apiserver/pkg/client/clientset_generated/clientset => code-generator/_examples/crd/clientset/versioned}/scheme/doc.go (100%) rename staging/src/k8s.io/code-generator/_examples/{ => crd}/clientset/versioned/scheme/register.go (94%) create mode 100644 staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/doc.go rename staging/src/k8s.io/code-generator/_examples/{clientset/versioned/typed/testgroup/v1/testgroup_client.go => crd/clientset/versioned/typed/example/v1/example_client.go} (64%) rename staging/src/k8s.io/{sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1 => code-generator/_examples/crd/clientset/versioned/typed/example/v1}/fake/doc.go (100%) rename staging/src/k8s.io/code-generator/_examples/{clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go => crd/clientset/versioned/typed/example/v1/fake/fake_example_client.go} (78%) rename staging/src/k8s.io/code-generator/_examples/{clientset/versioned/typed/testgroup => crd/clientset/versioned/typed/example}/v1/fake/fake_testtype.go (70%) create mode 100644 staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/generated_expansion.go rename staging/src/k8s.io/code-generator/_examples/{clientset/versioned/typed/testgroup => crd/clientset/versioned/typed/example}/v1/testtype.go (96%) rename staging/src/k8s.io/code-generator/_examples/{informers/externalversions/testgroup => crd/informers/externalversions/example}/interface.go (84%) rename staging/src/k8s.io/code-generator/_examples/{informers/externalversions/testgroup => crd/informers/externalversions/example}/v1/interface.go (91%) rename staging/src/k8s.io/code-generator/_examples/{informers/externalversions/testgroup => crd/informers/externalversions/example}/v1/testtype.go (80%) rename staging/src/k8s.io/code-generator/_examples/{ => crd}/informers/externalversions/factory.go (90%) rename staging/src/k8s.io/code-generator/_examples/{ => crd}/informers/externalversions/generic.go (92%) rename staging/src/k8s.io/code-generator/_examples/{informers/internalversion => crd/informers/externalversions}/internalinterfaces/factory_interfaces.go (86%) create mode 100644 staging/src/k8s.io/code-generator/_examples/crd/listers/example/v1/expansion_generated.go rename staging/src/k8s.io/code-generator/_examples/{listers/testgroup => crd/listers/example}/v1/testtype.go (98%) create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.defaults.go rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/BUILD (65%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/clientset.go (96%) create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/doc.go rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/fake/BUILD (67%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/fake/clientset_generated.go (91%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/fake/doc.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/fake/register.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/scheme/BUILD (87%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/scheme/doc.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/scheme/register.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/BUILD (73%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/doc.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/fake/BUILD (78%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/fake/doc.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/fake/fake_fischer.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/fake/fake_flunder.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/fake/fake_wardle_client.go (90%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/fischer.go (98%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/flunder.go (98%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/generated_expansion.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/internalclientset => clientset/internalversion}/typed/wardle/internalversion/wardle_client.go (96%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/BUILD (68%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/clientset.go (96%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/doc.go (97%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/fake/BUILD (68%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/fake/clientset_generated.go (91%) create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/doc.go rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/fake/register.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/scheme/BUILD (84%) create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/doc.go rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/scheme/register.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/BUILD (76%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/doc.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/fake/BUILD (79%) create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/doc.go rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/fake/fake_fischer.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/fake/fake_flunder.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/fake/fake_wardle_client.go (92%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/fischer.go (98%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/flunder.go (98%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/generated_expansion.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{clientset_generated/clientset => clientset/versioned}/typed/wardle/v1alpha1/wardle_client.go (97%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/BUILD (58%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/factory.go (91%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/generic.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated/internalversion => informers/externalversions}/internalinterfaces/BUILD (67%) rename staging/src/k8s.io/{code-generator/_examples => sample-apiserver/pkg/client}/informers/externalversions/internalinterfaces/factory_interfaces.go (94%) create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/BUILD rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/wardle/interface.go (89%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/wardle/v1alpha1/BUILD (62%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/wardle/v1alpha1/fischer.go (87%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/wardle/v1alpha1/flunder.go (87%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/externalversions/wardle/v1alpha1/interface.go (96%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/BUILD (57%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/factory.go (89%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/generic.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated/externalversions => informers/internalversion}/internalinterfaces/BUILD (66%) create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go create mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/BUILD rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/wardle/interface.go (89%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/wardle/internalversion/BUILD (61%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/wardle/internalversion/fischer.go (81%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/wardle/internalversion/flunder.go (81%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{informers_generated => informers}/internalversion/wardle/internalversion/interface.go (96%) delete mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD delete mode 100644 staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/internalversion/BUILD (84%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/internalversion/expansion_generated.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/internalversion/fischer.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/internalversion/flunder.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/v1alpha1/BUILD (84%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/v1alpha1/expansion_generated.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/v1alpha1/fischer.go (100%) rename staging/src/k8s.io/sample-apiserver/pkg/client/{listers_generated => listers}/wardle/v1alpha1/flunder.go (100%) diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversion.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversion.go new file mode 100644 index 00000000000..183921e9dc7 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversion.go @@ -0,0 +1,113 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by conversion-gen. Do not edit it manually! + +package v1 + +import ( + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + example "k8s.io/code-generator/_examples/apiserver/apis/example" + unsafe "unsafe" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(scheme *runtime.Scheme) error { + return scheme.AddGeneratedConversionFuncs( + Convert_v1_TestType_To_example_TestType, + Convert_example_TestType_To_v1_TestType, + Convert_v1_TestTypeList_To_example_TestTypeList, + Convert_example_TestTypeList_To_v1_TestTypeList, + Convert_v1_TestTypeStatus_To_example_TestTypeStatus, + Convert_example_TestTypeStatus_To_v1_TestTypeStatus, + ) +} + +func autoConvert_v1_TestType_To_example_TestType(in *TestType, out *example.TestType, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1_TestTypeStatus_To_example_TestTypeStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1_TestType_To_example_TestType is an autogenerated conversion function. +func Convert_v1_TestType_To_example_TestType(in *TestType, out *example.TestType, s conversion.Scope) error { + return autoConvert_v1_TestType_To_example_TestType(in, out, s) +} + +func autoConvert_example_TestType_To_v1_TestType(in *example.TestType, out *TestType, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_example_TestTypeStatus_To_v1_TestTypeStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_example_TestType_To_v1_TestType is an autogenerated conversion function. +func Convert_example_TestType_To_v1_TestType(in *example.TestType, out *TestType, s conversion.Scope) error { + return autoConvert_example_TestType_To_v1_TestType(in, out, s) +} + +func autoConvert_v1_TestTypeList_To_example_TestTypeList(in *TestTypeList, out *example.TestTypeList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]example.TestType)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1_TestTypeList_To_example_TestTypeList is an autogenerated conversion function. +func Convert_v1_TestTypeList_To_example_TestTypeList(in *TestTypeList, out *example.TestTypeList, s conversion.Scope) error { + return autoConvert_v1_TestTypeList_To_example_TestTypeList(in, out, s) +} + +func autoConvert_example_TestTypeList_To_v1_TestTypeList(in *example.TestTypeList, out *TestTypeList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]TestType)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_example_TestTypeList_To_v1_TestTypeList is an autogenerated conversion function. +func Convert_example_TestTypeList_To_v1_TestTypeList(in *example.TestTypeList, out *TestTypeList, s conversion.Scope) error { + return autoConvert_example_TestTypeList_To_v1_TestTypeList(in, out, s) +} + +func autoConvert_v1_TestTypeStatus_To_example_TestTypeStatus(in *TestTypeStatus, out *example.TestTypeStatus, s conversion.Scope) error { + out.Blah = in.Blah + return nil +} + +// Convert_v1_TestTypeStatus_To_example_TestTypeStatus is an autogenerated conversion function. +func Convert_v1_TestTypeStatus_To_example_TestTypeStatus(in *TestTypeStatus, out *example.TestTypeStatus, s conversion.Scope) error { + return autoConvert_v1_TestTypeStatus_To_example_TestTypeStatus(in, out, s) +} + +func autoConvert_example_TestTypeStatus_To_v1_TestTypeStatus(in *example.TestTypeStatus, out *TestTypeStatus, s conversion.Scope) error { + out.Blah = in.Blah + return nil +} + +// Convert_example_TestTypeStatus_To_v1_TestTypeStatus is an autogenerated conversion function. +func Convert_example_TestTypeStatus_To_v1_TestTypeStatus(in *example.TestTypeStatus, out *TestTypeStatus, s conversion.Scope) error { + return autoConvert_example_TestTypeStatus_To_v1_TestTypeStatus(in, out, s) +} diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversions.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversions.go new file mode 100644 index 00000000000..183921e9dc7 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.conversions.go @@ -0,0 +1,113 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by conversion-gen. Do not edit it manually! + +package v1 + +import ( + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + example "k8s.io/code-generator/_examples/apiserver/apis/example" + unsafe "unsafe" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(scheme *runtime.Scheme) error { + return scheme.AddGeneratedConversionFuncs( + Convert_v1_TestType_To_example_TestType, + Convert_example_TestType_To_v1_TestType, + Convert_v1_TestTypeList_To_example_TestTypeList, + Convert_example_TestTypeList_To_v1_TestTypeList, + Convert_v1_TestTypeStatus_To_example_TestTypeStatus, + Convert_example_TestTypeStatus_To_v1_TestTypeStatus, + ) +} + +func autoConvert_v1_TestType_To_example_TestType(in *TestType, out *example.TestType, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_v1_TestTypeStatus_To_example_TestTypeStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_v1_TestType_To_example_TestType is an autogenerated conversion function. +func Convert_v1_TestType_To_example_TestType(in *TestType, out *example.TestType, s conversion.Scope) error { + return autoConvert_v1_TestType_To_example_TestType(in, out, s) +} + +func autoConvert_example_TestType_To_v1_TestType(in *example.TestType, out *TestType, s conversion.Scope) error { + out.ObjectMeta = in.ObjectMeta + if err := Convert_example_TestTypeStatus_To_v1_TestTypeStatus(&in.Status, &out.Status, s); err != nil { + return err + } + return nil +} + +// Convert_example_TestType_To_v1_TestType is an autogenerated conversion function. +func Convert_example_TestType_To_v1_TestType(in *example.TestType, out *TestType, s conversion.Scope) error { + return autoConvert_example_TestType_To_v1_TestType(in, out, s) +} + +func autoConvert_v1_TestTypeList_To_example_TestTypeList(in *TestTypeList, out *example.TestTypeList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]example.TestType)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_v1_TestTypeList_To_example_TestTypeList is an autogenerated conversion function. +func Convert_v1_TestTypeList_To_example_TestTypeList(in *TestTypeList, out *example.TestTypeList, s conversion.Scope) error { + return autoConvert_v1_TestTypeList_To_example_TestTypeList(in, out, s) +} + +func autoConvert_example_TestTypeList_To_v1_TestTypeList(in *example.TestTypeList, out *TestTypeList, s conversion.Scope) error { + out.ListMeta = in.ListMeta + out.Items = *(*[]TestType)(unsafe.Pointer(&in.Items)) + return nil +} + +// Convert_example_TestTypeList_To_v1_TestTypeList is an autogenerated conversion function. +func Convert_example_TestTypeList_To_v1_TestTypeList(in *example.TestTypeList, out *TestTypeList, s conversion.Scope) error { + return autoConvert_example_TestTypeList_To_v1_TestTypeList(in, out, s) +} + +func autoConvert_v1_TestTypeStatus_To_example_TestTypeStatus(in *TestTypeStatus, out *example.TestTypeStatus, s conversion.Scope) error { + out.Blah = in.Blah + return nil +} + +// Convert_v1_TestTypeStatus_To_example_TestTypeStatus is an autogenerated conversion function. +func Convert_v1_TestTypeStatus_To_example_TestTypeStatus(in *TestTypeStatus, out *example.TestTypeStatus, s conversion.Scope) error { + return autoConvert_v1_TestTypeStatus_To_example_TestTypeStatus(in, out, s) +} + +func autoConvert_example_TestTypeStatus_To_v1_TestTypeStatus(in *example.TestTypeStatus, out *TestTypeStatus, s conversion.Scope) error { + out.Blah = in.Blah + return nil +} + +// Convert_example_TestTypeStatus_To_v1_TestTypeStatus is an autogenerated conversion function. +func Convert_example_TestTypeStatus_To_v1_TestTypeStatus(in *example.TestTypeStatus, out *TestTypeStatus, s conversion.Scope) error { + return autoConvert_example_TestTypeStatus_To_v1_TestTypeStatus(in, out, s) +} diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.deepcopy.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/v1/zz_generated.deepcopy.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/v1/zz_generated.deepcopy.go diff --git a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/zz_generated.deepcopy.go b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/zz_generated.deepcopy.go similarity index 99% rename from staging/src/k8s.io/code-generator/_examples/apis/testgroup/zz_generated.deepcopy.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/zz_generated.deepcopy.go index e1c897c5cb9..7a43d92ba84 100644 --- a/staging/src/k8s.io/code-generator/_examples/apis/testgroup/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/apis/example/zz_generated.deepcopy.go @@ -18,7 +18,7 @@ limitations under the License. // This file was autogenerated by deepcopy-gen. Do not edit it manually! -package testgroup +package example import ( conversion "k8s.io/apimachinery/pkg/conversion" diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/clientset.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/clientset.go similarity index 79% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/clientset.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/clientset.go index 78eaad4ee14..5b3d1ddf8b3 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/clientset.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/clientset.go @@ -14,31 +14,31 @@ See the License for the specific language governing permissions and limitations under the License. */ -package internal +package internalversion import ( glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" - testgroupinternalversion "k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion" + exampleinternalversion "k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion" ) type Interface interface { Discovery() discovery.DiscoveryInterface - Testgroup() testgroupinternalversion.TestgroupInterface + Example() exampleinternalversion.ExampleInterface } // Clientset contains the clients for groups. Each group has exactly one // version included in a Clientset. type Clientset struct { *discovery.DiscoveryClient - testgroup *testgroupinternalversion.TestgroupClient + example *exampleinternalversion.ExampleClient } -// Testgroup retrieves the TestgroupClient -func (c *Clientset) Testgroup() testgroupinternalversion.TestgroupInterface { - return c.testgroup +// Example retrieves the ExampleClient +func (c *Clientset) Example() exampleinternalversion.ExampleInterface { + return c.example } // Discovery retrieves the DiscoveryClient @@ -57,7 +57,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { } var cs Clientset var err error - cs.testgroup, err = testgroupinternalversion.NewForConfig(&configShallowCopy) + cs.example, err = exampleinternalversion.NewForConfig(&configShallowCopy) if err != nil { return nil, err } @@ -74,7 +74,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset - cs.testgroup = testgroupinternalversion.NewForConfigOrDie(c) + cs.example = exampleinternalversion.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) return &cs @@ -83,7 +83,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { // New creates a new Clientset for the given RESTClient. func New(c rest.Interface) *Clientset { var cs Clientset - cs.testgroup = testgroupinternalversion.New(c) + cs.example = exampleinternalversion.New(c) cs.DiscoveryClient = discovery.NewDiscoveryClient(c) return &cs diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/doc.go similarity index 96% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/doc.go index 309c091bfd3..b8eadd1e118 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/doc.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/doc.go @@ -17,4 +17,4 @@ limitations under the License. // This package is generated by client-gen with custom arguments. // This package has the automatically generated clientset. -package internalclientset +package internalversion diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/clientset_generated.go similarity index 79% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/clientset_generated.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/clientset_generated.go index 6d91a6c7931..846946cd141 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/clientset_generated.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/clientset_generated.go @@ -22,9 +22,9 @@ import ( "k8s.io/client-go/discovery" fakediscovery "k8s.io/client-go/discovery/fake" "k8s.io/client-go/testing" - clientset "k8s.io/code-generator/_test/clientset/internal" - testgroupinternalversion "k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion" - faketestgroupinternalversion "k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion/fake" + clientset "k8s.io/code-generator/_examples/apiserver/clientset/internalversion" + exampleinternalversion "k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion" + fakeexampleinternalversion "k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake" ) // NewSimpleClientset returns a clientset that will respond with the provided objects. @@ -60,7 +60,7 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { var _ clientset.Interface = &Clientset{} -// Testgroup retrieves the TestgroupClient -func (c *Clientset) Testgroup() testgroupinternalversion.TestgroupInterface { - return &faketestgroupinternalversion.FakeTestgroup{Fake: &c.Fake} +// Example retrieves the ExampleClient +func (c *Clientset) Example() exampleinternalversion.ExampleInterface { + return &fakeexampleinternalversion.FakeExample{Fake: &c.Fake} } diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/register.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/register.go new file mode 100644 index 00000000000..0c5d7adda58 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/fake/register.go @@ -0,0 +1,53 @@ +/* +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 fake + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + exampleinternalversion "k8s.io/code-generator/_examples/apiserver/apis/example" +) + +var scheme = runtime.NewScheme() +var codecs = serializer.NewCodecFactory(scheme) +var parameterCodec = runtime.NewParameterCodec(scheme) + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(scheme) +} + +// AddToScheme adds all types of this clientset into the given scheme. This allows composition +// of clientsets, like in: +// +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kuberentes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) +// +// kclientset, _ := kubernetes.NewForConfig(c) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// +// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types +// correctly. +func AddToScheme(scheme *runtime.Scheme) { + exampleinternalversion.AddToScheme(scheme) + +} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/register.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go similarity index 92% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/register.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go index 33dc7e92958..6a02008bca6 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/scheme/register.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go @@ -23,7 +23,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroup "k8s.io/code-generator/_test/apis/testgroup/install" + example "k8s.io/code-generator/_examples/apiserver/apis/example/install" os "os" ) @@ -41,6 +41,6 @@ func init() { // Install registers the API group and adds types to a scheme func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { - testgroup.Install(groupFactoryRegistry, registry, scheme) + example.Install(groupFactoryRegistry, registry, scheme) } diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/example_client.go similarity index 66% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/example_client.go index bd5878b5a4e..b2c73bb9a00 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testgroup_client.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/example_client.go @@ -18,25 +18,25 @@ package internalversion import ( rest "k8s.io/client-go/rest" - "k8s.io/code-generator/_test/clientset/internal/scheme" + "k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme" ) -type TestgroupInterface interface { +type ExampleInterface interface { RESTClient() rest.Interface TestTypesGetter } -// TestgroupClient is used to interact with features provided by the testgroup.k8s.io group. -type TestgroupClient struct { +// ExampleClient is used to interact with features provided by the example.apiserver.code-generator.k8s.io group. +type ExampleClient struct { restClient rest.Interface } -func (c *TestgroupClient) TestTypes(namespace string) TestTypeInterface { +func (c *ExampleClient) TestTypes(namespace string) TestTypeInterface { return newTestTypes(c, namespace) } -// NewForConfig creates a new TestgroupClient for the given config. -func NewForConfig(c *rest.Config) (*TestgroupClient, error) { +// NewForConfig creates a new ExampleClient for the given config. +func NewForConfig(c *rest.Config) (*ExampleClient, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -45,12 +45,12 @@ func NewForConfig(c *rest.Config) (*TestgroupClient, error) { if err != nil { return nil, err } - return &TestgroupClient{client}, nil + return &ExampleClient{client}, nil } -// NewForConfigOrDie creates a new TestgroupClient for the given config and +// NewForConfigOrDie creates a new ExampleClient for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *TestgroupClient { +func NewForConfigOrDie(c *rest.Config) *ExampleClient { client, err := NewForConfig(c) if err != nil { panic(err) @@ -58,13 +58,13 @@ func NewForConfigOrDie(c *rest.Config) *TestgroupClient { return client } -// New creates a new TestgroupClient for the given RESTClient. -func New(c rest.Interface) *TestgroupClient { - return &TestgroupClient{c} +// New creates a new ExampleClient for the given RESTClient. +func New(c rest.Interface) *ExampleClient { + return &ExampleClient{c} } func setConfigDefaults(config *rest.Config) error { - g, err := scheme.Registry.Group("testgroup.k8s.io") + g, err := scheme.Registry.Group("example.apiserver.code-generator.k8s.io") if err != nil { return err } @@ -91,7 +91,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *TestgroupClient) RESTClient() rest.Interface { +func (c *ExampleClient) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_example_client.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_example_client.go new file mode 100644 index 00000000000..c0973fb8f29 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_example_client.go @@ -0,0 +1,38 @@ +/* +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 fake + +import ( + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" + internalversion "k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion" +) + +type FakeExample struct { + *testing.Fake +} + +func (c *FakeExample) TestTypes(namespace string) internalversion.TestTypeInterface { + return &FakeTestTypes{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeExample) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_testtype.go similarity index 71% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_testtype.go index e43ca06b7e3..df00542e9b6 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/fake/fake_testtype.go @@ -23,34 +23,34 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" - testgroup "k8s.io/code-generator/_test/apis/testgroup" + example "k8s.io/code-generator/_examples/apiserver/apis/example" ) // FakeTestTypes implements TestTypeInterface type FakeTestTypes struct { - Fake *FakeTestgroup + Fake *FakeExample ns string } -var testtypesResource = schema.GroupVersionResource{Group: "testgroup.k8s.io", Version: "", Resource: "testtypes"} +var testtypesResource = schema.GroupVersionResource{Group: "example.apiserver.code-generator.k8s.io", Version: "", Resource: "testtypes"} -var testtypesKind = schema.GroupVersionKind{Group: "testgroup.k8s.io", Version: "", Kind: "TestType"} +var testtypesKind = schema.GroupVersionKind{Group: "example.apiserver.code-generator.k8s.io", Version: "", Kind: "TestType"} // Get takes name of the testType, and returns the corresponding testType object, and an error if there is any. -func (c *FakeTestTypes) Get(name string, options v1.GetOptions) (result *testgroup.TestType, err error) { +func (c *FakeTestTypes) Get(name string, options v1.GetOptions) (result *example.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewGetAction(testtypesResource, c.ns, name), &testgroup.TestType{}) + Invokes(testing.NewGetAction(testtypesResource, c.ns, name), &example.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup.TestType), err + return obj.(*example.TestType), err } // List takes label and field selectors, and returns the list of TestTypes that match those selectors. -func (c *FakeTestTypes) List(opts v1.ListOptions) (result *testgroup.TestTypeList, err error) { +func (c *FakeTestTypes) List(opts v1.ListOptions) (result *example.TestTypeList, err error) { obj, err := c.Fake. - Invokes(testing.NewListAction(testtypesResource, testtypesKind, c.ns, opts), &testgroup.TestTypeList{}) + Invokes(testing.NewListAction(testtypesResource, testtypesKind, c.ns, opts), &example.TestTypeList{}) if obj == nil { return nil, err @@ -60,8 +60,8 @@ func (c *FakeTestTypes) List(opts v1.ListOptions) (result *testgroup.TestTypeLis if label == nil { label = labels.Everything() } - list := &testgroup.TestTypeList{} - for _, item := range obj.(*testgroup.TestTypeList).Items { + list := &example.TestTypeList{} + for _, item := range obj.(*example.TestTypeList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) } @@ -77,43 +77,43 @@ func (c *FakeTestTypes) Watch(opts v1.ListOptions) (watch.Interface, error) { } // Create takes the representation of a testType and creates it. Returns the server's representation of the testType, and an error, if there is any. -func (c *FakeTestTypes) Create(testType *testgroup.TestType) (result *testgroup.TestType, err error) { +func (c *FakeTestTypes) Create(testType *example.TestType) (result *example.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewCreateAction(testtypesResource, c.ns, testType), &testgroup.TestType{}) + Invokes(testing.NewCreateAction(testtypesResource, c.ns, testType), &example.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup.TestType), err + return obj.(*example.TestType), err } // Update takes the representation of a testType and updates it. Returns the server's representation of the testType, and an error, if there is any. -func (c *FakeTestTypes) Update(testType *testgroup.TestType) (result *testgroup.TestType, err error) { +func (c *FakeTestTypes) Update(testType *example.TestType) (result *example.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewUpdateAction(testtypesResource, c.ns, testType), &testgroup.TestType{}) + Invokes(testing.NewUpdateAction(testtypesResource, c.ns, testType), &example.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup.TestType), err + return obj.(*example.TestType), err } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeTestTypes) UpdateStatus(testType *testgroup.TestType) (*testgroup.TestType, error) { +func (c *FakeTestTypes) UpdateStatus(testType *example.TestType) (*example.TestType, error) { obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(testtypesResource, "status", c.ns, testType), &testgroup.TestType{}) + Invokes(testing.NewUpdateSubresourceAction(testtypesResource, "status", c.ns, testType), &example.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup.TestType), err + return obj.(*example.TestType), err } // Delete takes name of the testType and deletes it. Returns an error if one occurs. func (c *FakeTestTypes) Delete(name string, options *v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(testtypesResource, c.ns, name), &testgroup.TestType{}) + Invokes(testing.NewDeleteAction(testtypesResource, c.ns, name), &example.TestType{}) return err } @@ -122,17 +122,17 @@ func (c *FakeTestTypes) Delete(name string, options *v1.DeleteOptions) error { func (c *FakeTestTypes) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { action := testing.NewDeleteCollectionAction(testtypesResource, c.ns, listOptions) - _, err := c.Fake.Invokes(action, &testgroup.TestTypeList{}) + _, err := c.Fake.Invokes(action, &example.TestTypeList{}) return err } // Patch applies the patch and returns the patched testType. -func (c *FakeTestTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup.TestType, err error) { +func (c *FakeTestTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *example.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(testtypesResource, c.ns, name, data, subresources...), &testgroup.TestType{}) + Invokes(testing.NewPatchSubresourceAction(testtypesResource, c.ns, name, data, subresources...), &example.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup.TestType), err + return obj.(*example.TestType), err } diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/generated_expansion.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/generated_expansion.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/generated_expansion.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/testtype.go similarity index 77% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/testtype.go index 1f361461252..ad30acf3ef8 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/typed/example/internalversion/testtype.go @@ -21,8 +21,8 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" - testgroup "k8s.io/code-generator/_test/apis/testgroup" - scheme "k8s.io/code-generator/_test/clientset/internal/scheme" + example "k8s.io/code-generator/_examples/apiserver/apis/example" + scheme "k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme" ) // TestTypesGetter has a method to return a TestTypeInterface. @@ -33,15 +33,15 @@ type TestTypesGetter interface { // TestTypeInterface has methods to work with TestType resources. type TestTypeInterface interface { - Create(*testgroup.TestType) (*testgroup.TestType, error) - Update(*testgroup.TestType) (*testgroup.TestType, error) - UpdateStatus(*testgroup.TestType) (*testgroup.TestType, error) + Create(*example.TestType) (*example.TestType, error) + Update(*example.TestType) (*example.TestType, error) + UpdateStatus(*example.TestType) (*example.TestType, error) Delete(name string, options *v1.DeleteOptions) error DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error - Get(name string, options v1.GetOptions) (*testgroup.TestType, error) - List(opts v1.ListOptions) (*testgroup.TestTypeList, error) + Get(name string, options v1.GetOptions) (*example.TestType, error) + List(opts v1.ListOptions) (*example.TestTypeList, error) Watch(opts v1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup.TestType, err error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *example.TestType, err error) TestTypeExpansion } @@ -52,7 +52,7 @@ type testTypes struct { } // newTestTypes returns a TestTypes -func newTestTypes(c *TestgroupClient, namespace string) *testTypes { +func newTestTypes(c *ExampleClient, namespace string) *testTypes { return &testTypes{ client: c.RESTClient(), ns: namespace, @@ -60,8 +60,8 @@ func newTestTypes(c *TestgroupClient, namespace string) *testTypes { } // Get takes name of the testType, and returns the corresponding testType object, and an error if there is any. -func (c *testTypes) Get(name string, options v1.GetOptions) (result *testgroup.TestType, err error) { - result = &testgroup.TestType{} +func (c *testTypes) Get(name string, options v1.GetOptions) (result *example.TestType, err error) { + result = &example.TestType{} err = c.client.Get(). Namespace(c.ns). Resource("testtypes"). @@ -73,8 +73,8 @@ func (c *testTypes) Get(name string, options v1.GetOptions) (result *testgroup.T } // List takes label and field selectors, and returns the list of TestTypes that match those selectors. -func (c *testTypes) List(opts v1.ListOptions) (result *testgroup.TestTypeList, err error) { - result = &testgroup.TestTypeList{} +func (c *testTypes) List(opts v1.ListOptions) (result *example.TestTypeList, err error) { + result = &example.TestTypeList{} err = c.client.Get(). Namespace(c.ns). Resource("testtypes"). @@ -95,8 +95,8 @@ func (c *testTypes) Watch(opts v1.ListOptions) (watch.Interface, error) { } // Create takes the representation of a testType and creates it. Returns the server's representation of the testType, and an error, if there is any. -func (c *testTypes) Create(testType *testgroup.TestType) (result *testgroup.TestType, err error) { - result = &testgroup.TestType{} +func (c *testTypes) Create(testType *example.TestType) (result *example.TestType, err error) { + result = &example.TestType{} err = c.client.Post(). Namespace(c.ns). Resource("testtypes"). @@ -107,8 +107,8 @@ func (c *testTypes) Create(testType *testgroup.TestType) (result *testgroup.Test } // Update takes the representation of a testType and updates it. Returns the server's representation of the testType, and an error, if there is any. -func (c *testTypes) Update(testType *testgroup.TestType) (result *testgroup.TestType, err error) { - result = &testgroup.TestType{} +func (c *testTypes) Update(testType *example.TestType) (result *example.TestType, err error) { + result = &example.TestType{} err = c.client.Put(). Namespace(c.ns). Resource("testtypes"). @@ -122,8 +122,8 @@ func (c *testTypes) Update(testType *testgroup.TestType) (result *testgroup.Test // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *testTypes) UpdateStatus(testType *testgroup.TestType) (result *testgroup.TestType, err error) { - result = &testgroup.TestType{} +func (c *testTypes) UpdateStatus(testType *example.TestType) (result *example.TestType, err error) { + result = &example.TestType{} err = c.client.Put(). Namespace(c.ns). Resource("testtypes"). @@ -158,8 +158,8 @@ func (c *testTypes) DeleteCollection(options *v1.DeleteOptions, listOptions v1.L } // Patch applies the patch and returns the patched testType. -func (c *testTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup.TestType, err error) { - result = &testgroup.TestType{} +func (c *testTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *example.TestType, err error) { + result = &example.TestType{} err = c.client.Patch(pt). Namespace(c.ns). Resource("testtypes"). diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/clientset.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/clientset.go similarity index 77% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/clientset.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/clientset.go index 79a9e24d97e..8a7c7f56879 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/clientset.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/clientset.go @@ -21,32 +21,32 @@ import ( discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" - testgroupv1 "k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1" + examplev1 "k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1" ) type Interface interface { Discovery() discovery.DiscoveryInterface - TestgroupV1() testgroupv1.TestgroupV1Interface + ExampleV1() examplev1.ExampleV1Interface // Deprecated: please explicitly pick a version if possible. - Testgroup() testgroupv1.TestgroupV1Interface + Example() examplev1.ExampleV1Interface } // Clientset contains the clients for groups. Each group has exactly one // version included in a Clientset. type Clientset struct { *discovery.DiscoveryClient - testgroupV1 *testgroupv1.TestgroupV1Client + exampleV1 *examplev1.ExampleV1Client } -// TestgroupV1 retrieves the TestgroupV1Client -func (c *Clientset) TestgroupV1() testgroupv1.TestgroupV1Interface { - return c.testgroupV1 +// ExampleV1 retrieves the ExampleV1Client +func (c *Clientset) ExampleV1() examplev1.ExampleV1Interface { + return c.exampleV1 } -// Deprecated: Testgroup retrieves the default version of TestgroupClient. +// Deprecated: Example retrieves the default version of ExampleClient. // Please explicitly pick a version. -func (c *Clientset) Testgroup() testgroupv1.TestgroupV1Interface { - return c.testgroupV1 +func (c *Clientset) Example() examplev1.ExampleV1Interface { + return c.exampleV1 } // Discovery retrieves the DiscoveryClient @@ -65,7 +65,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { } var cs Clientset var err error - cs.testgroupV1, err = testgroupv1.NewForConfig(&configShallowCopy) + cs.exampleV1, err = examplev1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } @@ -82,7 +82,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset - cs.testgroupV1 = testgroupv1.NewForConfigOrDie(c) + cs.exampleV1 = examplev1.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) return &cs @@ -91,7 +91,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { // New creates a new Clientset for the given RESTClient. func New(c rest.Interface) *Clientset { var cs Clientset - cs.testgroupV1 = testgroupv1.New(c) + cs.exampleV1 = examplev1.New(c) cs.DiscoveryClient = discovery.NewDiscoveryClient(c) return &cs diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/clientset_generated.go new file mode 100644 index 00000000000..acdf09f57e0 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/clientset_generated.go @@ -0,0 +1,71 @@ +/* +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 fake + +import ( + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/discovery" + fakediscovery "k8s.io/client-go/discovery/fake" + "k8s.io/client-go/testing" + clientset "k8s.io/code-generator/_examples/apiserver/clientset/versioned" + examplev1 "k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1" + fakeexamplev1 "k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake" +) + +// NewSimpleClientset returns a clientset that will respond with the provided objects. +// It's backed by a very simple object tracker that processes creates, updates and deletions as-is, +// without applying any validations and/or defaults. It shouldn't be considered a replacement +// for a real clientset and is mostly useful in simple unit tests. +func NewSimpleClientset(objects ...runtime.Object) *Clientset { + o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder()) + for _, obj := range objects { + if err := o.Add(obj); err != nil { + panic(err) + } + } + + fakePtr := testing.Fake{} + fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) + fakePtr.AddWatchReactor("*", testing.DefaultWatchReactor(watch.NewFake(), nil)) + + return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} +} + +// Clientset implements clientset.Interface. Meant to be embedded into a +// struct to get a default implementation. This makes faking out just the method +// you want to test easier. +type Clientset struct { + testing.Fake + discovery *fakediscovery.FakeDiscovery +} + +func (c *Clientset) Discovery() discovery.DiscoveryInterface { + return c.discovery +} + +var _ clientset.Interface = &Clientset{} + +// ExampleV1 retrieves the ExampleV1Client +func (c *Clientset) ExampleV1() examplev1.ExampleV1Interface { + return &fakeexamplev1.FakeExampleV1{Fake: &c.Fake} +} + +// Example retrieves the ExampleV1Client +func (c *Clientset) Example() examplev1.ExampleV1Interface { + return &fakeexamplev1.FakeExampleV1{Fake: &c.Fake} +} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/register.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/register.go similarity index 93% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/register.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/register.go index 4f3a26236ff..c183c49065f 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/fake/register.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/fake/register.go @@ -21,7 +21,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroupinternalversion "k8s.io/code-generator/_test/apis/testgroup" + examplev1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" ) var scheme = runtime.NewScheme() @@ -48,6 +48,6 @@ func init() { // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. func AddToScheme(scheme *runtime.Scheme) { - testgroupinternalversion.AddToScheme(scheme) + examplev1.AddToScheme(scheme) } diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/register.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/register.go new file mode 100644 index 00000000000..8db030f4f92 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme/register.go @@ -0,0 +1,53 @@ +/* +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 ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + examplev1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" +) + +var Scheme = runtime.NewScheme() +var Codecs = serializer.NewCodecFactory(Scheme) +var ParameterCodec = runtime.NewParameterCodec(Scheme) + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(Scheme) +} + +// AddToScheme adds all types of this clientset into the given scheme. This allows composition +// of clientsets, like in: +// +// import ( +// "k8s.io/client-go/kubernetes" +// clientsetscheme "k8s.io/client-go/kuberentes/scheme" +// aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme" +// ) +// +// kclientset, _ := kubernetes.NewForConfig(c) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// +// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types +// correctly. +func AddToScheme(scheme *runtime.Scheme) { + examplev1.AddToScheme(scheme) + +} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/example_client.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/example_client.go new file mode 100644 index 00000000000..c9512a69ca7 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/example_client.go @@ -0,0 +1,88 @@ +/* +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 v1 + +import ( + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + rest "k8s.io/client-go/rest" + v1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" + "k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme" +) + +type ExampleV1Interface interface { + RESTClient() rest.Interface + TestTypesGetter +} + +// ExampleV1Client is used to interact with features provided by the example.apiserver.code-generator.k8s.io group. +type ExampleV1Client struct { + restClient rest.Interface +} + +func (c *ExampleV1Client) TestTypes(namespace string) TestTypeInterface { + return newTestTypes(c, namespace) +} + +// NewForConfig creates a new ExampleV1Client for the given config. +func NewForConfig(c *rest.Config) (*ExampleV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &ExampleV1Client{client}, nil +} + +// NewForConfigOrDie creates a new ExampleV1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *ExampleV1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new ExampleV1Client for the given RESTClient. +func New(c rest.Interface) *ExampleV1Client { + return &ExampleV1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *ExampleV1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/doc.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_example_client.go similarity index 76% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_example_client.go index 6916c533ca2..51e0c93e328 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/typed/testgroup/internalversion/fake/fake_testgroup_client.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_example_client.go @@ -19,20 +19,20 @@ package fake import ( rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" - internalversion "k8s.io/code-generator/_test/clientset/internal/typed/testgroup/internalversion" + v1 "k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1" ) -type FakeTestgroup struct { +type FakeExampleV1 struct { *testing.Fake } -func (c *FakeTestgroup) TestTypes(namespace string) internalversion.TestTypeInterface { +func (c *FakeExampleV1) TestTypes(namespace string) v1.TestTypeInterface { return &FakeTestTypes{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeTestgroup) RESTClient() rest.Interface { +func (c *FakeExampleV1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_testtype.go new file mode 100644 index 00000000000..2c1b295db74 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/fake/fake_testtype.go @@ -0,0 +1,138 @@ +/* +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 fake + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" + example_v1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" +) + +// FakeTestTypes implements TestTypeInterface +type FakeTestTypes struct { + Fake *FakeExampleV1 + ns string +} + +var testtypesResource = schema.GroupVersionResource{Group: "example.apiserver.code-generator.k8s.io", Version: "v1", Resource: "testtypes"} + +var testtypesKind = schema.GroupVersionKind{Group: "example.apiserver.code-generator.k8s.io", Version: "v1", Kind: "TestType"} + +// Get takes name of the testType, and returns the corresponding testType object, and an error if there is any. +func (c *FakeTestTypes) Get(name string, options v1.GetOptions) (result *example_v1.TestType, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(testtypesResource, c.ns, name), &example_v1.TestType{}) + + if obj == nil { + return nil, err + } + return obj.(*example_v1.TestType), err +} + +// List takes label and field selectors, and returns the list of TestTypes that match those selectors. +func (c *FakeTestTypes) List(opts v1.ListOptions) (result *example_v1.TestTypeList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(testtypesResource, testtypesKind, c.ns, opts), &example_v1.TestTypeList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &example_v1.TestTypeList{} + for _, item := range obj.(*example_v1.TestTypeList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested testTypes. +func (c *FakeTestTypes) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(testtypesResource, c.ns, opts)) + +} + +// Create takes the representation of a testType and creates it. Returns the server's representation of the testType, and an error, if there is any. +func (c *FakeTestTypes) Create(testType *example_v1.TestType) (result *example_v1.TestType, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(testtypesResource, c.ns, testType), &example_v1.TestType{}) + + if obj == nil { + return nil, err + } + return obj.(*example_v1.TestType), err +} + +// Update takes the representation of a testType and updates it. Returns the server's representation of the testType, and an error, if there is any. +func (c *FakeTestTypes) Update(testType *example_v1.TestType) (result *example_v1.TestType, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(testtypesResource, c.ns, testType), &example_v1.TestType{}) + + if obj == nil { + return nil, err + } + return obj.(*example_v1.TestType), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeTestTypes) UpdateStatus(testType *example_v1.TestType) (*example_v1.TestType, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(testtypesResource, "status", c.ns, testType), &example_v1.TestType{}) + + if obj == nil { + return nil, err + } + return obj.(*example_v1.TestType), err +} + +// Delete takes name of the testType and deletes it. Returns an error if one occurs. +func (c *FakeTestTypes) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(testtypesResource, c.ns, name), &example_v1.TestType{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeTestTypes) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(testtypesResource, c.ns, listOptions) + + _, err := c.Fake.Invokes(action, &example_v1.TestTypeList{}) + return err +} + +// Patch applies the patch and returns the patched testType. +func (c *FakeTestTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *example_v1.TestType, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(testtypesResource, c.ns, name, data, subresources...), &example_v1.TestType{}) + + if obj == nil { + return nil, err + } + return obj.(*example_v1.TestType), err +} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/generated_expansion.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/generated_expansion.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/generated_expansion.go diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/testtype.go new file mode 100644 index 00000000000..05761001ac9 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/clientset/versioned/typed/example/v1/testtype.go @@ -0,0 +1,172 @@ +/* +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 v1 + +import ( + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" + v1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" + scheme "k8s.io/code-generator/_examples/apiserver/clientset/versioned/scheme" +) + +// TestTypesGetter has a method to return a TestTypeInterface. +// A group's client should implement this interface. +type TestTypesGetter interface { + TestTypes(namespace string) TestTypeInterface +} + +// TestTypeInterface has methods to work with TestType resources. +type TestTypeInterface interface { + Create(*v1.TestType) (*v1.TestType, error) + Update(*v1.TestType) (*v1.TestType, error) + UpdateStatus(*v1.TestType) (*v1.TestType, error) + Delete(name string, options *meta_v1.DeleteOptions) error + DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error + Get(name string, options meta_v1.GetOptions) (*v1.TestType, error) + List(opts meta_v1.ListOptions) (*v1.TestTypeList, error) + Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.TestType, err error) + TestTypeExpansion +} + +// testTypes implements TestTypeInterface +type testTypes struct { + client rest.Interface + ns string +} + +// newTestTypes returns a TestTypes +func newTestTypes(c *ExampleV1Client, namespace string) *testTypes { + return &testTypes{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the testType, and returns the corresponding testType object, and an error if there is any. +func (c *testTypes) Get(name string, options meta_v1.GetOptions) (result *v1.TestType, err error) { + result = &v1.TestType{} + err = c.client.Get(). + Namespace(c.ns). + Resource("testtypes"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of TestTypes that match those selectors. +func (c *testTypes) List(opts meta_v1.ListOptions) (result *v1.TestTypeList, err error) { + result = &v1.TestTypeList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("testtypes"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested testTypes. +func (c *testTypes) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("testtypes"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a testType and creates it. Returns the server's representation of the testType, and an error, if there is any. +func (c *testTypes) Create(testType *v1.TestType) (result *v1.TestType, err error) { + result = &v1.TestType{} + err = c.client.Post(). + Namespace(c.ns). + Resource("testtypes"). + Body(testType). + Do(). + Into(result) + return +} + +// Update takes the representation of a testType and updates it. Returns the server's representation of the testType, and an error, if there is any. +func (c *testTypes) Update(testType *v1.TestType) (result *v1.TestType, err error) { + result = &v1.TestType{} + err = c.client.Put(). + Namespace(c.ns). + Resource("testtypes"). + Name(testType.Name). + Body(testType). + Do(). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). + +func (c *testTypes) UpdateStatus(testType *v1.TestType) (result *v1.TestType, err error) { + result = &v1.TestType{} + err = c.client.Put(). + Namespace(c.ns). + Resource("testtypes"). + Name(testType.Name). + SubResource("status"). + Body(testType). + Do(). + Into(result) + return +} + +// Delete takes name of the testType and deletes it. Returns an error if one occurs. +func (c *testTypes) Delete(name string, options *meta_v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("testtypes"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *testTypes) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("testtypes"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched testType. +func (c *testTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.TestType, err error) { + result = &v1.TestType{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("testtypes"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/interface.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/interface.go new file mode 100644 index 00000000000..2d0d7b31873 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/interface.go @@ -0,0 +1,44 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package example + +import ( + v1 "k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1" + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces" +) + +// Interface provides access to each of this group's versions. +type Interface interface { + // V1 provides access to shared informers for resources in V1. + V1() v1.Interface +} + +type group struct { + internalinterfaces.SharedInformerFactory +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory) Interface { + return &group{f} +} + +// V1 returns a new v1.Interface. +func (g *group) V1() v1.Interface { + return v1.New(g.SharedInformerFactory) +} diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/interface.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/interface.go new file mode 100644 index 00000000000..2ebac67fc16 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/interface.go @@ -0,0 +1,43 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package v1 + +import ( + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // TestTypes returns a TestTypeInformer. + TestTypes() TestTypeInformer +} + +type version struct { + internalinterfaces.SharedInformerFactory +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory) Interface { + return &version{f} +} + +// TestTypes returns a TestTypeInformer. +func (v *version) TestTypes() TestTypeInformer { + return &testTypeInformer{factory: v.SharedInformerFactory} +} diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/testtype.go new file mode 100644 index 00000000000..55782d81b1c --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/example/v1/testtype.go @@ -0,0 +1,73 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package v1 + +import ( + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" + example_v1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" + versioned "k8s.io/code-generator/_examples/apiserver/clientset/versioned" + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces" + v1 "k8s.io/code-generator/_examples/apiserver/listers/example/v1" + time "time" +) + +// TestTypeInformer provides access to a shared informer and lister for +// TestTypes. +type TestTypeInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.TestTypeLister +} + +type testTypeInformer struct { + factory internalinterfaces.SharedInformerFactory +} + +// NewTestTypeInformer constructs a new informer for TestType type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewTestTypeInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + return client.ExampleV1().TestTypes(namespace).List(options) + }, + WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + return client.ExampleV1().TestTypes(namespace).Watch(options) + }, + }, + &example_v1.TestType{}, + resyncPeriod, + indexers, + ) +} + +func defaultTestTypeInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewTestTypeInformer(client, meta_v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) +} + +func (f *testTypeInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&example_v1.TestType{}, defaultTestTypeInformer) +} + +func (f *testTypeInformer) Lister() v1.TestTypeLister { + return v1.NewTestTypeLister(f.Informer().GetIndexer()) +} diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/factory.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/factory.go new file mode 100644 index 00000000000..cfa88f8eacc --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/factory.go @@ -0,0 +1,118 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package externalversions + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" + versioned "k8s.io/code-generator/_examples/apiserver/clientset/versioned" + example "k8s.io/code-generator/_examples/apiserver/informers/externalversions/example" + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces" + reflect "reflect" + sync "sync" + time "time" +) + +type sharedInformerFactory struct { + client versioned.Interface + lock sync.Mutex + defaultResync time.Duration + + informers map[reflect.Type]cache.SharedIndexInformer + // startedInformers is used for tracking which informers have been started. + // This allows Start() to be called multiple times safely. + startedInformers map[reflect.Type]bool +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { + return &sharedInformerFactory{ + client: client, + defaultResync: defaultResync, + informers: make(map[reflect.Type]cache.SharedIndexInformer), + startedInformers: make(map[reflect.Type]bool), + } +} + +// Start initializes all requested informers. +func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) { + f.lock.Lock() + defer f.lock.Unlock() + + for informerType, informer := range f.informers { + if !f.startedInformers[informerType] { + go informer.Run(stopCh) + f.startedInformers[informerType] = true + } + } +} + +// WaitForCacheSync waits for all started informers' cache were synced. +func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool { + informers := func() map[reflect.Type]cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informers := map[reflect.Type]cache.SharedIndexInformer{} + for informerType, informer := range f.informers { + if f.startedInformers[informerType] { + informers[informerType] = informer + } + } + return informers + }() + + res := map[reflect.Type]bool{} + for informType, informer := range informers { + res[informType] = cache.WaitForCacheSync(stopCh, informer.HasSynced) + } + return res +} + +// InternalInformerFor returns the SharedIndexInformer for obj using an internal +// client. +func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer { + f.lock.Lock() + defer f.lock.Unlock() + + informerType := reflect.TypeOf(obj) + informer, exists := f.informers[informerType] + if exists { + return informer + } + informer = newFunc(f.client, f.defaultResync) + f.informers[informerType] = informer + + return informer +} + +// SharedInformerFactory provides shared informers for resources in all known +// API group versions. +type SharedInformerFactory interface { + internalinterfaces.SharedInformerFactory + ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool + + Example() example.Interface +} + +func (f *sharedInformerFactory) Example() example.Interface { + return example.New(f) +} diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/generic.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/generic.go new file mode 100644 index 00000000000..08c415c64d0 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/generic.go @@ -0,0 +1,61 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package externalversions + +import ( + "fmt" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" + v1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" +) + +// GenericInformer is type of SharedIndexInformer which will locate and delegate to other +// sharedInformers based on type +type GenericInformer interface { + Informer() cache.SharedIndexInformer + Lister() cache.GenericLister +} + +type genericInformer struct { + informer cache.SharedIndexInformer + resource schema.GroupResource +} + +// Informer returns the SharedIndexInformer. +func (f *genericInformer) Informer() cache.SharedIndexInformer { + return f.informer +} + +// Lister returns the GenericLister. +func (f *genericInformer) Lister() cache.GenericLister { + return cache.NewGenericLister(f.Informer().GetIndexer(), f.resource) +} + +// ForResource gives generic access to a shared informer of the matching type +// TODO extend this to unknown resources with a client pool +func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { + switch resource { + // Group=Example, Version=V1 + case v1.SchemeGroupVersion.WithResource("testtypes"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Example().V1().TestTypes().Informer()}, nil + + } + + return nil, fmt.Errorf("no informer found for %v", resource) +} diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces/factory_interfaces.go similarity index 88% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces/factory_interfaces.go index 075453348a2..32b2fdd8360 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/factory_interfaces.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -21,11 +21,11 @@ package internalinterfaces import ( runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" - clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset" + versioned "k8s.io/code-generator/_examples/apiserver/clientset/versioned" time "time" ) -type NewInformerFunc func(clientset.Interface, time.Duration) cache.SharedIndexInformer +type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer // SharedInformerFactory a small interface to allow for adding an informer without an import cycle type SharedInformerFactory interface { diff --git a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/interface.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/interface.go similarity index 83% rename from staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/interface.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/interface.go index ec3d96a716f..5fd9bf09adb 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/interface.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/interface.go @@ -16,11 +16,11 @@ limitations under the License. // This file was automatically generated by informer-gen -package testgroup +package example import ( - internalinterfaces "k8s.io/code-generator/_test/informers/internalversion/internalinterfaces" - internalversion "k8s.io/code-generator/_test/informers/internalversion/testgroup/internalversion" + internalversion "k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion" + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces" ) // Interface provides access to each of this group's versions. diff --git a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/interface.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/interface.go similarity index 91% rename from staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/interface.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/interface.go index a1c8268fd1b..44aefe00676 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/interface.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/interface.go @@ -19,7 +19,7 @@ limitations under the License. package internalversion import ( - internalinterfaces "k8s.io/code-generator/_test/informers/internalversion/internalinterfaces" + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/testtype.go similarity index 68% rename from staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/testtype.go index d7c6f2a3a67..7480db526aa 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/testgroup/internalversion/testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/example/internalversion/testtype.go @@ -23,10 +23,10 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" - testgroup "k8s.io/code-generator/_test/apis/testgroup" - internal "k8s.io/code-generator/_test/clientset/internal" - internalinterfaces "k8s.io/code-generator/_test/informers/internalversion/internalinterfaces" - internalversion "k8s.io/code-generator/_test/listers/testgroup/internalversion" + example "k8s.io/code-generator/_examples/apiserver/apis/example" + clientset_internalversion "k8s.io/code-generator/_examples/apiserver/clientset/internalversion" + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces" + internalversion "k8s.io/code-generator/_examples/apiserver/listers/example/internalversion" time "time" ) @@ -44,28 +44,28 @@ type testTypeInformer struct { // NewTestTypeInformer constructs a new informer for TestType type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewTestTypeInformer(client internal.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { +func NewTestTypeInformer(client clientset_internalversion.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { - return client.Testgroup().TestTypes(namespace).List(options) + return client.Example().TestTypes(namespace).List(options) }, WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { - return client.Testgroup().TestTypes(namespace).Watch(options) + return client.Example().TestTypes(namespace).Watch(options) }, }, - &testgroup.TestType{}, + &example.TestType{}, resyncPeriod, indexers, ) } -func defaultTestTypeInformer(client internal.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { +func defaultTestTypeInformer(client clientset_internalversion.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { return NewTestTypeInformer(client, v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) } func (f *testTypeInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&testgroup.TestType{}, defaultTestTypeInformer) + return f.factory.InformerFor(&example.TestType{}, defaultTestTypeInformer) } func (f *testTypeInformer) Lister() internalversion.TestTypeLister { diff --git a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/factory.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/factory.go similarity index 85% rename from staging/src/k8s.io/code-generator/_examples/informers/internalversion/factory.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/factory.go index e71a3b5624e..f3dc2bc5a7a 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/factory.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/factory.go @@ -22,16 +22,16 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - internal "k8s.io/code-generator/_test/clientset/internal" - internalinterfaces "k8s.io/code-generator/_test/informers/internalversion/internalinterfaces" - testgroup "k8s.io/code-generator/_test/informers/internalversion/testgroup" + internalversion "k8s.io/code-generator/_examples/apiserver/clientset/internalversion" + example "k8s.io/code-generator/_examples/apiserver/informers/internalversion/example" + internalinterfaces "k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces" reflect "reflect" sync "sync" time "time" ) type sharedInformerFactory struct { - client internal.Interface + client internalversion.Interface lock sync.Mutex defaultResync time.Duration @@ -42,7 +42,7 @@ type sharedInformerFactory struct { } // NewSharedInformerFactory constructs a new instance of sharedInformerFactory -func NewSharedInformerFactory(client internal.Interface, defaultResync time.Duration) SharedInformerFactory { +func NewSharedInformerFactory(client internalversion.Interface, defaultResync time.Duration) SharedInformerFactory { return &sharedInformerFactory{ client: client, defaultResync: defaultResync, @@ -110,9 +110,9 @@ type SharedInformerFactory interface { ForResource(resource schema.GroupVersionResource) (GenericInformer, error) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool - Testgroup() testgroup.Interface + Example() example.Interface } -func (f *sharedInformerFactory) Testgroup() testgroup.Interface { - return testgroup.New(f) +func (f *sharedInformerFactory) Example() example.Interface { + return example.New(f) } diff --git a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/generic.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/generic.go similarity index 88% rename from staging/src/k8s.io/code-generator/_examples/informers/internalversion/generic.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/generic.go index 3e29b5cbb96..32f77b40a23 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/generic.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/generic.go @@ -22,7 +22,7 @@ import ( "fmt" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - testgroup "k8s.io/code-generator/_test/apis/testgroup" + example "k8s.io/code-generator/_examples/apiserver/apis/example" ) // GenericInformer is type of SharedIndexInformer which will locate and delegate to other @@ -51,9 +51,9 @@ func (f *genericInformer) Lister() cache.GenericLister { // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { - // Group=Testgroup, Version=InternalVersion - case testgroup.SchemeGroupVersion.WithResource("testtypes"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Testgroup().InternalVersion().TestTypes().Informer()}, nil + // Group=Example, Version=InternalVersion + case example.SchemeGroupVersion.WithResource("testtypes"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Example().InternalVersion().TestTypes().Informer()}, nil } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces/factory_interfaces.go similarity index 84% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces/factory_interfaces.go index 09f27d4df5c..8548eed6165 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/factory_interfaces.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/informers/internalversion/internalinterfaces/factory_interfaces.go @@ -21,11 +21,11 @@ package internalinterfaces import ( runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" - internalclientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset" + internalversion "k8s.io/code-generator/_examples/apiserver/clientset/internalversion" time "time" ) -type NewInformerFunc func(internalclientset.Interface, time.Duration) cache.SharedIndexInformer +type NewInformerFunc func(internalversion.Interface, time.Duration) cache.SharedIndexInformer // SharedInformerFactory a small interface to allow for adding an informer without an import cycle type SharedInformerFactory interface { diff --git a/staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/expansion_generated.go b/staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/internalversion/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/expansion_generated.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/internalversion/expansion_generated.go diff --git a/staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/internalversion/testtype.go similarity index 81% rename from staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/testtype.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/internalversion/testtype.go index 5c1f687a4d2..47c28eae75e 100644 --- a/staging/src/k8s.io/code-generator/_examples/listers/testgroup/internalversion/testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/internalversion/testtype.go @@ -22,13 +22,13 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" - testgroup "k8s.io/code-generator/_test/apis/testgroup" + example "k8s.io/code-generator/_examples/apiserver/apis/example" ) // TestTypeLister helps list TestTypes. type TestTypeLister interface { // List lists all TestTypes in the indexer. - List(selector labels.Selector) (ret []*testgroup.TestType, err error) + List(selector labels.Selector) (ret []*example.TestType, err error) // TestTypes returns an object that can list and get TestTypes. TestTypes(namespace string) TestTypeNamespaceLister TestTypeListerExpansion @@ -45,9 +45,9 @@ func NewTestTypeLister(indexer cache.Indexer) TestTypeLister { } // List lists all TestTypes in the indexer. -func (s *testTypeLister) List(selector labels.Selector) (ret []*testgroup.TestType, err error) { +func (s *testTypeLister) List(selector labels.Selector) (ret []*example.TestType, err error) { err = cache.ListAll(s.indexer, selector, func(m interface{}) { - ret = append(ret, m.(*testgroup.TestType)) + ret = append(ret, m.(*example.TestType)) }) return ret, err } @@ -60,9 +60,9 @@ func (s *testTypeLister) TestTypes(namespace string) TestTypeNamespaceLister { // TestTypeNamespaceLister helps list and get TestTypes. type TestTypeNamespaceLister interface { // List lists all TestTypes in the indexer for a given namespace. - List(selector labels.Selector) (ret []*testgroup.TestType, err error) + List(selector labels.Selector) (ret []*example.TestType, err error) // Get retrieves the TestType from the indexer for a given namespace and name. - Get(name string) (*testgroup.TestType, error) + Get(name string) (*example.TestType, error) TestTypeNamespaceListerExpansion } @@ -74,21 +74,21 @@ type testTypeNamespaceLister struct { } // List lists all TestTypes in the indexer for a given namespace. -func (s testTypeNamespaceLister) List(selector labels.Selector) (ret []*testgroup.TestType, err error) { +func (s testTypeNamespaceLister) List(selector labels.Selector) (ret []*example.TestType, err error) { err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { - ret = append(ret, m.(*testgroup.TestType)) + ret = append(ret, m.(*example.TestType)) }) return ret, err } // Get retrieves the TestType from the indexer for a given namespace and name. -func (s testTypeNamespaceLister) Get(name string) (*testgroup.TestType, error) { +func (s testTypeNamespaceLister) Get(name string) (*example.TestType, error) { obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) if err != nil { return nil, err } if !exists { - return nil, errors.NewNotFound(testgroup.Resource("testtype"), name) + return nil, errors.NewNotFound(example.Resource("testtype"), name) } - return obj.(*testgroup.TestType), nil + return obj.(*example.TestType), nil } diff --git a/staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/expansion_generated.go b/staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/v1/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/expansion_generated.go rename to staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/v1/expansion_generated.go diff --git a/staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/v1/testtype.go new file mode 100644 index 00000000000..0fbf7df1c00 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/apiserver/listers/example/v1/testtype.go @@ -0,0 +1,94 @@ +/* +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. +*/ + +// This file was automatically generated by lister-gen + +package v1 + +import ( + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" + v1 "k8s.io/code-generator/_examples/apiserver/apis/example/v1" +) + +// TestTypeLister helps list TestTypes. +type TestTypeLister interface { + // List lists all TestTypes in the indexer. + List(selector labels.Selector) (ret []*v1.TestType, err error) + // TestTypes returns an object that can list and get TestTypes. + TestTypes(namespace string) TestTypeNamespaceLister + TestTypeListerExpansion +} + +// testTypeLister implements the TestTypeLister interface. +type testTypeLister struct { + indexer cache.Indexer +} + +// NewTestTypeLister returns a new TestTypeLister. +func NewTestTypeLister(indexer cache.Indexer) TestTypeLister { + return &testTypeLister{indexer: indexer} +} + +// List lists all TestTypes in the indexer. +func (s *testTypeLister) List(selector labels.Selector) (ret []*v1.TestType, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.TestType)) + }) + return ret, err +} + +// TestTypes returns an object that can list and get TestTypes. +func (s *testTypeLister) TestTypes(namespace string) TestTypeNamespaceLister { + return testTypeNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// TestTypeNamespaceLister helps list and get TestTypes. +type TestTypeNamespaceLister interface { + // List lists all TestTypes in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1.TestType, err error) + // Get retrieves the TestType from the indexer for a given namespace and name. + Get(name string) (*v1.TestType, error) + TestTypeNamespaceListerExpansion +} + +// testTypeNamespaceLister implements the TestTypeNamespaceLister +// interface. +type testTypeNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all TestTypes in the indexer for a given namespace. +func (s testTypeNamespaceLister) List(selector labels.Selector) (ret []*v1.TestType, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.TestType)) + }) + return ret, err +} + +// Get retrieves the TestType from the indexer for a given namespace and name. +func (s testTypeNamespaceLister) Get(name string) (*v1.TestType, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("testtype"), name) + } + return obj.(*v1.TestType), nil +} diff --git a/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/zz_generated.deepcopy.go new file mode 100644 index 00000000000..da6ba5e9520 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/crd/apis/example/v1/zz_generated.deepcopy.go @@ -0,0 +1,130 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by deepcopy-gen. Do not edit it manually! + +package v1 + +import ( + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + reflect "reflect" +) + +func init() { + SchemeBuilder.Register(RegisterDeepCopies) +} + +// RegisterDeepCopies adds deep-copy functions to the given scheme. Public +// to allow building arbitrary schemes. +// +// Deprecated: deepcopy registration will go away when static deepcopy is fully implemented. +func RegisterDeepCopies(scheme *runtime.Scheme) error { + return scheme.AddGeneratedDeepCopyFuncs( + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*TestType).DeepCopyInto(out.(*TestType)) + return nil + }, InType: reflect.TypeOf(&TestType{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*TestTypeList).DeepCopyInto(out.(*TestTypeList)) + return nil + }, InType: reflect.TypeOf(&TestTypeList{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*TestTypeStatus).DeepCopyInto(out.(*TestTypeStatus)) + return nil + }, InType: reflect.TypeOf(&TestTypeStatus{})}, + ) +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestType) DeepCopyInto(out *TestType) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestType. +func (in *TestType) DeepCopy() *TestType { + if in == nil { + return nil + } + out := new(TestType) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *TestType) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestTypeList) DeepCopyInto(out *TestTypeList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]TestType, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestTypeList. +func (in *TestTypeList) DeepCopy() *TestTypeList { + if in == nil { + return nil + } + out := new(TestTypeList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *TestTypeList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } else { + return nil + } +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestTypeStatus) DeepCopyInto(out *TestTypeStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestTypeStatus. +func (in *TestTypeStatus) DeepCopy() *TestTypeStatus { + if in == nil { + return nil + } + out := new(TestTypeStatus) + in.DeepCopyInto(out) + return out +} diff --git a/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/clientset.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/clientset.go new file mode 100644 index 00000000000..be971cbd936 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/clientset.go @@ -0,0 +1,98 @@ +/* +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 versioned + +import ( + glog "github.com/golang/glog" + discovery "k8s.io/client-go/discovery" + rest "k8s.io/client-go/rest" + flowcontrol "k8s.io/client-go/util/flowcontrol" + examplev1 "k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1" +) + +type Interface interface { + Discovery() discovery.DiscoveryInterface + ExampleV1() examplev1.ExampleV1Interface + // Deprecated: please explicitly pick a version if possible. + Example() examplev1.ExampleV1Interface +} + +// Clientset contains the clients for groups. Each group has exactly one +// version included in a Clientset. +type Clientset struct { + *discovery.DiscoveryClient + exampleV1 *examplev1.ExampleV1Client +} + +// ExampleV1 retrieves the ExampleV1Client +func (c *Clientset) ExampleV1() examplev1.ExampleV1Interface { + return c.exampleV1 +} + +// Deprecated: Example retrieves the default version of ExampleClient. +// Please explicitly pick a version. +func (c *Clientset) Example() examplev1.ExampleV1Interface { + return c.exampleV1 +} + +// Discovery retrieves the DiscoveryClient +func (c *Clientset) Discovery() discovery.DiscoveryInterface { + if c == nil { + return nil + } + return c.DiscoveryClient +} + +// NewForConfig creates a new Clientset for the given config. +func NewForConfig(c *rest.Config) (*Clientset, error) { + configShallowCopy := *c + if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { + configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) + } + var cs Clientset + var err error + cs.exampleV1, err = examplev1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } + + cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) + if err != nil { + glog.Errorf("failed to create the DiscoveryClient: %v", err) + return nil, err + } + return &cs, nil +} + +// NewForConfigOrDie creates a new Clientset for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *Clientset { + var cs Clientset + cs.exampleV1 = examplev1.NewForConfigOrDie(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) + return &cs +} + +// New creates a new Clientset for the given RESTClient. +func New(c rest.Interface) *Clientset { + var cs Clientset + cs.exampleV1 = examplev1.New(c) + + cs.DiscoveryClient = discovery.NewDiscoveryClient(c) + return &cs +} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/internal/doc.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/doc.go similarity index 97% rename from staging/src/k8s.io/code-generator/_examples/clientset/internal/doc.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/doc.go index 3d1cbb7eb96..8fd89c6d52a 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/internal/doc.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/doc.go @@ -17,4 +17,4 @@ limitations under the License. // This package is generated by client-gen with custom arguments. // This package has the automatically generated clientset. -package internal +package versioned diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/clientset_generated.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/clientset_generated.go similarity index 77% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/clientset_generated.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/clientset_generated.go index 12a9eb084c9..712bf8cf930 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/clientset_generated.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/clientset_generated.go @@ -22,9 +22,9 @@ import ( "k8s.io/client-go/discovery" fakediscovery "k8s.io/client-go/discovery/fake" "k8s.io/client-go/testing" - clientset "k8s.io/code-generator/_test/clientset/versioned" - testgroupv1 "k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1" - faketestgroupv1 "k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1/fake" + clientset "k8s.io/code-generator/_examples/crd/clientset/versioned" + examplev1 "k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1" + fakeexamplev1 "k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake" ) // NewSimpleClientset returns a clientset that will respond with the provided objects. @@ -60,12 +60,12 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { var _ clientset.Interface = &Clientset{} -// TestgroupV1 retrieves the TestgroupV1Client -func (c *Clientset) TestgroupV1() testgroupv1.TestgroupV1Interface { - return &faketestgroupv1.FakeTestgroupV1{Fake: &c.Fake} +// ExampleV1 retrieves the ExampleV1Client +func (c *Clientset) ExampleV1() examplev1.ExampleV1Interface { + return &fakeexamplev1.FakeExampleV1{Fake: &c.Fake} } -// Testgroup retrieves the TestgroupV1Client -func (c *Clientset) Testgroup() testgroupv1.TestgroupV1Interface { - return &faketestgroupv1.FakeTestgroupV1{Fake: &c.Fake} +// Example retrieves the ExampleV1Client +func (c *Clientset) Example() examplev1.ExampleV1Interface { + return &fakeexamplev1.FakeExampleV1{Fake: &c.Fake} } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/register.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/register.go similarity index 94% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/register.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/register.go index 43805d41ed5..777eed95805 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/fake/register.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/fake/register.go @@ -21,7 +21,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroupv1 "k8s.io/code-generator/_test/apis/testgroup/v1" + examplev1 "k8s.io/code-generator/_examples/crd/apis/example/v1" ) var scheme = runtime.NewScheme() @@ -48,6 +48,6 @@ func init() { // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. func AddToScheme(scheme *runtime.Scheme) { - testgroupv1.AddToScheme(scheme) + examplev1.AddToScheme(scheme) } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/doc.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/doc.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/scheme/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/register.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/scheme/register.go similarity index 94% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/register.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/scheme/register.go index 2438dda0f33..2b6ee96f4b4 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/scheme/register.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/scheme/register.go @@ -21,7 +21,7 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - testgroupv1 "k8s.io/code-generator/_test/apis/testgroup/v1" + examplev1 "k8s.io/code-generator/_examples/crd/apis/example/v1" ) var Scheme = runtime.NewScheme() @@ -48,6 +48,6 @@ func init() { // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. func AddToScheme(scheme *runtime.Scheme) { - testgroupv1.AddToScheme(scheme) + examplev1.AddToScheme(scheme) } diff --git a/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/doc.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/doc.go new file mode 100644 index 00000000000..54673bfa738 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/doc.go @@ -0,0 +1,20 @@ +/* +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. +*/ + +// This package is generated by client-gen with custom arguments. + +// This package has the automatically generated typed clients. +package v1 diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/example_client.go similarity index 64% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/example_client.go index 2a899098399..6382db1d1ee 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testgroup_client.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/example_client.go @@ -19,26 +19,26 @@ package v1 import ( serializer "k8s.io/apimachinery/pkg/runtime/serializer" rest "k8s.io/client-go/rest" - v1 "k8s.io/code-generator/_test/apis/testgroup/v1" - "k8s.io/code-generator/_test/clientset/versioned/scheme" + v1 "k8s.io/code-generator/_examples/crd/apis/example/v1" + "k8s.io/code-generator/_examples/crd/clientset/versioned/scheme" ) -type TestgroupV1Interface interface { +type ExampleV1Interface interface { RESTClient() rest.Interface TestTypesGetter } -// TestgroupV1Client is used to interact with features provided by the testgroup.k8s.io group. -type TestgroupV1Client struct { +// ExampleV1Client is used to interact with features provided by the example.crd.code-generator.k8s.io group. +type ExampleV1Client struct { restClient rest.Interface } -func (c *TestgroupV1Client) TestTypes(namespace string) TestTypeInterface { +func (c *ExampleV1Client) TestTypes(namespace string) TestTypeInterface { return newTestTypes(c, namespace) } -// NewForConfig creates a new TestgroupV1Client for the given config. -func NewForConfig(c *rest.Config) (*TestgroupV1Client, error) { +// NewForConfig creates a new ExampleV1Client for the given config. +func NewForConfig(c *rest.Config) (*ExampleV1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -47,12 +47,12 @@ func NewForConfig(c *rest.Config) (*TestgroupV1Client, error) { if err != nil { return nil, err } - return &TestgroupV1Client{client}, nil + return &ExampleV1Client{client}, nil } -// NewForConfigOrDie creates a new TestgroupV1Client for the given config and +// NewForConfigOrDie creates a new ExampleV1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *TestgroupV1Client { +func NewForConfigOrDie(c *rest.Config) *ExampleV1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -60,9 +60,9 @@ func NewForConfigOrDie(c *rest.Config) *TestgroupV1Client { return client } -// New creates a new TestgroupV1Client for the given RESTClient. -func New(c rest.Interface) *TestgroupV1Client { - return &TestgroupV1Client{c} +// New creates a new ExampleV1Client for the given RESTClient. +func New(c rest.Interface) *ExampleV1Client { + return &ExampleV1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -80,7 +80,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *TestgroupV1Client) RESTClient() rest.Interface { +func (c *ExampleV1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/doc.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/doc.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/doc.go diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_example_client.go similarity index 78% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_example_client.go index b0791565b4f..caa8af94ca3 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testgroup_client.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_example_client.go @@ -19,20 +19,20 @@ package fake import ( rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" - v1 "k8s.io/code-generator/_test/clientset/versioned/typed/testgroup/v1" + v1 "k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1" ) -type FakeTestgroupV1 struct { +type FakeExampleV1 struct { *testing.Fake } -func (c *FakeTestgroupV1) TestTypes(namespace string) v1.TestTypeInterface { +func (c *FakeExampleV1) TestTypes(namespace string) v1.TestTypeInterface { return &FakeTestTypes{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeTestgroupV1) RESTClient() rest.Interface { +func (c *FakeExampleV1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_testtype.go similarity index 70% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_testtype.go index 535638b15dc..067f69931b1 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/fake/fake_testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/fake/fake_testtype.go @@ -23,34 +23,34 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" - testgroup_v1 "k8s.io/code-generator/_test/apis/testgroup/v1" + example_v1 "k8s.io/code-generator/_examples/crd/apis/example/v1" ) // FakeTestTypes implements TestTypeInterface type FakeTestTypes struct { - Fake *FakeTestgroupV1 + Fake *FakeExampleV1 ns string } -var testtypesResource = schema.GroupVersionResource{Group: "testgroup.k8s.io", Version: "v1", Resource: "testtypes"} +var testtypesResource = schema.GroupVersionResource{Group: "example.crd.code-generator.k8s.io", Version: "v1", Resource: "testtypes"} -var testtypesKind = schema.GroupVersionKind{Group: "testgroup.k8s.io", Version: "v1", Kind: "TestType"} +var testtypesKind = schema.GroupVersionKind{Group: "example.crd.code-generator.k8s.io", Version: "v1", Kind: "TestType"} // Get takes name of the testType, and returns the corresponding testType object, and an error if there is any. -func (c *FakeTestTypes) Get(name string, options v1.GetOptions) (result *testgroup_v1.TestType, err error) { +func (c *FakeTestTypes) Get(name string, options v1.GetOptions) (result *example_v1.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewGetAction(testtypesResource, c.ns, name), &testgroup_v1.TestType{}) + Invokes(testing.NewGetAction(testtypesResource, c.ns, name), &example_v1.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup_v1.TestType), err + return obj.(*example_v1.TestType), err } // List takes label and field selectors, and returns the list of TestTypes that match those selectors. -func (c *FakeTestTypes) List(opts v1.ListOptions) (result *testgroup_v1.TestTypeList, err error) { +func (c *FakeTestTypes) List(opts v1.ListOptions) (result *example_v1.TestTypeList, err error) { obj, err := c.Fake. - Invokes(testing.NewListAction(testtypesResource, testtypesKind, c.ns, opts), &testgroup_v1.TestTypeList{}) + Invokes(testing.NewListAction(testtypesResource, testtypesKind, c.ns, opts), &example_v1.TestTypeList{}) if obj == nil { return nil, err @@ -60,8 +60,8 @@ func (c *FakeTestTypes) List(opts v1.ListOptions) (result *testgroup_v1.TestType if label == nil { label = labels.Everything() } - list := &testgroup_v1.TestTypeList{} - for _, item := range obj.(*testgroup_v1.TestTypeList).Items { + list := &example_v1.TestTypeList{} + for _, item := range obj.(*example_v1.TestTypeList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) } @@ -77,43 +77,43 @@ func (c *FakeTestTypes) Watch(opts v1.ListOptions) (watch.Interface, error) { } // Create takes the representation of a testType and creates it. Returns the server's representation of the testType, and an error, if there is any. -func (c *FakeTestTypes) Create(testType *testgroup_v1.TestType) (result *testgroup_v1.TestType, err error) { +func (c *FakeTestTypes) Create(testType *example_v1.TestType) (result *example_v1.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewCreateAction(testtypesResource, c.ns, testType), &testgroup_v1.TestType{}) + Invokes(testing.NewCreateAction(testtypesResource, c.ns, testType), &example_v1.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup_v1.TestType), err + return obj.(*example_v1.TestType), err } // Update takes the representation of a testType and updates it. Returns the server's representation of the testType, and an error, if there is any. -func (c *FakeTestTypes) Update(testType *testgroup_v1.TestType) (result *testgroup_v1.TestType, err error) { +func (c *FakeTestTypes) Update(testType *example_v1.TestType) (result *example_v1.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewUpdateAction(testtypesResource, c.ns, testType), &testgroup_v1.TestType{}) + Invokes(testing.NewUpdateAction(testtypesResource, c.ns, testType), &example_v1.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup_v1.TestType), err + return obj.(*example_v1.TestType), err } // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeTestTypes) UpdateStatus(testType *testgroup_v1.TestType) (*testgroup_v1.TestType, error) { +func (c *FakeTestTypes) UpdateStatus(testType *example_v1.TestType) (*example_v1.TestType, error) { obj, err := c.Fake. - Invokes(testing.NewUpdateSubresourceAction(testtypesResource, "status", c.ns, testType), &testgroup_v1.TestType{}) + Invokes(testing.NewUpdateSubresourceAction(testtypesResource, "status", c.ns, testType), &example_v1.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup_v1.TestType), err + return obj.(*example_v1.TestType), err } // Delete takes name of the testType and deletes it. Returns an error if one occurs. func (c *FakeTestTypes) Delete(name string, options *v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(testtypesResource, c.ns, name), &testgroup_v1.TestType{}) + Invokes(testing.NewDeleteAction(testtypesResource, c.ns, name), &example_v1.TestType{}) return err } @@ -122,17 +122,17 @@ func (c *FakeTestTypes) Delete(name string, options *v1.DeleteOptions) error { func (c *FakeTestTypes) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { action := testing.NewDeleteCollectionAction(testtypesResource, c.ns, listOptions) - _, err := c.Fake.Invokes(action, &testgroup_v1.TestTypeList{}) + _, err := c.Fake.Invokes(action, &example_v1.TestTypeList{}) return err } // Patch applies the patch and returns the patched testType. -func (c *FakeTestTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *testgroup_v1.TestType, err error) { +func (c *FakeTestTypes) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *example_v1.TestType, err error) { obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(testtypesResource, c.ns, name, data, subresources...), &testgroup_v1.TestType{}) + Invokes(testing.NewPatchSubresourceAction(testtypesResource, c.ns, name, data, subresources...), &example_v1.TestType{}) if obj == nil { return nil, err } - return obj.(*testgroup_v1.TestType), err + return obj.(*example_v1.TestType), err } diff --git a/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/generated_expansion.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/generated_expansion.go new file mode 100644 index 00000000000..426aa27c768 --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/generated_expansion.go @@ -0,0 +1,19 @@ +/* +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 v1 + +type TestTypeExpansion interface{} diff --git a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/testtype.go similarity index 96% rename from staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/testtype.go index 7347fa8948d..f5aa7c6b218 100644 --- a/staging/src/k8s.io/code-generator/_examples/clientset/versioned/typed/testgroup/v1/testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/clientset/versioned/typed/example/v1/testtype.go @@ -21,8 +21,8 @@ import ( types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" - v1 "k8s.io/code-generator/_test/apis/testgroup/v1" - scheme "k8s.io/code-generator/_test/clientset/versioned/scheme" + v1 "k8s.io/code-generator/_examples/crd/apis/example/v1" + scheme "k8s.io/code-generator/_examples/crd/clientset/versioned/scheme" ) // TestTypesGetter has a method to return a TestTypeInterface. @@ -52,7 +52,7 @@ type testTypes struct { } // newTestTypes returns a TestTypes -func newTestTypes(c *TestgroupV1Client, namespace string) *testTypes { +func newTestTypes(c *ExampleV1Client, namespace string) *testTypes { return &testTypes{ client: c.RESTClient(), ns: namespace, diff --git a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/interface.go b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/interface.go similarity index 84% rename from staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/interface.go rename to staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/interface.go index 3d44c099b6b..71c8802cd1c 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/interface.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/interface.go @@ -16,11 +16,11 @@ limitations under the License. // This file was automatically generated by informer-gen -package testgroup +package example import ( - internalinterfaces "k8s.io/code-generator/_test/informers/externalversions/internalinterfaces" - v1 "k8s.io/code-generator/_test/informers/externalversions/testgroup/v1" + v1 "k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1" + internalinterfaces "k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces" ) // Interface provides access to each of this group's versions. diff --git a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/interface.go b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/interface.go similarity index 91% rename from staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/interface.go rename to staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/interface.go index a763bd71cb6..39bc0bccf39 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/interface.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/interface.go @@ -19,7 +19,7 @@ limitations under the License. package v1 import ( - internalinterfaces "k8s.io/code-generator/_test/informers/externalversions/internalinterfaces" + internalinterfaces "k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/testtype.go similarity index 80% rename from staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/testtype.go index 4ea2cb6a5ae..a745adadb9f 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/testgroup/v1/testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/example/v1/testtype.go @@ -23,10 +23,10 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" - testgroup_v1 "k8s.io/code-generator/_test/apis/testgroup/v1" - versioned "k8s.io/code-generator/_test/clientset/versioned" - internalinterfaces "k8s.io/code-generator/_test/informers/externalversions/internalinterfaces" - v1 "k8s.io/code-generator/_test/listers/testgroup/v1" + example_v1 "k8s.io/code-generator/_examples/crd/apis/example/v1" + versioned "k8s.io/code-generator/_examples/crd/clientset/versioned" + internalinterfaces "k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces" + v1 "k8s.io/code-generator/_examples/crd/listers/example/v1" time "time" ) @@ -48,13 +48,13 @@ func NewTestTypeInformer(client versioned.Interface, namespace string, resyncPer return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { - return client.TestgroupV1().TestTypes(namespace).List(options) + return client.ExampleV1().TestTypes(namespace).List(options) }, WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { - return client.TestgroupV1().TestTypes(namespace).Watch(options) + return client.ExampleV1().TestTypes(namespace).Watch(options) }, }, - &testgroup_v1.TestType{}, + &example_v1.TestType{}, resyncPeriod, indexers, ) @@ -65,7 +65,7 @@ func defaultTestTypeInformer(client versioned.Interface, resyncPeriod time.Durat } func (f *testTypeInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&testgroup_v1.TestType{}, defaultTestTypeInformer) + return f.factory.InformerFor(&example_v1.TestType{}, defaultTestTypeInformer) } func (f *testTypeInformer) Lister() v1.TestTypeLister { diff --git a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/factory.go b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/factory.go similarity index 90% rename from staging/src/k8s.io/code-generator/_examples/informers/externalversions/factory.go rename to staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/factory.go index aed4df7244a..c9c6f19d388 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/factory.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/factory.go @@ -22,9 +22,9 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - versioned "k8s.io/code-generator/_test/clientset/versioned" - internalinterfaces "k8s.io/code-generator/_test/informers/externalversions/internalinterfaces" - testgroup "k8s.io/code-generator/_test/informers/externalversions/testgroup" + versioned "k8s.io/code-generator/_examples/crd/clientset/versioned" + example "k8s.io/code-generator/_examples/crd/informers/externalversions/example" + internalinterfaces "k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces" reflect "reflect" sync "sync" time "time" @@ -110,9 +110,9 @@ type SharedInformerFactory interface { ForResource(resource schema.GroupVersionResource) (GenericInformer, error) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool - Testgroup() testgroup.Interface + Example() example.Interface } -func (f *sharedInformerFactory) Testgroup() testgroup.Interface { - return testgroup.New(f) +func (f *sharedInformerFactory) Example() example.Interface { + return example.New(f) } diff --git a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/generic.go b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/generic.go similarity index 92% rename from staging/src/k8s.io/code-generator/_examples/informers/externalversions/generic.go rename to staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/generic.go index 9b87777967c..237f7731882 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/generic.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/generic.go @@ -22,7 +22,7 @@ import ( "fmt" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - v1 "k8s.io/code-generator/_test/apis/testgroup/v1" + v1 "k8s.io/code-generator/_examples/crd/apis/example/v1" ) // GenericInformer is type of SharedIndexInformer which will locate and delegate to other @@ -51,9 +51,9 @@ func (f *genericInformer) Lister() cache.GenericLister { // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { - // Group=Testgroup, Version=V1 + // Group=Example, Version=V1 case v1.SchemeGroupVersion.WithResource("testtypes"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Testgroup().V1().TestTypes().Informer()}, nil + return &genericInformer{resource: resource.GroupResource(), informer: f.Example().V1().TestTypes().Informer()}, nil } diff --git a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces/factory_interfaces.go similarity index 86% rename from staging/src/k8s.io/code-generator/_examples/informers/internalversion/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces/factory_interfaces.go index 8d6323e8212..8a94fce37b4 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/internalversion/internalinterfaces/factory_interfaces.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -21,11 +21,11 @@ package internalinterfaces import ( runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" - internal "k8s.io/code-generator/_test/clientset/internal" + versioned "k8s.io/code-generator/_examples/crd/clientset/versioned" time "time" ) -type NewInformerFunc func(internal.Interface, time.Duration) cache.SharedIndexInformer +type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer // SharedInformerFactory a small interface to allow for adding an informer without an import cycle type SharedInformerFactory interface { diff --git a/staging/src/k8s.io/code-generator/_examples/crd/listers/example/v1/expansion_generated.go b/staging/src/k8s.io/code-generator/_examples/crd/listers/example/v1/expansion_generated.go new file mode 100644 index 00000000000..f4ece18ccbe --- /dev/null +++ b/staging/src/k8s.io/code-generator/_examples/crd/listers/example/v1/expansion_generated.go @@ -0,0 +1,27 @@ +/* +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. +*/ + +// This file was automatically generated by lister-gen + +package v1 + +// TestTypeListerExpansion allows custom methods to be added to +// TestTypeLister. +type TestTypeListerExpansion interface{} + +// TestTypeNamespaceListerExpansion allows custom methods to be added to +// TestTypeNamespaceLister. +type TestTypeNamespaceListerExpansion interface{} diff --git a/staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/testtype.go b/staging/src/k8s.io/code-generator/_examples/crd/listers/example/v1/testtype.go similarity index 98% rename from staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/testtype.go rename to staging/src/k8s.io/code-generator/_examples/crd/listers/example/v1/testtype.go index c1704884abe..d452e9ec432 100644 --- a/staging/src/k8s.io/code-generator/_examples/listers/testgroup/v1/testtype.go +++ b/staging/src/k8s.io/code-generator/_examples/crd/listers/example/v1/testtype.go @@ -22,7 +22,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" - v1 "k8s.io/code-generator/_test/apis/testgroup/v1" + v1 "k8s.io/code-generator/_examples/crd/apis/example/v1" ) // TestTypeLister helps list TestTypes. diff --git a/staging/src/k8s.io/sample-apiserver/BUILD b/staging/src/k8s.io/sample-apiserver/BUILD index 1364b5658ef..c350ea07396 100644 --- a/staging/src/k8s.io/sample-apiserver/BUILD +++ b/staging/src/k8s.io/sample-apiserver/BUILD @@ -37,12 +37,12 @@ filegroup( "//staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer:all-srcs", "//staging/src/k8s.io/sample-apiserver/pkg/apis/wardle:all-srcs", "//staging/src/k8s.io/sample-apiserver/pkg/apiserver:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1:all-srcs", "//staging/src/k8s.io/sample-apiserver/pkg/cmd/server:all-srcs", "//staging/src/k8s.io/sample-apiserver/pkg/registry:all-srcs", ], diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD index c0ebce23e69..f88a84817e9 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder/BUILD @@ -16,8 +16,8 @@ go_library( "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/admission/wardleinitializer:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion:go_default_library", ], ) @@ -33,8 +33,8 @@ go_test( "//vendor/k8s.io/sample-apiserver/pkg/admission/plugin/banflunder:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/admission/wardleinitializer:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion:go_default_library", ], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD index 353623b8374..fc725c6ee11 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/admission/wardleinitializer/BUILD @@ -14,7 +14,7 @@ go_library( ], deps = [ "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion:go_default_library", ], ) @@ -24,8 +24,8 @@ go_test( deps = [ "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/admission/wardleinitializer:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion:go_default_library", ], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD index f7ce6f12b20..ebefaf2a85f 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/BUILD @@ -13,6 +13,7 @@ go_library( "types.go", "zz_generated.conversion.go", "zz_generated.deepcopy.go", + "zz_generated.defaults.go", ], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.defaults.go b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.defaults.go new file mode 100644 index 00000000000..7e6df29d4ae --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1/zz_generated.defaults.go @@ -0,0 +1,32 @@ +// +build !ignore_autogenerated + +/* +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. +*/ + +// This file was autogenerated by defaulter-gen. Do not edit it manually! + +package v1alpha1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + return nil +} diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/BUILD similarity index 65% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/BUILD index a00a83e808b..f133b54582d 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,12 +6,13 @@ go_library( "clientset.go", "doc.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion:go_default_library", ], ) @@ -31,9 +27,10 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/clientset.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/clientset.go similarity index 96% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/clientset.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/clientset.go index 52122a75a8f..0e5459813db 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/clientset.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/clientset.go @@ -14,14 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package internalclientset +package internalversion import ( glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" - wardleinternalversion "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion" + wardleinternalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion" ) type Interface interface { diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/doc.go new file mode 100644 index 00000000000..b8eadd1e118 --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/doc.go @@ -0,0 +1,20 @@ +/* +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. +*/ + +// This package is generated by client-gen with custom arguments. + +// This package has the automatically generated clientset. +package internalversion diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/BUILD similarity index 67% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/BUILD index a9c990af420..b1eb96ad86c 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -12,6 +7,7 @@ go_library( "doc.go", "register.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -22,9 +18,9 @@ go_library( "//vendor/k8s.io/client-go/discovery/fake:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake:go_default_library", ], ) @@ -39,4 +35,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/clientset_generated.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/clientset_generated.go similarity index 91% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/clientset_generated.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/clientset_generated.go index 765e4386567..b4030b659e1 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/clientset_generated.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/clientset_generated.go @@ -22,9 +22,9 @@ import ( "k8s.io/client-go/discovery" fakediscovery "k8s.io/client-go/discovery/fake" "k8s.io/client-go/testing" - clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset" - wardleinternalversion "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion" - fakewardleinternalversion "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake" + clientset "k8s.io/sample-apiserver/pkg/client/clientset/internalversion" + wardleinternalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion" + fakewardleinternalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake" ) // NewSimpleClientset returns a clientset that will respond with the provided objects. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/doc.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/doc.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/register.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/register.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/fake/register.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/fake/register.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme/BUILD similarity index 87% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme/BUILD index 458b4f792b6..d615b188d37 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,6 +6,7 @@ go_library( "doc.go", "register.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", @@ -33,4 +29,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/doc.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme/doc.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/register.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme/register.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme/register.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme/register.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/BUILD similarity index 73% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/BUILD index ddc6e0d2211..f3c78a03e7f 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -14,13 +9,14 @@ go_library( "generated_expansion.go", "wardle_client.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme:go_default_library", ], ) @@ -35,7 +31,8 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/doc.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/doc.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/BUILD similarity index 78% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/BUILD index de4327b8693..f74700cf012 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -13,6 +8,7 @@ go_library( "fake_flunder.go", "fake_wardle_client.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", @@ -22,7 +18,7 @@ go_library( "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion:go_default_library", ], ) @@ -37,4 +33,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/doc.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/doc.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/fake_fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/fake_fischer.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/fake_fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/fake_fischer.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/fake_flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/fake_flunder.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/fake_flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/fake_flunder.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/fake_wardle_client.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/fake_wardle_client.go similarity index 90% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/fake_wardle_client.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/fake_wardle_client.go index a9cf93cdb9a..1d447b3d40c 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fake/fake_wardle_client.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fake/fake_wardle_client.go @@ -19,7 +19,7 @@ package fake import ( rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" - internalversion "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion" + internalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion" ) type FakeWardle struct { diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fischer.go similarity index 98% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fischer.go index 0c2517bb27b..9ee3f03b73e 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/fischer.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/fischer.go @@ -22,7 +22,7 @@ import ( watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" wardle "k8s.io/sample-apiserver/pkg/apis/wardle" - scheme "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme" + scheme "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme" ) // FischersGetter has a method to return a FischerInterface. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/flunder.go similarity index 98% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/flunder.go index 293f736fc43..6ed19e118eb 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/flunder.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/flunder.go @@ -22,7 +22,7 @@ import ( watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" wardle "k8s.io/sample-apiserver/pkg/apis/wardle" - scheme "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme" + scheme "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme" ) // FlundersGetter has a method to return a FlunderInterface. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/generated_expansion.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/generated_expansion.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/generated_expansion.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/wardle_client.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/wardle_client.go similarity index 96% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/wardle_client.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/wardle_client.go index 9e4175da81c..7f0bea92bb2 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/typed/wardle/internalversion/wardle_client.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/internalversion/typed/wardle/internalversion/wardle_client.go @@ -18,7 +18,7 @@ package internalversion import ( rest "k8s.io/client-go/rest" - "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset/scheme" + "k8s.io/sample-apiserver/pkg/client/clientset/internalversion/scheme" ) type WardleInterface interface { diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/BUILD similarity index 68% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/BUILD index 90296e4354b..4729e1cb2c7 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,12 +6,13 @@ go_library( "clientset.go", "doc.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1:go_default_library", ], ) @@ -31,9 +27,10 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/clientset.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/clientset.go similarity index 96% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/clientset.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/clientset.go index 1d5a42d894b..2fb69551ed0 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/clientset.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/clientset.go @@ -14,14 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package clientset +package versioned import ( glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" - wardlev1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1" + wardlev1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1" ) type Interface interface { diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/doc.go similarity index 97% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/doc.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/doc.go index 7d72e7fb20a..8fd89c6d52a 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/doc.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/doc.go @@ -17,4 +17,4 @@ limitations under the License. // This package is generated by client-gen with custom arguments. // This package has the automatically generated clientset. -package clientset +package versioned diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/BUILD similarity index 68% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/BUILD index e6d2bafb802..64065a783ef 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -12,6 +7,7 @@ go_library( "doc.go", "register.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -22,9 +18,9 @@ go_library( "//vendor/k8s.io/client-go/discovery/fake:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake:go_default_library", ], ) @@ -39,4 +35,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/clientset_generated.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/clientset_generated.go similarity index 91% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/clientset_generated.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/clientset_generated.go index 55ce2b67f20..6b627a3c7a3 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/clientset_generated.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/clientset_generated.go @@ -22,9 +22,9 @@ import ( "k8s.io/client-go/discovery" fakediscovery "k8s.io/client-go/discovery/fake" "k8s.io/client-go/testing" - clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset" - wardlev1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1" - fakewardlev1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake" + clientset "k8s.io/sample-apiserver/pkg/client/clientset/versioned" + wardlev1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1" + fakewardlev1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake" ) // NewSimpleClientset returns a clientset that will respond with the provided objects. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/doc.go new file mode 100644 index 00000000000..5f565b3c8d4 --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/doc.go @@ -0,0 +1,20 @@ +/* +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. +*/ + +// This package is generated by client-gen with custom arguments. + +// This package has the automatically generated fake clientset. +package fake diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/register.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/register.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/fake/register.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/fake/register.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/BUILD similarity index 84% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/BUILD index 8d423db96c2..18b629f3e74 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,6 +6,7 @@ go_library( "doc.go", "register.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -31,4 +27,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/doc.go new file mode 100644 index 00000000000..5d8ec824f0f --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/doc.go @@ -0,0 +1,20 @@ +/* +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. +*/ + +// This package is generated by client-gen with custom arguments. + +// This package contains the scheme of the automatically generated clientset. +package scheme diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/register.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/register.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme/register.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme/register.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/BUILD similarity index 76% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/BUILD index 4d0eb671eef..8b213077a7b 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -14,6 +9,7 @@ go_library( "generated_expansion.go", "wardle_client.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", @@ -21,7 +17,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme:go_default_library", ], ) @@ -36,7 +32,8 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/doc.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/doc.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/doc.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/BUILD similarity index 79% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/BUILD index 94cdf0f6b28..542ae525f1e 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -13,6 +8,7 @@ go_library( "fake_flunder.go", "fake_wardle_client.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", @@ -22,7 +18,7 @@ go_library( "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1:go_default_library", ], ) @@ -37,4 +33,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/doc.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/doc.go new file mode 100644 index 00000000000..c6548330a0d --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/doc.go @@ -0,0 +1,20 @@ +/* +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. +*/ + +// This package is generated by client-gen with custom arguments. + +// Package fake has the automatically generated clients. +package fake diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/fake_fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/fake_fischer.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/fake_fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/fake_fischer.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/fake_flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/fake_flunder.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/fake_flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/fake_flunder.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/fake_wardle_client.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/fake_wardle_client.go similarity index 92% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/fake_wardle_client.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/fake_wardle_client.go index 7d4f2919926..6c7e27b5a75 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fake/fake_wardle_client.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fake/fake_wardle_client.go @@ -19,7 +19,7 @@ package fake import ( rest "k8s.io/client-go/rest" testing "k8s.io/client-go/testing" - v1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1" + v1alpha1 "k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1" ) type FakeWardleV1alpha1 struct { diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fischer.go similarity index 98% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fischer.go index 0ad425a4d96..d7dff8c6a34 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/fischer.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/fischer.go @@ -22,7 +22,7 @@ import ( watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" v1alpha1 "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" - scheme "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme" + scheme "k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme" ) // FischersGetter has a method to return a FischerInterface. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/flunder.go similarity index 98% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/flunder.go index 8e7c9f0d958..06de3c5ed1e 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/flunder.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/flunder.go @@ -22,7 +22,7 @@ import ( watch "k8s.io/apimachinery/pkg/watch" rest "k8s.io/client-go/rest" v1alpha1 "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" - scheme "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme" + scheme "k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme" ) // FlundersGetter has a method to return a FlunderInterface. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/generated_expansion.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/generated_expansion.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/generated_expansion.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/generated_expansion.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/wardle_client.go b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/wardle_client.go similarity index 97% rename from staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/wardle_client.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/wardle_client.go index 61fda3fb590..6f646d08cfb 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/typed/wardle/v1alpha1/wardle_client.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/clientset/versioned/typed/wardle/v1alpha1/wardle_client.go @@ -20,7 +20,7 @@ import ( serializer "k8s.io/apimachinery/pkg/runtime/serializer" rest "k8s.io/client-go/rest" v1alpha1 "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" - "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset/scheme" + "k8s.io/sample-apiserver/pkg/client/clientset/versioned/scheme" ) type WardleV1alpha1Interface interface { diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/BUILD similarity index 58% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/BUILD index 0895ac3e068..8d612a27a32 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,14 +6,15 @@ go_library( "factory.go", "generic.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle:go_default_library", ], ) @@ -33,8 +29,9 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/factory.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/factory.go similarity index 91% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/factory.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/factory.go index b7dad569840..63e9ad8d225 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/factory.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/factory.go @@ -22,16 +22,16 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset" - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces" - wardle "k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle" + versioned "k8s.io/sample-apiserver/pkg/client/clientset/versioned" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces" + wardle "k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle" reflect "reflect" sync "sync" time "time" ) type sharedInformerFactory struct { - client clientset.Interface + client versioned.Interface lock sync.Mutex defaultResync time.Duration @@ -42,7 +42,7 @@ type sharedInformerFactory struct { } // NewSharedInformerFactory constructs a new instance of sharedInformerFactory -func NewSharedInformerFactory(client clientset.Interface, defaultResync time.Duration) SharedInformerFactory { +func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { return &sharedInformerFactory{ client: client, defaultResync: defaultResync, diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/generic.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/generic.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/generic.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/generic.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD similarity index 67% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD index d5aea15716b..e1cc00557a8 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD @@ -1,17 +1,13 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned:go_default_library", ], ) @@ -26,4 +22,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go similarity index 94% rename from staging/src/k8s.io/code-generator/_examples/informers/externalversions/internalinterfaces/factory_interfaces.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go index d8bb1463d40..9e5ba429024 100644 --- a/staging/src/k8s.io/code-generator/_examples/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -21,7 +21,7 @@ package internalinterfaces import ( runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" - versioned "k8s.io/code-generator/_test/clientset/versioned" + versioned "k8s.io/sample-apiserver/pkg/client/clientset/versioned" time "time" ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/BUILD new file mode 100644 index 00000000000..626932bdcf7 --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/BUILD @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["interface.go"], + visibility = ["//visibility:public"], + deps = [ + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/interface.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/interface.go similarity index 89% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/interface.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/interface.go index a0f6ad14eb9..394dc0d4107 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/interface.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/interface.go @@ -19,8 +19,8 @@ limitations under the License. package wardle import ( - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces" - v1alpha1 "k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1" ) // Interface provides access to each of this group's versions. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/BUILD similarity index 62% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/BUILD index e7ad18c5484..97acf48f2a8 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -12,15 +7,16 @@ go_library( "flunder.go", "interface.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/versioned:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1:go_default_library", ], ) @@ -35,4 +31,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/fischer.go similarity index 87% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/fischer.go index 513d170866a..96de7882740 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/fischer.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/fischer.go @@ -24,9 +24,9 @@ import ( watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" wardle_v1alpha1 "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" - clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset" - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces" - v1alpha1 "k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1" + versioned "k8s.io/sample-apiserver/pkg/client/clientset/versioned" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1" time "time" ) @@ -44,7 +44,7 @@ type fischerInformer struct { // NewFischerInformer constructs a new informer for Fischer type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFischerInformer(client clientset.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { +func NewFischerInformer(client versioned.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { @@ -60,7 +60,7 @@ func NewFischerInformer(client clientset.Interface, resyncPeriod time.Duration, ) } -func defaultFischerInformer(client clientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { +func defaultFischerInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { return NewFischerInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/flunder.go similarity index 87% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/flunder.go index 14fa4faa780..4a2546971f9 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/flunder.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/flunder.go @@ -24,9 +24,9 @@ import ( watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" wardle_v1alpha1 "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" - clientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset" - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces" - v1alpha1 "k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1" + versioned "k8s.io/sample-apiserver/pkg/client/clientset/versioned" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1" time "time" ) @@ -44,7 +44,7 @@ type flunderInformer struct { // NewFlunderInformer constructs a new informer for Flunder type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFlunderInformer(client clientset.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { +func NewFlunderInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { @@ -60,7 +60,7 @@ func NewFlunderInformer(client clientset.Interface, namespace string, resyncPeri ) } -func defaultFlunderInformer(client clientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { +func defaultFlunderInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { return NewFlunderInformer(client, v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/interface.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/interface.go similarity index 96% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/interface.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/interface.go index 118a824027d..0feeac02098 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1/interface.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/externalversions/wardle/v1alpha1/interface.go @@ -19,7 +19,7 @@ limitations under the License. package v1alpha1 import ( - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/externalversions/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/BUILD similarity index 57% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/BUILD index 337af4e206f..6326101e17d 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,14 +6,15 @@ go_library( "factory.go", "generic.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle:go_default_library", ], ) @@ -33,8 +29,9 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces:all-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces:all-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/factory.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/factory.go similarity index 89% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/factory.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/factory.go index e396f3c474e..f791d749060 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/factory.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/factory.go @@ -22,16 +22,16 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" - internalclientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset" - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces" - wardle "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle" + internalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces" + wardle "k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle" reflect "reflect" sync "sync" time "time" ) type sharedInformerFactory struct { - client internalclientset.Interface + client internalversion.Interface lock sync.Mutex defaultResync time.Duration @@ -42,7 +42,7 @@ type sharedInformerFactory struct { } // NewSharedInformerFactory constructs a new instance of sharedInformerFactory -func NewSharedInformerFactory(client internalclientset.Interface, defaultResync time.Duration) SharedInformerFactory { +func NewSharedInformerFactory(client internalversion.Interface, defaultResync time.Duration) SharedInformerFactory { return &sharedInformerFactory{ client: client, defaultResync: defaultResync, diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/generic.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/generic.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/generic.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/generic.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD similarity index 66% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD index 8879ae2650b..83dc6b84616 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD @@ -1,17 +1,13 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/clientset:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion:go_default_library", ], ) @@ -26,4 +22,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go new file mode 100644 index 00000000000..2be840a72a6 --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go @@ -0,0 +1,34 @@ +/* +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. +*/ + +// This file was automatically generated by informer-gen + +package internalinterfaces + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" + cache "k8s.io/client-go/tools/cache" + internalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion" + time "time" +) + +type NewInformerFunc func(internalversion.Interface, time.Duration) cache.SharedIndexInformer + +// SharedInformerFactory a small interface to allow for adding an informer without an import cycle +type SharedInformerFactory interface { + Start(stopCh <-chan struct{}) + InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer +} diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/BUILD new file mode 100644 index 00000000000..e26a96180c0 --- /dev/null +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/BUILD @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["interface.go"], + visibility = ["//visibility:public"], + deps = [ + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/interface.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/interface.go similarity index 89% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/interface.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/interface.go index b9c7ff7c6af..d65212aff77 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/interface.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/interface.go @@ -19,8 +19,8 @@ limitations under the License. package wardle import ( - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces" - internalversion "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces" + internalversion "k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion" ) // Interface provides access to each of this group's versions. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/BUILD similarity index 61% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/BUILD index e8a316318a9..e32459ac3b2 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -12,15 +7,16 @@ go_library( "flunder.go", "interface.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion:go_default_library", ], ) @@ -35,4 +31,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/fischer.go similarity index 81% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/fischer.go index d20ab3b5361..13a4af1cb93 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/fischer.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/fischer.go @@ -24,9 +24,9 @@ import ( watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" wardle "k8s.io/sample-apiserver/pkg/apis/wardle" - internalclientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset" - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces" - internalversion "k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion" + clientset_internalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces" + internalversion "k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion" time "time" ) @@ -44,7 +44,7 @@ type fischerInformer struct { // NewFischerInformer constructs a new informer for Fischer type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFischerInformer(client internalclientset.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { +func NewFischerInformer(client clientset_internalversion.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { @@ -60,7 +60,7 @@ func NewFischerInformer(client internalclientset.Interface, resyncPeriod time.Du ) } -func defaultFischerInformer(client internalclientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { +func defaultFischerInformer(client clientset_internalversion.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { return NewFischerInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/flunder.go similarity index 81% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/flunder.go index 2be25a6d54b..bbabc38113d 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/flunder.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/flunder.go @@ -24,9 +24,9 @@ import ( watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" wardle "k8s.io/sample-apiserver/pkg/apis/wardle" - internalclientset "k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset" - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces" - internalversion "k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion" + clientset_internalversion "k8s.io/sample-apiserver/pkg/client/clientset/internalversion" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces" + internalversion "k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion" time "time" ) @@ -44,7 +44,7 @@ type flunderInformer struct { // NewFlunderInformer constructs a new informer for Flunder type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. -func NewFlunderInformer(client internalclientset.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { +func NewFlunderInformer(client clientset_internalversion.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options v1.ListOptions) (runtime.Object, error) { @@ -60,7 +60,7 @@ func NewFlunderInformer(client internalclientset.Interface, namespace string, re ) } -func defaultFlunderInformer(client internalclientset.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { +func defaultFlunderInformer(client clientset_internalversion.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { return NewFlunderInformer(client, v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/interface.go b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/interface.go similarity index 96% rename from staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/interface.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/interface.go index cccc0689ec4..25de414f0aa 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion/interface.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/informers/internalversion/wardle/internalversion/interface.go @@ -19,7 +19,7 @@ limitations under the License. package internalversion import ( - internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces" + internalinterfaces "k8s.io/sample-apiserver/pkg/client/informers/internalversion/internalinterfaces" ) // Interface provides access to all the informers in this group version. diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD deleted file mode 100644 index b3371dcd327..00000000000 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - deps = [ - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/externalversions/wardle/v1alpha1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD deleted file mode 100644 index 8423ea59956..00000000000 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - deps = [ - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion/wardle/internalversion:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/BUILD similarity index 84% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/BUILD index 41c866a1745..8e474bb0cbe 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -12,6 +7,7 @@ go_library( "fischer.go", "flunder.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -32,4 +28,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/expansion_generated.go b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/expansion_generated.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/expansion_generated.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/fischer.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/fischer.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/flunder.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/internalversion/flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/internalversion/flunder.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/BUILD similarity index 84% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/BUILD rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/BUILD index 41c1c34c495..ab826f17907 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -12,6 +7,7 @@ go_library( "fischer.go", "flunder.go", ], + visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -32,4 +28,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/expansion_generated.go b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/expansion_generated.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/expansion_generated.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/expansion_generated.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/fischer.go b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/fischer.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/fischer.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/fischer.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/flunder.go b/staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/flunder.go similarity index 100% rename from staging/src/k8s.io/sample-apiserver/pkg/client/listers_generated/wardle/v1alpha1/flunder.go rename to staging/src/k8s.io/sample-apiserver/pkg/client/listers/wardle/v1alpha1/flunder.go diff --git a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD index ab8fc50668c..3a91ce8eafb 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD +++ b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/BUILD @@ -17,8 +17,8 @@ go_library( "//vendor/k8s.io/sample-apiserver/pkg/admission/wardleinitializer:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1:go_default_library", "//vendor/k8s.io/sample-apiserver/pkg/apiserver:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/clientset_generated/internalclientset:go_default_library", - "//vendor/k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/clientset/internalversion:go_default_library", + "//vendor/k8s.io/sample-apiserver/pkg/client/informers/internalversion:go_default_library", ], ) From 607fddf9847c5831bbfb245c57b8e16f671758db Mon Sep 17 00:00:00 2001 From: Seth Jennings Date: Wed, 4 Oct 2017 12:00:25 -0500 Subject: [PATCH 44/51] kubelet: add metrics to network plugin manager --- pkg/kubelet/network/BUILD | 2 + pkg/kubelet/network/metrics/BUILD | 22 ++++++++++ pkg/kubelet/network/metrics/metrics.go | 61 ++++++++++++++++++++++++++ pkg/kubelet/network/plugins.go | 11 +++++ 4 files changed, 96 insertions(+) create mode 100644 pkg/kubelet/network/metrics/BUILD create mode 100644 pkg/kubelet/network/metrics/metrics.go diff --git a/pkg/kubelet/network/BUILD b/pkg/kubelet/network/BUILD index 31e267a2e63..617b4936450 100644 --- a/pkg/kubelet/network/BUILD +++ b/pkg/kubelet/network/BUILD @@ -15,6 +15,7 @@ go_library( "//pkg/kubelet/apis/kubeletconfig:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/network/hostport:go_default_library", + "//pkg/kubelet/network/metrics:go_default_library", "//pkg/util/sysctl:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -42,6 +43,7 @@ filegroup( "//pkg/kubelet/network/hairpin:all-srcs", "//pkg/kubelet/network/hostport:all-srcs", "//pkg/kubelet/network/kubenet:all-srcs", + "//pkg/kubelet/network/metrics:all-srcs", "//pkg/kubelet/network/testing:all-srcs", ], tags = ["automanaged"], diff --git a/pkg/kubelet/network/metrics/BUILD b/pkg/kubelet/network/metrics/BUILD new file mode 100644 index 00000000000..4ffff6b38da --- /dev/null +++ b/pkg/kubelet/network/metrics/BUILD @@ -0,0 +1,22 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["metrics.go"], + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/prometheus/client_golang/prometheus: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/network/metrics/metrics.go b/pkg/kubelet/network/metrics/metrics.go new file mode 100644 index 00000000000..9e4ff185517 --- /dev/null +++ b/pkg/kubelet/network/metrics/metrics.go @@ -0,0 +1,61 @@ +/* +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 metrics + +import ( + "sync" + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +const ( + // NetworkPluginOperationsKey is the key for operation count metrics. + NetworkPluginOperationsKey = "network_plugin_operations" + // NetworkPluginOperationsLatencyKey is the key for the operation latency metrics. + NetworkPluginOperationsLatencyKey = "network_plugin_operations_latency_microseconds" + + // Keep the "kubelet" subsystem for backward compatibility. + kubeletSubsystem = "kubelet" +) + +var ( + // NetworkPluginOperationsLatency collects operation latency numbers by operation + // type. + NetworkPluginOperationsLatency = prometheus.NewSummaryVec( + prometheus.SummaryOpts{ + Subsystem: kubeletSubsystem, + Name: NetworkPluginOperationsLatencyKey, + Help: "Latency in microseconds of network plugin operations. Broken down by operation type.", + }, + []string{"operation_type"}, + ) +) + +var registerMetrics sync.Once + +// Register all metrics. +func Register() { + registerMetrics.Do(func() { + prometheus.MustRegister(NetworkPluginOperationsLatency) + }) +} + +// SinceInMicroseconds gets the time since the specified start in microseconds. +func SinceInMicroseconds(start time.Time) float64 { + return float64(time.Since(start).Nanoseconds() / time.Microsecond.Nanoseconds()) +} diff --git a/pkg/kubelet/network/plugins.go b/pkg/kubelet/network/plugins.go index 7fac1f137a1..1714af8005d 100644 --- a/pkg/kubelet/network/plugins.go +++ b/pkg/kubelet/network/plugins.go @@ -21,6 +21,7 @@ import ( "net" "strings" "sync" + "time" "github.com/golang/glog" "k8s.io/api/core/v1" @@ -32,6 +33,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/network/hostport" + "k8s.io/kubernetes/pkg/kubelet/network/metrics" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" utilexec "k8s.io/utils/exec" ) @@ -304,6 +306,7 @@ type PluginManager struct { } func NewPluginManager(plugin NetworkPlugin) *PluginManager { + metrics.Register() return &PluginManager{ plugin: plugin, pods: make(map[string]*podLock), @@ -371,7 +374,13 @@ func (pm *PluginManager) podUnlock(fullPodName string) { } } +// recordOperation records operation and duration +func recordOperation(operation string, start time.Time) { + metrics.NetworkPluginOperationsLatency.WithLabelValues(operation).Observe(metrics.SinceInMicroseconds(start)) +} + func (pm *PluginManager) GetPodNetworkStatus(podNamespace, podName string, id kubecontainer.ContainerID) (*PodNetworkStatus, error) { + defer recordOperation("get_pod_network_status", time.Now()) fullPodName := kubecontainer.BuildPodFullName(podName, podNamespace) pm.podLock(fullPodName).Lock() defer pm.podUnlock(fullPodName) @@ -385,6 +394,7 @@ func (pm *PluginManager) GetPodNetworkStatus(podNamespace, podName string, id ku } func (pm *PluginManager) SetUpPod(podNamespace, podName string, id kubecontainer.ContainerID, annotations map[string]string) error { + defer recordOperation("set_up_pod", time.Now()) fullPodName := kubecontainer.BuildPodFullName(podName, podNamespace) pm.podLock(fullPodName).Lock() defer pm.podUnlock(fullPodName) @@ -398,6 +408,7 @@ func (pm *PluginManager) SetUpPod(podNamespace, podName string, id kubecontainer } func (pm *PluginManager) TearDownPod(podNamespace, podName string, id kubecontainer.ContainerID) error { + defer recordOperation("tear_down_pod", time.Now()) fullPodName := kubecontainer.BuildPodFullName(podName, podNamespace) pm.podLock(fullPodName).Lock() defer pm.podUnlock(fullPodName) From 171c9702c520517f3cf9776b417afe411238980f Mon Sep 17 00:00:00 2001 From: Nick Sardo Date: Wed, 4 Oct 2017 10:46:14 -0700 Subject: [PATCH 45/51] Ignore notFound when deleting firewall --- .../providers/gce/gce_loadbalancer_internal.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go index 31d770c849a..cb439f3562a 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go @@ -112,7 +112,7 @@ func (gce *GCECloud) ensureInternalLoadBalancer(clusterName, clusterID string, s fwdRuleDeleted := false if existingFwdRule != nil && !fwdRuleEqual(existingFwdRule, expectedFwdRule) { glog.V(2).Infof("ensureInternalLoadBalancer(%v): deleting existing forwarding rule with IP address %v", loadBalancerName, existingFwdRule.IPAddress) - if err = gce.DeleteRegionForwardingRule(loadBalancerName, gce.region); err != nil && !isNotFound(err) { + if err = ignoreNotFound(gce.DeleteRegionForwardingRule(loadBalancerName, gce.region)); err != nil { return nil, err } fwdRuleDeleted = true @@ -206,7 +206,7 @@ func (gce *GCECloud) ensureInternalLoadBalancerDeleted(clusterName, clusterID st ensureAddressDeleted(gce, loadBalancerName, gce.region) glog.V(2).Infof("ensureInternalLoadBalancerDeleted(%v): deleting region internal forwarding rule", loadBalancerName) - if err := gce.DeleteRegionForwardingRule(loadBalancerName, gce.region); err != nil && !isNotFound(err) { + if err := ignoreNotFound(gce.DeleteRegionForwardingRule(loadBalancerName, gce.region)); err != nil { return err } @@ -217,7 +217,7 @@ func (gce *GCECloud) ensureInternalLoadBalancerDeleted(clusterName, clusterID st } glog.V(2).Infof("ensureInternalLoadBalancerDeleted(%v): deleting firewall for traffic", loadBalancerName) - if err := gce.DeleteFirewall(loadBalancerName); err != nil { + if err := ignoreNotFound(gce.DeleteFirewall(loadBalancerName)); err != nil { if isForbidden(err) && gce.OnXPN() { glog.V(2).Infof("ensureInternalLoadBalancerDeleted(%v): could not delete traffic firewall on XPN cluster. Raising event.", loadBalancerName) gce.raiseFirewallChangeNeededEvent(svc, FirewallToGCloudDeleteCmd(loadBalancerName, gce.NetworkProjectID())) @@ -272,7 +272,7 @@ func (gce *GCECloud) teardownInternalHealthCheckAndFirewall(svc *v1.Service, hcN glog.V(2).Infof("teardownInternalHealthCheckAndFirewall(%v): health check deleted", hcName) hcFirewallName := makeHealthCheckFirewallNameFromHC(hcName) - if err := gce.DeleteFirewall(hcFirewallName); err != nil && !isNotFound(err) { + if err := ignoreNotFound(gce.DeleteFirewall(hcFirewallName)); err != nil { if isForbidden(err) && gce.OnXPN() { glog.V(2).Infof("teardownInternalHealthCheckAndFirewall(%v): could not delete health check traffic firewall on XPN cluster. Raising Event.", hcName) gce.raiseFirewallChangeNeededEvent(svc, FirewallToGCloudDeleteCmd(hcFirewallName, gce.NetworkProjectID())) From 187171284a37071e16489cda6fd62e5c15db14b5 Mon Sep 17 00:00:00 2001 From: p0lyn0mial Date: Mon, 2 Oct 2017 20:17:47 +0200 Subject: [PATCH 46/51] moves admission.v1alpha1.NewAdmissionReview to webhook plugin this is necessary, because the webhook plugin will be moved down to apiserver. --- pkg/apis/admission/v1alpha1/BUILD | 3 - plugin/pkg/admission/webhook/BUILD | 67 +++++++++---------- plugin/pkg/admission/webhook/admission.go | 3 +- .../pkg/admission/webhook/admissionreview.go | 7 +- 4 files changed, 37 insertions(+), 43 deletions(-) rename pkg/apis/admission/v1alpha1/helpers.go => plugin/pkg/admission/webhook/admissionreview.go (87%) diff --git a/pkg/apis/admission/v1alpha1/BUILD b/pkg/apis/admission/v1alpha1/BUILD index 984b3f6cb79..4365a186c1b 100644 --- a/pkg/apis/admission/v1alpha1/BUILD +++ b/pkg/apis/admission/v1alpha1/BUILD @@ -9,7 +9,6 @@ go_library( name = "go_default_library", srcs = [ "doc.go", - "helpers.go", "register.go", "zz_generated.conversion.go", "zz_generated.defaults.go", @@ -17,12 +16,10 @@ go_library( deps = [ "//pkg/apis/admission:go_default_library", "//vendor/k8s.io/api/admission/v1alpha1:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", ], ) diff --git a/plugin/pkg/admission/webhook/BUILD b/plugin/pkg/admission/webhook/BUILD index c90a9320dab..2c2e5ec1abf 100644 --- a/plugin/pkg/admission/webhook/BUILD +++ b/plugin/pkg/admission/webhook/BUILD @@ -1,9 +1,35 @@ -package(default_visibility = ["//visibility:public"]) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", +go_library( + name = "go_default_library", + srcs = [ + "admission.go", + "admissionreview.go", + "doc.go", + "rules.go", + "serviceresolver.go", + ], + visibility = ["//visibility:public"], + deps = [ + "//pkg/api:go_default_library", + "//pkg/apis/admission/install:go_default_library", + "//pkg/kubeapiserver/admission:go_default_library", + "//pkg/kubeapiserver/admission/configuration:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/admission/v1alpha1:go_default_library", + "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//vendor/k8s.io/api/authentication/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/rest:go_default_library", + ], ) go_test( @@ -27,36 +53,6 @@ go_test( ], ) -go_library( - name = "go_default_library", - srcs = [ - "admission.go", - "doc.go", - "rules.go", - "serviceresolver.go", - ], - deps = [ - "//pkg/api:go_default_library", - "//pkg/apis/admission/install:go_default_library", - "//pkg/apis/admission/v1alpha1:go_default_library", - "//pkg/kubeapiserver/admission:go_default_library", - "//pkg/kubeapiserver/admission/configuration:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/admission/v1alpha1:go_default_library", - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), @@ -68,4 +64,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/plugin/pkg/admission/webhook/admission.go b/plugin/pkg/admission/webhook/admission.go index 63dd7903c1d..a3e092d993e 100644 --- a/plugin/pkg/admission/webhook/admission.go +++ b/plugin/pkg/admission/webhook/admission.go @@ -41,7 +41,6 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api" - admissionv1alpha1helper "k8s.io/kubernetes/pkg/apis/admission/v1alpha1" admissioninit "k8s.io/kubernetes/pkg/kubeapiserver/admission" "k8s.io/kubernetes/pkg/kubeapiserver/admission/configuration" @@ -226,7 +225,7 @@ func (a *GenericAdmissionWebhook) callHook(ctx context.Context, h *v1alpha1.Exte } // Make the webhook request - request := admissionv1alpha1helper.NewAdmissionReview(attr) + request := createAdmissionReview(attr) client, err := a.hookClient(h) if err != nil { return &ErrCallingWebhook{WebhookName: h.Name, Reason: err} diff --git a/pkg/apis/admission/v1alpha1/helpers.go b/plugin/pkg/admission/webhook/admissionreview.go similarity index 87% rename from pkg/apis/admission/v1alpha1/helpers.go rename to plugin/pkg/admission/webhook/admissionreview.go index ad1e543744c..c9e139c713a 100644 --- a/pkg/apis/admission/v1alpha1/helpers.go +++ b/plugin/pkg/admission/webhook/admissionreview.go @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1alpha1 +// Package webhook delegates admission checks to dynamically configured webhooks. +package webhook import ( admissionv1alpha1 "k8s.io/api/admission/v1alpha1" @@ -24,8 +25,8 @@ import ( "k8s.io/apiserver/pkg/admission" ) -// NewAdmissionReview returns an AdmissionReview for the provided admission.Attributes -func NewAdmissionReview(attr admission.Attributes) admissionv1alpha1.AdmissionReview { +// createAdmissionReview creates an AdmissionReview for the provided admission.Attributes +func createAdmissionReview(attr admission.Attributes) admissionv1alpha1.AdmissionReview { gvk := attr.GetKind() gvr := attr.GetResource() aUserInfo := attr.GetUserInfo() From bed6d0f5ea694ce3aa3641667916cdee6c88b3a1 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Wed, 4 Oct 2017 13:26:43 -0400 Subject: [PATCH 47/51] Use pointer for PSP allow escalation --- api/openapi-spec/swagger.json | 2 +- api/swagger-spec/extensions_v1beta1.json | 2 +- .../extensions/v1beta1/definitions.html | 2 +- pkg/api/defaulting_test.go | 2 + pkg/apis/extensions/types.go | 2 +- pkg/apis/extensions/v1beta1/defaults.go | 9 + pkg/apis/extensions/v1beta1/defaults_test.go | 9 + .../v1beta1/zz_generated.conversion.go | 8 +- .../v1beta1/zz_generated.defaults.go | 13 + .../api/extensions/v1beta1/generated.pb.go | 484 +++++++++--------- .../api/extensions/v1beta1/generated.proto | 2 +- .../k8s.io/api/extensions/v1beta1/types.go | 4 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../v1beta1/zz_generated.deepcopy.go | 9 + 14 files changed, 300 insertions(+), 250 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index e7e29c8be65..2ce78407d68 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -70224,7 +70224,7 @@ ], "properties": { "allowPrivilegeEscalation": { - "description": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation.", + "description": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", "type": "boolean" }, "allowedCapabilities": { diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 4efc926ca6f..6d86c3f52cd 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -10197,7 +10197,7 @@ }, "allowPrivilegeEscalation": { "type": "boolean", - "description": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation." + "description": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true." }, "allowedHostPaths": { "type": "array", diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index ff36fd23bc6..5b6c556941f 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -7809,7 +7809,7 @@ Both these may change in the future. Incoming requests are matched against the h

allowPrivilegeEscalation

-

AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation.

+

AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.

false

boolean

false

diff --git a/pkg/api/defaulting_test.go b/pkg/api/defaulting_test.go index 8a637727dcf..36a2ff1b3f5 100644 --- a/pkg/api/defaulting_test.go +++ b/pkg/api/defaulting_test.go @@ -105,6 +105,8 @@ func TestDefaulting(t *testing.T) { {Group: "apps", Version: "v1beta1", Kind: "DeploymentList"}: {}, {Group: "apps", Version: "v1beta2", Kind: "Deployment"}: {}, {Group: "apps", Version: "v1beta2", Kind: "DeploymentList"}: {}, + {Group: "extensions", Version: "v1beta1", Kind: "PodSecurityPolicy"}: {}, + {Group: "extensions", Version: "v1beta1", Kind: "PodSecurityPolicyList"}: {}, {Group: "apps", Version: "v1beta2", Kind: "ReplicaSet"}: {}, {Group: "apps", Version: "v1beta2", Kind: "ReplicaSetList"}: {}, {Group: "extensions", Version: "v1beta1", Kind: "ReplicaSet"}: {}, diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index 35858b278af..3abc8f8f30c 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -937,7 +937,7 @@ type PodSecurityPolicySpec struct { // +optional DefaultAllowPrivilegeEscalation *bool // AllowPrivilegeEscalation determines if a pod can request to allow - // privilege escalation. + // privilege escalation. If unspecified, defaults to true. // +optional AllowPrivilegeEscalation bool // AllowedHostPaths is a white list of allowed host paths. Empty indicates that all host paths may be used. diff --git a/pkg/apis/extensions/v1beta1/defaults.go b/pkg/apis/extensions/v1beta1/defaults.go index c653e812bec..d817c2f0f44 100644 --- a/pkg/apis/extensions/v1beta1/defaults.go +++ b/pkg/apis/extensions/v1beta1/defaults.go @@ -63,6 +63,15 @@ func SetDefaults_DaemonSet(obj *extensionsv1beta1.DaemonSet) { } } +func SetDefaults_PodSecurityPolicySpec(obj *extensionsv1beta1.PodSecurityPolicySpec) { + // This field was added after PodSecurityPolicy was released. + // Policies that do not include this field must remain as permissive as they were prior to the introduction of this field. + if obj.AllowPrivilegeEscalation == nil { + t := true + obj.AllowPrivilegeEscalation = &t + } +} + func SetDefaults_Deployment(obj *extensionsv1beta1.Deployment) { // Default labels and selector to labels from pod template spec. labels := obj.Spec.Template.Labels diff --git a/pkg/apis/extensions/v1beta1/defaults_test.go b/pkg/apis/extensions/v1beta1/defaults_test.go index e208b51afd7..e1c2b527d3b 100644 --- a/pkg/apis/extensions/v1beta1/defaults_test.go +++ b/pkg/apis/extensions/v1beta1/defaults_test.go @@ -509,6 +509,15 @@ func TestDefaultRequestIsNotSetForReplicaSet(t *testing.T) { } } +func TestDefaultAllowPrivilegeEscalationForPodSecurityPolicy(t *testing.T) { + psp := &extensionsv1beta1.PodSecurityPolicy{} + output := roundTrip(t, runtime.Object(psp)) + psp2 := output.(*extensionsv1beta1.PodSecurityPolicy) + if psp2.Spec.AllowPrivilegeEscalation == nil || *psp2.Spec.AllowPrivilegeEscalation != true { + t.Errorf("Expected default to true, got: %#v", psp2.Spec.AllowPrivilegeEscalation) + } +} + func TestSetDefaultNetworkPolicy(t *testing.T) { tests := []struct { original *extensionsv1beta1.NetworkPolicy diff --git a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go index 7e663678310..95b006f05b5 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go @@ -1075,7 +1075,9 @@ func autoConvert_v1beta1_PodSecurityPolicySpec_To_extensions_PodSecurityPolicySp } out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.DefaultAllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.DefaultAllowPrivilegeEscalation)) - out.AllowPrivilegeEscalation = in.AllowPrivilegeEscalation + if err := v1.Convert_Pointer_bool_To_bool(&in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation, s); err != nil { + return err + } out.AllowedHostPaths = *(*[]extensions.AllowedHostPath)(unsafe.Pointer(&in.AllowedHostPaths)) return nil } @@ -1119,7 +1121,9 @@ func autoConvert_extensions_PodSecurityPolicySpec_To_v1beta1_PodSecurityPolicySp } out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.DefaultAllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.DefaultAllowPrivilegeEscalation)) - out.AllowPrivilegeEscalation = in.AllowPrivilegeEscalation + if err := v1.Convert_bool_To_Pointer_bool(&in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation, s); err != nil { + return err + } out.AllowedHostPaths = *(*[]v1beta1.AllowedHostPath)(unsafe.Pointer(&in.AllowedHostPaths)) return nil } diff --git a/pkg/apis/extensions/v1beta1/zz_generated.defaults.go b/pkg/apis/extensions/v1beta1/zz_generated.defaults.go index ba0c3716a23..11bd8e64018 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.defaults.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.defaults.go @@ -36,6 +36,8 @@ func RegisterDefaults(scheme *runtime.Scheme) error { scheme.AddTypeDefaultingFunc(&v1beta1.DeploymentList{}, func(obj interface{}) { SetObjectDefaults_DeploymentList(obj.(*v1beta1.DeploymentList)) }) scheme.AddTypeDefaultingFunc(&v1beta1.NetworkPolicy{}, func(obj interface{}) { SetObjectDefaults_NetworkPolicy(obj.(*v1beta1.NetworkPolicy)) }) scheme.AddTypeDefaultingFunc(&v1beta1.NetworkPolicyList{}, func(obj interface{}) { SetObjectDefaults_NetworkPolicyList(obj.(*v1beta1.NetworkPolicyList)) }) + scheme.AddTypeDefaultingFunc(&v1beta1.PodSecurityPolicy{}, func(obj interface{}) { SetObjectDefaults_PodSecurityPolicy(obj.(*v1beta1.PodSecurityPolicy)) }) + scheme.AddTypeDefaultingFunc(&v1beta1.PodSecurityPolicyList{}, func(obj interface{}) { SetObjectDefaults_PodSecurityPolicyList(obj.(*v1beta1.PodSecurityPolicyList)) }) scheme.AddTypeDefaultingFunc(&v1beta1.ReplicaSet{}, func(obj interface{}) { SetObjectDefaults_ReplicaSet(obj.(*v1beta1.ReplicaSet)) }) scheme.AddTypeDefaultingFunc(&v1beta1.ReplicaSetList{}, func(obj interface{}) { SetObjectDefaults_ReplicaSetList(obj.(*v1beta1.ReplicaSetList)) }) return nil @@ -340,6 +342,17 @@ func SetObjectDefaults_NetworkPolicyList(in *v1beta1.NetworkPolicyList) { } } +func SetObjectDefaults_PodSecurityPolicy(in *v1beta1.PodSecurityPolicy) { + SetDefaults_PodSecurityPolicySpec(&in.Spec) +} + +func SetObjectDefaults_PodSecurityPolicyList(in *v1beta1.PodSecurityPolicyList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_PodSecurityPolicy(a) + } +} + func SetObjectDefaults_ReplicaSet(in *v1beta1.ReplicaSet) { SetDefaults_ReplicaSet(in) v1.SetDefaults_PodSpec(&in.Spec.Template.Spec) diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go index 63d492fc85f..d508216ae08 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -2175,16 +2175,18 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { } i++ } - dAtA[i] = 0x80 - i++ - dAtA[i] = 0x1 - i++ - if m.AllowPrivilegeEscalation { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.AllowPrivilegeEscalation != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x1 + i++ + if *m.AllowPrivilegeEscalation { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ } - i++ if len(m.AllowedHostPaths) > 0 { for _, msg := range m.AllowedHostPaths { dAtA[i] = 0x8a @@ -3520,7 +3522,9 @@ func (m *PodSecurityPolicySpec) Size() (n int) { if m.DefaultAllowPrivilegeEscalation != nil { n += 2 } - n += 3 + if m.AllowPrivilegeEscalation != nil { + n += 3 + } if len(m.AllowedHostPaths) > 0 { for _, e := range m.AllowedHostPaths { l = e.Size() @@ -4297,7 +4301,7 @@ func (this *PodSecurityPolicySpec) String() string { `FSGroup:` + strings.Replace(strings.Replace(this.FSGroup.String(), "FSGroupStrategyOptions", "FSGroupStrategyOptions", 1), `&`, ``, 1) + `,`, `ReadOnlyRootFilesystem:` + fmt.Sprintf("%v", this.ReadOnlyRootFilesystem) + `,`, `DefaultAllowPrivilegeEscalation:` + valueToStringGenerated(this.DefaultAllowPrivilegeEscalation) + `,`, - `AllowPrivilegeEscalation:` + fmt.Sprintf("%v", this.AllowPrivilegeEscalation) + `,`, + `AllowPrivilegeEscalation:` + valueToStringGenerated(this.AllowPrivilegeEscalation) + `,`, `AllowedHostPaths:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedHostPaths), "AllowedHostPath", "AllowedHostPath", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -10170,7 +10174,8 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { break } } - m.AllowPrivilegeEscalation = bool(v != 0) + b := bool(v != 0) + m.AllowPrivilegeEscalation = &b case 17: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AllowedHostPaths", wireType) @@ -12654,233 +12659,232 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3634 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0xcd, 0x6f, 0x23, 0xc9, - 0x75, 0x9f, 0xe6, 0x87, 0x48, 0x3d, 0x8d, 0xbe, 0x4a, 0xb3, 0x12, 0xad, 0xdd, 0x11, 0xe5, 0x5e, - 0x60, 0x32, 0xbb, 0xd9, 0x25, 0x77, 0xb4, 0x3b, 0xeb, 0xcd, 0x2e, 0x62, 0x47, 0x94, 0xe6, 0x43, - 0x8e, 0x3e, 0xb8, 0x45, 0x4a, 0x4e, 0x16, 0x1e, 0x67, 0x5b, 0x64, 0x89, 0xea, 0x51, 0xb3, 0xbb, - 0xdd, 0x5d, 0x2d, 0x8b, 0x97, 0x20, 0x87, 0xc0, 0x40, 0x80, 0x04, 0x49, 0x0e, 0x0e, 0x1c, 0x20, - 0x87, 0xf8, 0x92, 0x53, 0x82, 0xf8, 0x96, 0x1c, 0x0c, 0x03, 0x01, 0x1c, 0x60, 0x10, 0x38, 0x81, - 0x4f, 0x89, 0x4f, 0x42, 0x56, 0x3e, 0xe6, 0x1f, 0x08, 0xe6, 0x10, 0x04, 0x55, 0x5d, 0xfd, 0xdd, - 0x2d, 0x92, 0xda, 0x91, 0x10, 0xe4, 0xc6, 0xae, 0xf7, 0xde, 0xef, 0xbd, 0x7a, 0x55, 0xf5, 0xde, - 0xab, 0x0f, 0xc2, 0xe3, 0x93, 0x8f, 0xec, 0x9a, 0x6a, 0xd4, 0x4f, 0x9c, 0x43, 0x62, 0xe9, 0x84, - 0x12, 0xbb, 0x7e, 0x4a, 0xf4, 0xae, 0x61, 0xd5, 0x05, 0x41, 0x31, 0xd5, 0x3a, 0x39, 0xa3, 0x44, - 0xb7, 0x55, 0x43, 0xb7, 0xeb, 0xa7, 0x0f, 0x0e, 0x09, 0x55, 0x1e, 0xd4, 0x7b, 0x44, 0x27, 0x96, - 0x42, 0x49, 0xb7, 0x66, 0x5a, 0x06, 0x35, 0xd0, 0x5d, 0x97, 0xbd, 0xa6, 0x98, 0x6a, 0x2d, 0x60, - 0xaf, 0x09, 0xf6, 0xe5, 0x77, 0x7b, 0x2a, 0x3d, 0x76, 0x0e, 0x6b, 0x1d, 0xa3, 0x5f, 0xef, 0x19, - 0x3d, 0xa3, 0xce, 0xa5, 0x0e, 0x9d, 0x23, 0xfe, 0xc5, 0x3f, 0xf8, 0x2f, 0x17, 0x6d, 0x59, 0x0e, - 0x29, 0xef, 0x18, 0x16, 0xa9, 0x9f, 0x26, 0x34, 0x2e, 0xbf, 0x15, 0xe2, 0x31, 0x0d, 0x4d, 0xed, - 0x0c, 0xb2, 0x8c, 0x5b, 0xfe, 0x20, 0x60, 0xed, 0x2b, 0x9d, 0x63, 0x55, 0x27, 0xd6, 0xa0, 0x6e, - 0x9e, 0xf4, 0xb8, 0xac, 0x45, 0x6c, 0xc3, 0xb1, 0x3a, 0x64, 0x2c, 0x29, 0xbb, 0xde, 0x27, 0x54, - 0x49, 0x33, 0xab, 0x9e, 0x25, 0x65, 0x39, 0x3a, 0x55, 0xfb, 0x49, 0x35, 0x1f, 0x0e, 0x13, 0xb0, - 0x3b, 0xc7, 0xa4, 0xaf, 0x24, 0xe4, 0xde, 0xcf, 0x92, 0x73, 0xa8, 0xaa, 0xd5, 0x55, 0x9d, 0xda, - 0xd4, 0x8a, 0x0b, 0xc9, 0x35, 0x80, 0xf5, 0xe6, 0xd6, 0x01, 0xb1, 0xd8, 0xf0, 0xa0, 0x55, 0x28, - 0xe8, 0x4a, 0x9f, 0x54, 0xa4, 0x55, 0xe9, 0xfe, 0x64, 0xe3, 0xf6, 0x8b, 0xf3, 0xea, 0xad, 0x8b, - 0xf3, 0x6a, 0x61, 0x57, 0xe9, 0x13, 0xcc, 0x29, 0xf2, 0x23, 0x98, 0x5d, 0xd7, 0x34, 0xe3, 0x7b, - 0xa4, 0xfb, 0xd4, 0xb0, 0x69, 0x53, 0xa1, 0xc7, 0x68, 0x0d, 0xc0, 0x54, 0xe8, 0x71, 0xd3, 0x22, - 0x47, 0xea, 0x99, 0x10, 0x45, 0x42, 0x14, 0x9a, 0x3e, 0x05, 0x87, 0xb8, 0xe4, 0xbf, 0x94, 0xe0, - 0x2b, 0x1b, 0x8e, 0x4d, 0x8d, 0xfe, 0x0e, 0xa1, 0x96, 0xda, 0xd9, 0x70, 0x2c, 0x8b, 0xe8, 0xb4, - 0x45, 0x15, 0xea, 0xd8, 0xc3, 0xcd, 0x40, 0x9f, 0x41, 0xf1, 0x54, 0xd1, 0x1c, 0x52, 0xc9, 0xad, - 0x4a, 0xf7, 0xa7, 0xd6, 0x6a, 0xb5, 0x60, 0xb6, 0xf9, 0x7d, 0xaf, 0x99, 0x27, 0x3d, 0x3e, 0xfd, - 0xbc, 0x01, 0xad, 0x7d, 0xea, 0x28, 0x3a, 0x55, 0xe9, 0xa0, 0x71, 0x47, 0x40, 0xde, 0x16, 0x7a, - 0x0f, 0x18, 0x16, 0x76, 0x21, 0xe5, 0xdf, 0x87, 0xbb, 0x99, 0xa6, 0x6d, 0xab, 0x36, 0x45, 0xcf, - 0xa0, 0xa8, 0x52, 0xd2, 0xb7, 0x2b, 0xd2, 0x6a, 0xfe, 0xfe, 0xd4, 0xda, 0x47, 0xb5, 0x4b, 0xa7, - 0x7a, 0x2d, 0x13, 0xac, 0x31, 0x2d, 0xcc, 0x28, 0x6e, 0x31, 0x38, 0xec, 0xa2, 0xca, 0x7f, 0x2e, - 0x01, 0x0a, 0xcb, 0xb4, 0x15, 0xab, 0x47, 0xe8, 0x08, 0x4e, 0xf9, 0xdd, 0x2f, 0xe7, 0x94, 0x05, - 0x01, 0x39, 0xe5, 0x2a, 0x8c, 0xf8, 0xc4, 0x84, 0xc5, 0xa4, 0x49, 0xdc, 0x19, 0x07, 0x51, 0x67, - 0x3c, 0x18, 0xc3, 0x19, 0x2e, 0x4a, 0x86, 0x17, 0x7e, 0x90, 0x83, 0xc9, 0x4d, 0x85, 0xf4, 0x0d, - 0xbd, 0x45, 0x28, 0xfa, 0x1c, 0xca, 0x6c, 0x7d, 0x75, 0x15, 0xaa, 0x70, 0x07, 0x4c, 0xad, 0xbd, - 0x77, 0x59, 0xef, 0xec, 0x1a, 0xe3, 0xae, 0x9d, 0x3e, 0xa8, 0xed, 0x1d, 0x3e, 0x27, 0x1d, 0xba, - 0x43, 0xa8, 0x12, 0xcc, 0xc9, 0xa0, 0x0d, 0xfb, 0xa8, 0x68, 0x17, 0x0a, 0xb6, 0x49, 0x3a, 0xc2, - 0x77, 0xef, 0x0c, 0xe9, 0x86, 0x6f, 0x59, 0xcb, 0x24, 0x9d, 0x60, 0x30, 0xd8, 0x17, 0xe6, 0x38, - 0xe8, 0x00, 0x26, 0x6c, 0x3e, 0xca, 0x95, 0x7c, 0x62, 0x34, 0x2e, 0x47, 0x74, 0xe7, 0xc6, 0x8c, - 0xc0, 0x9c, 0x70, 0xbf, 0xb1, 0x40, 0x93, 0x7f, 0x22, 0xc1, 0xb4, 0xcf, 0xcb, 0x47, 0xe0, 0xdb, - 0x09, 0xdf, 0xd4, 0x46, 0xf3, 0x0d, 0x93, 0xe6, 0x9e, 0x99, 0x13, 0xba, 0xca, 0x5e, 0x4b, 0xc8, - 0x2f, 0x3b, 0xde, 0xf8, 0xe6, 0xf8, 0xf8, 0xde, 0x1f, 0xb5, 0x1b, 0x19, 0xc3, 0xfa, 0x17, 0x85, - 0x90, 0xf9, 0xcc, 0x5d, 0xe8, 0x19, 0x94, 0x6d, 0xa2, 0x91, 0x0e, 0x35, 0x2c, 0x61, 0xfe, 0xfb, - 0x23, 0x9a, 0xaf, 0x1c, 0x12, 0xad, 0x25, 0x44, 0x1b, 0xb7, 0x99, 0xfd, 0xde, 0x17, 0xf6, 0x21, - 0xd1, 0xa7, 0x50, 0xa6, 0xa4, 0x6f, 0x6a, 0x0a, 0xf5, 0xd6, 0xc5, 0x9b, 0xe1, 0x2e, 0xb0, 0x64, - 0xc2, 0xc0, 0x9a, 0x46, 0xb7, 0x2d, 0xd8, 0xf8, 0x90, 0xfa, 0x2e, 0xf1, 0x5a, 0xb1, 0x0f, 0x83, - 0x4e, 0x61, 0xc6, 0x31, 0xbb, 0x8c, 0x93, 0xb2, 0x50, 0xda, 0x1b, 0x88, 0x21, 0xfe, 0x70, 0x54, - 0xdf, 0xec, 0x47, 0xa4, 0x1b, 0x8b, 0x42, 0xd7, 0x4c, 0xb4, 0x1d, 0xc7, 0xb4, 0xa0, 0x75, 0x98, - 0xed, 0xab, 0x3a, 0x26, 0x4a, 0x77, 0xd0, 0x22, 0x1d, 0x43, 0xef, 0xda, 0x95, 0xc2, 0xaa, 0x74, - 0xbf, 0xd8, 0x58, 0x12, 0x00, 0xb3, 0x3b, 0x51, 0x32, 0x8e, 0xf3, 0xa3, 0x6f, 0x02, 0xf2, 0xba, - 0xf1, 0xc4, 0xcd, 0x04, 0xaa, 0xa1, 0x57, 0x8a, 0xab, 0xd2, 0xfd, 0x7c, 0x63, 0x59, 0xa0, 0xa0, - 0x76, 0x82, 0x03, 0xa7, 0x48, 0xa1, 0x6d, 0xb8, 0x63, 0x91, 0x53, 0x95, 0xf5, 0xf1, 0xa9, 0x6a, - 0x53, 0xc3, 0x1a, 0x6c, 0xab, 0x7d, 0x95, 0x56, 0x26, 0xb8, 0x4d, 0x95, 0x8b, 0xf3, 0xea, 0x1d, - 0x9c, 0x42, 0xc7, 0xa9, 0x52, 0xf2, 0x8f, 0x8b, 0x30, 0x1b, 0x5b, 0x03, 0xe8, 0x00, 0x16, 0x3b, - 0x6e, 0xc0, 0xdc, 0x75, 0xfa, 0x87, 0xc4, 0x6a, 0x75, 0x8e, 0x49, 0xd7, 0xd1, 0x48, 0x97, 0x4f, - 0x94, 0x62, 0x63, 0x45, 0x58, 0xbc, 0xb8, 0x91, 0xca, 0x85, 0x33, 0xa4, 0x99, 0x17, 0x74, 0xde, - 0xb4, 0xa3, 0xda, 0xb6, 0x8f, 0x99, 0xe3, 0x98, 0xbe, 0x17, 0x76, 0x13, 0x1c, 0x38, 0x45, 0x8a, - 0xd9, 0xd8, 0x25, 0xb6, 0x6a, 0x91, 0x6e, 0xdc, 0xc6, 0x7c, 0xd4, 0xc6, 0xcd, 0x54, 0x2e, 0x9c, - 0x21, 0x8d, 0x1e, 0xc2, 0x94, 0xab, 0x8d, 0x8f, 0x9f, 0x18, 0x68, 0x3f, 0x44, 0xef, 0x06, 0x24, - 0x1c, 0xe6, 0x63, 0x5d, 0x33, 0x0e, 0x6d, 0x62, 0x9d, 0x92, 0x6e, 0xf6, 0x00, 0xef, 0x25, 0x38, - 0x70, 0x8a, 0x14, 0xeb, 0x9a, 0x3b, 0x03, 0x13, 0x5d, 0x9b, 0x88, 0x76, 0x6d, 0x3f, 0x95, 0x0b, - 0x67, 0x48, 0xb3, 0x79, 0xec, 0x9a, 0xbc, 0x7e, 0xaa, 0xa8, 0x9a, 0x72, 0xa8, 0x91, 0x4a, 0x29, - 0x3a, 0x8f, 0x77, 0xa3, 0x64, 0x1c, 0xe7, 0x47, 0x4f, 0x60, 0xde, 0x6d, 0xda, 0xd7, 0x15, 0x1f, - 0xa4, 0xcc, 0x41, 0xbe, 0x22, 0x40, 0xe6, 0x77, 0xe3, 0x0c, 0x38, 0x29, 0x83, 0x3e, 0x86, 0x99, - 0x8e, 0xa1, 0x69, 0x7c, 0x3e, 0x6e, 0x18, 0x8e, 0x4e, 0x2b, 0x93, 0x1c, 0x05, 0xb1, 0xf5, 0xb8, - 0x11, 0xa1, 0xe0, 0x18, 0xa7, 0xfc, 0x2f, 0x12, 0x2c, 0x65, 0xac, 0x69, 0xf4, 0x0d, 0x28, 0xd0, - 0x81, 0xe9, 0x65, 0xeb, 0x5f, 0xf7, 0x12, 0x44, 0x7b, 0x60, 0x92, 0x97, 0xe7, 0xd5, 0xd7, 0x33, + // 3632 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0xcd, 0x6f, 0x24, 0xc7, + 0x75, 0xdf, 0x9e, 0x0f, 0xce, 0xf0, 0x71, 0xf9, 0x55, 0x5c, 0x91, 0x63, 0x4a, 0xcb, 0x59, 0xb7, + 0x80, 0xcd, 0x4a, 0x91, 0x66, 0xb4, 0x94, 0x56, 0x56, 0x24, 0xc4, 0x0e, 0x87, 0xdc, 0x0f, 0x3a, + 0xfc, 0x18, 0xd5, 0x0c, 0x69, 0x67, 0x91, 0x75, 0xd4, 0x9c, 0x29, 0x0e, 0x7b, 0xd9, 0xd3, 0xdd, + 0xee, 0xae, 0xa6, 0x39, 0x97, 0x20, 0x87, 0xc0, 0x40, 0x80, 0x04, 0x49, 0x0e, 0x0e, 0x94, 0x5b, + 0x7c, 0xc9, 0x29, 0x41, 0x7c, 0x4b, 0x0e, 0x86, 0x81, 0x00, 0x0e, 0xb0, 0x08, 0x9c, 0xc0, 0xa7, + 0xc4, 0x27, 0x22, 0xa2, 0x8e, 0xf9, 0x07, 0x82, 0x3d, 0x04, 0x41, 0x55, 0x57, 0x7f, 0x77, 0x73, + 0x66, 0xa8, 0x25, 0x11, 0xf8, 0x36, 0x5d, 0xef, 0xbd, 0xdf, 0x7b, 0xf5, 0xaa, 0xea, 0xbd, 0x57, + 0x1f, 0x03, 0x8f, 0x8e, 0x3f, 0xb2, 0x6b, 0xaa, 0x51, 0x3f, 0x76, 0x0e, 0x88, 0xa5, 0x13, 0x4a, + 0xec, 0xfa, 0x09, 0xd1, 0xbb, 0x86, 0x55, 0x17, 0x04, 0xc5, 0x54, 0xeb, 0xe4, 0x94, 0x12, 0xdd, + 0x56, 0x0d, 0xdd, 0xae, 0x9f, 0xdc, 0x3f, 0x20, 0x54, 0xb9, 0x5f, 0xef, 0x11, 0x9d, 0x58, 0x0a, + 0x25, 0xdd, 0x9a, 0x69, 0x19, 0xd4, 0x40, 0xb7, 0x5d, 0xf6, 0x9a, 0x62, 0xaa, 0xb5, 0x80, 0xbd, + 0x26, 0xd8, 0x97, 0xdf, 0xed, 0xa9, 0xf4, 0xc8, 0x39, 0xa8, 0x75, 0x8c, 0x7e, 0xbd, 0x67, 0xf4, + 0x8c, 0x3a, 0x97, 0x3a, 0x70, 0x0e, 0xf9, 0x17, 0xff, 0xe0, 0xbf, 0x5c, 0xb4, 0x65, 0x39, 0xa4, + 0xbc, 0x63, 0x58, 0xa4, 0x7e, 0x92, 0xd0, 0xb8, 0xfc, 0x56, 0x88, 0xc7, 0x34, 0x34, 0xb5, 0x33, + 0xc8, 0x32, 0x6e, 0xf9, 0x83, 0x80, 0xb5, 0xaf, 0x74, 0x8e, 0x54, 0x9d, 0x58, 0x83, 0xba, 0x79, + 0xdc, 0xe3, 0xb2, 0x16, 0xb1, 0x0d, 0xc7, 0xea, 0x90, 0xb1, 0xa4, 0xec, 0x7a, 0x9f, 0x50, 0x25, + 0xcd, 0xac, 0x7a, 0x96, 0x94, 0xe5, 0xe8, 0x54, 0xed, 0x27, 0xd5, 0x7c, 0x38, 0x4c, 0xc0, 0xee, + 0x1c, 0x91, 0xbe, 0x92, 0x90, 0x7b, 0x3f, 0x4b, 0xce, 0xa1, 0xaa, 0x56, 0x57, 0x75, 0x6a, 0x53, + 0x2b, 0x2e, 0x24, 0xd7, 0x00, 0xd6, 0x9a, 0x9b, 0xfb, 0xc4, 0x62, 0xc3, 0x83, 0xee, 0x40, 0x41, + 0x57, 0xfa, 0xa4, 0x22, 0xdd, 0x91, 0xee, 0x4d, 0x36, 0x6e, 0xbe, 0x38, 0xab, 0xde, 0x38, 0x3f, + 0xab, 0x16, 0x76, 0x94, 0x3e, 0xc1, 0x9c, 0x22, 0x3f, 0x84, 0xd9, 0x35, 0x4d, 0x33, 0x7e, 0x40, + 0xba, 0x4f, 0x0c, 0x9b, 0x36, 0x15, 0x7a, 0x84, 0x56, 0x01, 0x4c, 0x85, 0x1e, 0x35, 0x2d, 0x72, + 0xa8, 0x9e, 0x0a, 0x51, 0x24, 0x44, 0xa1, 0xe9, 0x53, 0x70, 0x88, 0x4b, 0xfe, 0x6b, 0x09, 0xbe, + 0xb6, 0xee, 0xd8, 0xd4, 0xe8, 0x6f, 0x13, 0x6a, 0xa9, 0x9d, 0x75, 0xc7, 0xb2, 0x88, 0x4e, 0x5b, + 0x54, 0xa1, 0x8e, 0x3d, 0xdc, 0x0c, 0xf4, 0x14, 0x8a, 0x27, 0x8a, 0xe6, 0x90, 0x4a, 0xee, 0x8e, + 0x74, 0x6f, 0x6a, 0xb5, 0x56, 0x0b, 0x66, 0x9b, 0xdf, 0xf7, 0x9a, 0x79, 0xdc, 0xe3, 0xd3, 0xcf, + 0x1b, 0xd0, 0xda, 0xa7, 0x8e, 0xa2, 0x53, 0x95, 0x0e, 0x1a, 0xb7, 0x04, 0xe4, 0x4d, 0xa1, 0x77, + 0x9f, 0x61, 0x61, 0x17, 0x52, 0xfe, 0x43, 0xb8, 0x9d, 0x69, 0xda, 0x96, 0x6a, 0x53, 0xf4, 0x0c, + 0x8a, 0x2a, 0x25, 0x7d, 0xbb, 0x22, 0xdd, 0xc9, 0xdf, 0x9b, 0x5a, 0xfd, 0xa8, 0x76, 0xe1, 0x54, + 0xaf, 0x65, 0x82, 0x35, 0xa6, 0x85, 0x19, 0xc5, 0x4d, 0x06, 0x87, 0x5d, 0x54, 0xf9, 0x2f, 0x25, + 0x40, 0x61, 0x99, 0xb6, 0x62, 0xf5, 0x08, 0x1d, 0xc1, 0x29, 0xbf, 0xf7, 0xd5, 0x9c, 0xb2, 0x20, + 0x20, 0xa7, 0x5c, 0x85, 0x11, 0x9f, 0x98, 0xb0, 0x98, 0x34, 0x89, 0x3b, 0x63, 0x3f, 0xea, 0x8c, + 0xfb, 0x63, 0x38, 0xc3, 0x45, 0xc9, 0xf0, 0xc2, 0x8f, 0x72, 0x30, 0xb9, 0xa1, 0x90, 0xbe, 0xa1, + 0xb7, 0x08, 0x45, 0x9f, 0x41, 0x99, 0xad, 0xaf, 0xae, 0x42, 0x15, 0xee, 0x80, 0xa9, 0xd5, 0xf7, + 0x2e, 0xea, 0x9d, 0x5d, 0x63, 0xdc, 0xb5, 0x93, 0xfb, 0xb5, 0xdd, 0x83, 0xe7, 0xa4, 0x43, 0xb7, + 0x09, 0x55, 0x82, 0x39, 0x19, 0xb4, 0x61, 0x1f, 0x15, 0xed, 0x40, 0xc1, 0x36, 0x49, 0x47, 0xf8, + 0xee, 0x9d, 0x21, 0xdd, 0xf0, 0x2d, 0x6b, 0x99, 0xa4, 0x13, 0x0c, 0x06, 0xfb, 0xc2, 0x1c, 0x07, + 0xed, 0xc3, 0x84, 0xcd, 0x47, 0xb9, 0x92, 0x4f, 0x8c, 0xc6, 0xc5, 0x88, 0xee, 0xdc, 0x98, 0x11, + 0x98, 0x13, 0xee, 0x37, 0x16, 0x68, 0xf2, 0x4f, 0x25, 0x98, 0xf6, 0x79, 0xf9, 0x08, 0xfc, 0x7e, + 0xc2, 0x37, 0xb5, 0xd1, 0x7c, 0xc3, 0xa4, 0xb9, 0x67, 0xe6, 0x84, 0xae, 0xb2, 0xd7, 0x12, 0xf2, + 0xcb, 0xb6, 0x37, 0xbe, 0x39, 0x3e, 0xbe, 0xf7, 0x46, 0xed, 0x46, 0xc6, 0xb0, 0xfe, 0x55, 0x21, + 0x64, 0x3e, 0x73, 0x17, 0x7a, 0x06, 0x65, 0x9b, 0x68, 0xa4, 0x43, 0x0d, 0x4b, 0x98, 0xff, 0xfe, + 0x88, 0xe6, 0x2b, 0x07, 0x44, 0x6b, 0x09, 0xd1, 0xc6, 0x4d, 0x66, 0xbf, 0xf7, 0x85, 0x7d, 0x48, + 0xf4, 0x29, 0x94, 0x29, 0xe9, 0x9b, 0x9a, 0x42, 0xbd, 0x75, 0xf1, 0x66, 0xb8, 0x0b, 0x2c, 0x99, + 0x30, 0xb0, 0xa6, 0xd1, 0x6d, 0x0b, 0x36, 0x3e, 0xa4, 0xbe, 0x4b, 0xbc, 0x56, 0xec, 0xc3, 0xa0, + 0x13, 0x98, 0x71, 0xcc, 0x2e, 0xe3, 0xa4, 0x2c, 0x94, 0xf6, 0x06, 0x62, 0x88, 0x3f, 0x1c, 0xd5, + 0x37, 0x7b, 0x11, 0xe9, 0xc6, 0xa2, 0xd0, 0x35, 0x13, 0x6d, 0xc7, 0x31, 0x2d, 0x68, 0x0d, 0x66, + 0xfb, 0xaa, 0x8e, 0x89, 0xd2, 0x1d, 0xb4, 0x48, 0xc7, 0xd0, 0xbb, 0x76, 0xa5, 0x70, 0x47, 0xba, + 0x57, 0x6c, 0x2c, 0x09, 0x80, 0xd9, 0xed, 0x28, 0x19, 0xc7, 0xf9, 0xd1, 0xb7, 0x01, 0x79, 0xdd, + 0x78, 0xec, 0x66, 0x02, 0xd5, 0xd0, 0x2b, 0xc5, 0x3b, 0xd2, 0xbd, 0x7c, 0x63, 0x59, 0xa0, 0xa0, + 0x76, 0x82, 0x03, 0xa7, 0x48, 0xa1, 0x2d, 0xb8, 0x65, 0x91, 0x13, 0x95, 0xf5, 0xf1, 0x89, 0x6a, + 0x53, 0xc3, 0x1a, 0x6c, 0xa9, 0x7d, 0x95, 0x56, 0x26, 0xb8, 0x4d, 0x95, 0xf3, 0xb3, 0xea, 0x2d, + 0x9c, 0x42, 0xc7, 0xa9, 0x52, 0xf2, 0x4f, 0x8a, 0x30, 0x1b, 0x5b, 0x03, 0x68, 0x1f, 0x16, 0x3b, + 0x6e, 0xc0, 0xdc, 0x71, 0xfa, 0x07, 0xc4, 0x6a, 0x75, 0x8e, 0x48, 0xd7, 0xd1, 0x48, 0x97, 0x4f, + 0x94, 0x62, 0x63, 0x45, 0x58, 0xbc, 0xb8, 0x9e, 0xca, 0x85, 0x33, 0xa4, 0x99, 0x17, 0x74, 0xde, + 0xb4, 0xad, 0xda, 0xb6, 0x8f, 0x99, 0xe3, 0x98, 0xbe, 0x17, 0x76, 0x12, 0x1c, 0x38, 0x45, 0x8a, + 0xd9, 0xd8, 0x25, 0xb6, 0x6a, 0x91, 0x6e, 0xdc, 0xc6, 0x7c, 0xd4, 0xc6, 0x8d, 0x54, 0x2e, 0x9c, + 0x21, 0x8d, 0x1e, 0xc0, 0x94, 0xab, 0x8d, 0x8f, 0x9f, 0x18, 0x68, 0x3f, 0x44, 0xef, 0x04, 0x24, + 0x1c, 0xe6, 0x63, 0x5d, 0x33, 0x0e, 0x6c, 0x62, 0x9d, 0x90, 0x6e, 0xf6, 0x00, 0xef, 0x26, 0x38, + 0x70, 0x8a, 0x14, 0xeb, 0x9a, 0x3b, 0x03, 0x13, 0x5d, 0x9b, 0x88, 0x76, 0x6d, 0x2f, 0x95, 0x0b, + 0x67, 0x48, 0xb3, 0x79, 0xec, 0x9a, 0xbc, 0x76, 0xa2, 0xa8, 0x9a, 0x72, 0xa0, 0x91, 0x4a, 0x29, + 0x3a, 0x8f, 0x77, 0xa2, 0x64, 0x1c, 0xe7, 0x47, 0x8f, 0x61, 0xde, 0x6d, 0xda, 0xd3, 0x15, 0x1f, + 0xa4, 0xcc, 0x41, 0xbe, 0x26, 0x40, 0xe6, 0x77, 0xe2, 0x0c, 0x38, 0x29, 0x83, 0x3e, 0x86, 0x99, + 0x8e, 0xa1, 0x69, 0x7c, 0x3e, 0xae, 0x1b, 0x8e, 0x4e, 0x2b, 0x93, 0x1c, 0x05, 0xb1, 0xf5, 0xb8, + 0x1e, 0xa1, 0xe0, 0x18, 0xa7, 0xfc, 0xaf, 0x12, 0x2c, 0x65, 0xac, 0x69, 0xf4, 0x2d, 0x28, 0xd0, + 0x81, 0xe9, 0x65, 0xeb, 0xdf, 0xf4, 0x12, 0x44, 0x7b, 0x60, 0x92, 0x97, 0x67, 0xd5, 0xd7, 0x33, 0xc4, 0x18, 0x19, 0x73, 0x41, 0xa4, 0xc3, 0xb4, 0xc5, 0xd4, 0xe9, 0x3d, 0x97, 0x45, 0x04, 0xaf, - 0x87, 0x43, 0x62, 0x0c, 0x0e, 0xcb, 0x04, 0xc1, 0x78, 0xfe, 0xe2, 0xbc, 0x3a, 0x1d, 0xa1, 0xe1, - 0x28, 0xbc, 0xfc, 0xc3, 0x1c, 0xc0, 0x26, 0x31, 0x35, 0x63, 0xd0, 0x27, 0xfa, 0x4d, 0x24, 0xdc, - 0xbd, 0x48, 0xc2, 0x7d, 0x77, 0x58, 0xec, 0xf4, 0x4d, 0xcb, 0xcc, 0xb8, 0xdf, 0x8a, 0x65, 0xdc, - 0xfa, 0xe8, 0x90, 0x97, 0xa7, 0xdc, 0xff, 0xc8, 0xc3, 0x42, 0xc0, 0xbc, 0x61, 0xe8, 0x5d, 0x95, - 0xaf, 0x8f, 0x4f, 0x22, 0x63, 0xfc, 0x6b, 0xb1, 0x31, 0x5e, 0x4a, 0x11, 0x09, 0x8d, 0xef, 0xb6, - 0x6f, 0x6d, 0x8e, 0x8b, 0x7f, 0x10, 0x55, 0xfe, 0xf2, 0xbc, 0x9a, 0xb2, 0xe7, 0xa9, 0xf9, 0x48, - 0x51, 0x13, 0xd1, 0x3d, 0x98, 0xb0, 0x88, 0x62, 0x1b, 0x3a, 0x0f, 0x14, 0x93, 0x41, 0x57, 0x30, - 0x6f, 0xc5, 0x82, 0x8a, 0xde, 0x82, 0x52, 0x9f, 0xd8, 0xb6, 0xd2, 0x23, 0x3c, 0x26, 0x4c, 0x36, - 0x66, 0x05, 0x63, 0x69, 0xc7, 0x6d, 0xc6, 0x1e, 0x1d, 0x3d, 0x87, 0x19, 0x4d, 0xb1, 0xc5, 0x04, - 0x6d, 0xab, 0x7d, 0xc2, 0x57, 0xfd, 0xd4, 0xda, 0xdb, 0xa3, 0xcd, 0x03, 0x26, 0x11, 0x64, 0xb6, - 0xed, 0x08, 0x12, 0x8e, 0x21, 0xa3, 0x53, 0x40, 0xac, 0xa5, 0x6d, 0x29, 0xba, 0xed, 0x3a, 0x8a, - 0xe9, 0x2b, 0x8d, 0xad, 0xcf, 0x8f, 0x70, 0xdb, 0x09, 0x34, 0x9c, 0xa2, 0x41, 0xfe, 0xa9, 0x04, - 0x33, 0xc1, 0x30, 0xdd, 0x40, 0x35, 0xb5, 0x1b, 0xad, 0xa6, 0xde, 0x1a, 0x79, 0x8a, 0x66, 0x94, - 0x53, 0xff, 0x9d, 0x03, 0x14, 0x30, 0xb1, 0x05, 0x7e, 0xa8, 0x74, 0x4e, 0x46, 0xd8, 0x2b, 0xfc, - 0x40, 0x02, 0x24, 0xc2, 0xf3, 0xba, 0xae, 0x1b, 0x94, 0x47, 0x7c, 0xcf, 0xac, 0xad, 0x91, 0xcd, - 0xf2, 0x34, 0xd6, 0xf6, 0x13, 0x58, 0x8f, 0x74, 0x6a, 0x0d, 0x82, 0x11, 0x49, 0x32, 0xe0, 0x14, - 0x03, 0x90, 0x02, 0x60, 0x09, 0xcc, 0xb6, 0x21, 0x16, 0xf2, 0xbb, 0x23, 0xc4, 0x3c, 0x26, 0xb0, - 0x61, 0xe8, 0x47, 0x6a, 0x2f, 0x08, 0x3b, 0xd8, 0x07, 0xc2, 0x21, 0xd0, 0xe5, 0x47, 0xb0, 0x94, - 0x61, 0x2d, 0x9a, 0x83, 0xfc, 0x09, 0x19, 0xb8, 0x6e, 0xc3, 0xec, 0x27, 0xba, 0x13, 0xde, 0x53, - 0x4d, 0x8a, 0xed, 0xd0, 0xc7, 0xb9, 0x8f, 0x24, 0xf9, 0x27, 0xc5, 0xf0, 0xdc, 0xe1, 0xa5, 0xec, - 0x7d, 0x28, 0x5b, 0xc4, 0xd4, 0xd4, 0x8e, 0x62, 0x8b, 0x0a, 0x85, 0x57, 0xa5, 0x58, 0xb4, 0x61, - 0x9f, 0x1a, 0x29, 0x7a, 0x73, 0xd7, 0x5b, 0xf4, 0xe6, 0x5f, 0x4d, 0xd1, 0xfb, 0x7b, 0x50, 0xb6, - 0xbd, 0x72, 0xb7, 0xc0, 0x21, 0x1f, 0x8c, 0x11, 0x5f, 0x45, 0xa5, 0xeb, 0x2b, 0xf0, 0x6b, 0x5c, - 0x1f, 0x34, 0xad, 0xba, 0x2d, 0x8e, 0x59, 0xdd, 0xbe, 0xd2, 0x8a, 0x94, 0xc5, 0x54, 0x53, 0x71, - 0x6c, 0xd2, 0xe5, 0x81, 0xa8, 0x1c, 0xc4, 0xd4, 0x26, 0x6f, 0xc5, 0x82, 0x8a, 0x9e, 0x45, 0xa6, - 0x6c, 0xf9, 0x2a, 0x53, 0x76, 0x26, 0x7b, 0xba, 0xa2, 0x7d, 0x58, 0x32, 0x2d, 0xa3, 0x67, 0x11, - 0xdb, 0xde, 0x24, 0x4a, 0x57, 0x53, 0x75, 0xe2, 0xf9, 0xc7, 0x2d, 0x55, 0x5e, 0xbf, 0x38, 0xaf, - 0x2e, 0x35, 0xd3, 0x59, 0x70, 0x96, 0xac, 0xfc, 0xa2, 0x00, 0x73, 0xf1, 0x0c, 0x98, 0x51, 0x3d, - 0x4a, 0x57, 0xaa, 0x1e, 0xdf, 0x09, 0x2d, 0x06, 0xb7, 0xb4, 0xf6, 0x47, 0x3f, 0x65, 0x41, 0xac, - 0xc3, 0xac, 0x88, 0x06, 0x1e, 0x51, 0xd4, 0xcf, 0xfe, 0xe8, 0xef, 0x47, 0xc9, 0x38, 0xce, 0xcf, - 0x6a, 0xc2, 0xa0, 0xd4, 0xf3, 0x40, 0x0a, 0xd1, 0x9a, 0x70, 0x3d, 0xce, 0x80, 0x93, 0x32, 0x68, - 0x07, 0x16, 0x1c, 0x3d, 0x09, 0xe5, 0xce, 0xc6, 0xd7, 0x05, 0xd4, 0xc2, 0x7e, 0x92, 0x05, 0xa7, - 0xc9, 0xa1, 0x23, 0x80, 0x8e, 0x97, 0xb6, 0xed, 0xca, 0x04, 0x8f, 0xb0, 0x6b, 0x23, 0xaf, 0x1d, - 0x3f, 0xe3, 0x07, 0x71, 0xcd, 0x6f, 0xb2, 0x71, 0x08, 0x19, 0x7d, 0x02, 0xd3, 0x16, 0xdf, 0x10, - 0x78, 0x06, 0xbb, 0x45, 0xf5, 0x6b, 0x42, 0x6c, 0x1a, 0x87, 0x89, 0x38, 0xca, 0x9b, 0x52, 0x07, - 0x97, 0x47, 0xae, 0x83, 0xff, 0x49, 0x0a, 0x27, 0x21, 0xbf, 0x04, 0xfe, 0x38, 0x52, 0x1e, 0xdd, - 0x8b, 0x95, 0x47, 0x8b, 0x49, 0x89, 0x50, 0x75, 0x64, 0xa4, 0x57, 0xbf, 0x1f, 0x8e, 0x55, 0xfd, - 0x06, 0xc9, 0x73, 0x78, 0xf9, 0xfb, 0x23, 0x09, 0x16, 0x1f, 0xb7, 0x9e, 0x58, 0x86, 0x63, 0x7a, - 0xe6, 0xec, 0x99, 0xae, 0x5f, 0xbf, 0x06, 0x05, 0xcb, 0xd1, 0xbc, 0x7e, 0xbc, 0xe9, 0xf5, 0x03, - 0x3b, 0x1a, 0xeb, 0xc7, 0x42, 0x4c, 0xca, 0xed, 0x04, 0x13, 0x40, 0xbb, 0x30, 0x61, 0x29, 0x7a, - 0x8f, 0x78, 0x69, 0xf5, 0xde, 0x10, 0xeb, 0xb7, 0x36, 0x31, 0x63, 0x0f, 0x15, 0x6f, 0x5c, 0x1a, - 0x0b, 0x14, 0xf9, 0x4f, 0x24, 0x98, 0x7d, 0xda, 0x6e, 0x37, 0xb7, 0x74, 0xbe, 0xa2, 0xf9, 0xe1, - 0xeb, 0x2a, 0x14, 0x4c, 0x85, 0x1e, 0xc7, 0x33, 0x3d, 0xa3, 0x61, 0x4e, 0x41, 0xbf, 0x03, 0x25, - 0x16, 0x49, 0x88, 0xde, 0x1d, 0xb1, 0xd4, 0x16, 0xf0, 0x0d, 0x57, 0x28, 0xa8, 0x10, 0x45, 0x03, - 0xf6, 0xe0, 0xe4, 0x13, 0xb8, 0x13, 0x32, 0x87, 0xf9, 0x83, 0x9f, 0x19, 0xa2, 0x16, 0x14, 0x99, - 0x66, 0xef, 0x48, 0x70, 0xd8, 0xc9, 0x57, 0xac, 0x4b, 0x41, 0xa5, 0xc3, 0xbe, 0x6c, 0xec, 0x62, - 0xc9, 0x3b, 0x30, 0xcd, 0x4f, 0x9c, 0x0d, 0x8b, 0x72, 0xb7, 0xa0, 0xbb, 0x90, 0xef, 0xab, 0xba, - 0xc8, 0xb3, 0x53, 0x42, 0x26, 0xcf, 0x72, 0x04, 0x6b, 0xe7, 0x64, 0xe5, 0x4c, 0x44, 0x9e, 0x80, - 0xac, 0x9c, 0x61, 0xd6, 0x2e, 0x3f, 0x81, 0x92, 0x70, 0x77, 0x18, 0x28, 0x7f, 0x39, 0x50, 0x3e, - 0x05, 0x68, 0x0f, 0x4a, 0x5b, 0xcd, 0x86, 0x66, 0xb8, 0x55, 0x57, 0x47, 0xed, 0x5a, 0xf1, 0xb1, - 0xd8, 0xd8, 0xda, 0xc4, 0x98, 0x53, 0x90, 0x0c, 0x13, 0xe4, 0xac, 0x43, 0x4c, 0xca, 0x67, 0xc4, - 0x64, 0x03, 0xd8, 0x28, 0x3f, 0xe2, 0x2d, 0x58, 0x50, 0xe4, 0x3f, 0xcd, 0x41, 0x49, 0xb8, 0xe3, - 0x06, 0x76, 0x61, 0xdb, 0x91, 0x5d, 0xd8, 0xdb, 0xa3, 0x4d, 0x8d, 0xcc, 0x2d, 0x58, 0x3b, 0xb6, - 0x05, 0x7b, 0x67, 0x44, 0xbc, 0xcb, 0xf7, 0x5f, 0x3f, 0x96, 0x60, 0x26, 0x3a, 0x29, 0xd1, 0x43, - 0x98, 0x62, 0x09, 0x47, 0xed, 0x90, 0xdd, 0xa0, 0xce, 0xf5, 0x4f, 0x47, 0x5a, 0x01, 0x09, 0x87, - 0xf9, 0x50, 0xcf, 0x17, 0x63, 0xf3, 0x48, 0x74, 0x3a, 0xdb, 0xa5, 0x0e, 0x55, 0xb5, 0x9a, 0x7b, - 0x71, 0x52, 0xdb, 0xd2, 0xe9, 0x9e, 0xd5, 0xa2, 0x96, 0xaa, 0xf7, 0x12, 0x8a, 0xf8, 0xa4, 0x0c, - 0x23, 0xcb, 0xff, 0x28, 0xc1, 0x94, 0x30, 0xf9, 0x06, 0x76, 0x15, 0xbf, 0x1d, 0xdd, 0x55, 0xdc, - 0x1b, 0x71, 0x81, 0xa7, 0x6f, 0x29, 0xfe, 0x26, 0x30, 0x9d, 0x2d, 0x69, 0x36, 0xab, 0x8f, 0x0d, - 0x9b, 0xc6, 0x67, 0x35, 0x5b, 0x8c, 0x98, 0x53, 0x90, 0x03, 0x73, 0x6a, 0x2c, 0x06, 0x08, 0xd7, - 0xd6, 0x47, 0xb3, 0xc4, 0x17, 0x6b, 0x54, 0x04, 0xfc, 0x5c, 0x9c, 0x82, 0x13, 0x2a, 0x64, 0x02, - 0x09, 0x2e, 0xf4, 0x29, 0x14, 0x8e, 0x29, 0x35, 0x53, 0x0e, 0x92, 0x87, 0x44, 0x9e, 0xc0, 0x84, - 0x32, 0xef, 0x5d, 0xbb, 0xdd, 0xc4, 0x1c, 0x4a, 0xfe, 0x9f, 0xc0, 0x1f, 0x2d, 0x77, 0x8e, 0xfb, - 0xf1, 0x54, 0xba, 0x4a, 0x3c, 0x9d, 0x4a, 0x8b, 0xa5, 0xe8, 0x29, 0xe4, 0xa9, 0x36, 0xea, 0xb6, - 0x50, 0x20, 0xb6, 0xb7, 0x5b, 0x41, 0x40, 0x6a, 0x6f, 0xb7, 0x30, 0x83, 0x40, 0x7b, 0x50, 0x64, - 0xd9, 0x87, 0x2d, 0xc1, 0xfc, 0xe8, 0x4b, 0x9a, 0xf5, 0x3f, 0x98, 0x10, 0xec, 0xcb, 0xc6, 0x2e, - 0x8e, 0xfc, 0x5d, 0x98, 0x8e, 0xac, 0x53, 0xf4, 0x39, 0xdc, 0xd6, 0x0c, 0xa5, 0xdb, 0x50, 0x34, - 0x45, 0xef, 0x10, 0xef, 0xd4, 0xfe, 0x5e, 0xda, 0x0e, 0x63, 0x3b, 0xc4, 0x27, 0x56, 0xb9, 0x7f, - 0xf7, 0x16, 0xa6, 0xe1, 0x08, 0xa2, 0xac, 0x00, 0x04, 0x7d, 0x44, 0x55, 0x28, 0xb2, 0x79, 0xe6, - 0xe6, 0x93, 0xc9, 0xc6, 0x24, 0xb3, 0x90, 0x4d, 0x3f, 0x1b, 0xbb, 0xed, 0x68, 0x0d, 0xc0, 0x26, - 0x1d, 0x8b, 0x50, 0x1e, 0x0c, 0x72, 0xd1, 0x1b, 0xc8, 0x96, 0x4f, 0xc1, 0x21, 0x2e, 0xf9, 0x9f, - 0x25, 0x98, 0xde, 0x25, 0xf4, 0x7b, 0x86, 0x75, 0xd2, 0xe4, 0x97, 0xc5, 0x37, 0x10, 0x6c, 0x71, - 0x24, 0xd8, 0xbe, 0x37, 0x64, 0x64, 0x22, 0xd6, 0x65, 0x85, 0x5c, 0xf9, 0xa7, 0x12, 0x2c, 0x45, - 0x38, 0x1f, 0x05, 0x4b, 0x77, 0x1f, 0x8a, 0xa6, 0x61, 0x51, 0x2f, 0x11, 0x8f, 0xa5, 0x90, 0x85, - 0xb1, 0x50, 0x2a, 0x66, 0x30, 0xd8, 0x45, 0x43, 0xdb, 0x90, 0xa3, 0x86, 0x98, 0xaa, 0xe3, 0x61, - 0x12, 0x62, 0x35, 0x40, 0x60, 0xe6, 0xda, 0x06, 0xce, 0x51, 0x83, 0x0d, 0x44, 0x25, 0xc2, 0x15, - 0x0e, 0x3e, 0xd7, 0xd4, 0x03, 0x0c, 0x85, 0x23, 0xcb, 0xe8, 0x5f, 0xb9, 0x0f, 0xfe, 0x40, 0x3c, - 0xb6, 0x8c, 0x3e, 0xe6, 0x58, 0xf2, 0xcf, 0x24, 0x98, 0x8f, 0x70, 0xde, 0x40, 0xe0, 0xff, 0x34, - 0x1a, 0xf8, 0xdf, 0x19, 0xa7, 0x23, 0x19, 0xe1, 0xff, 0x67, 0xb9, 0x58, 0x37, 0x58, 0x87, 0xd1, - 0x11, 0x4c, 0x99, 0x46, 0xb7, 0xf5, 0x0a, 0xee, 0xe9, 0x66, 0x59, 0xde, 0x6c, 0x06, 0x58, 0x38, - 0x0c, 0x8c, 0xce, 0x60, 0x5e, 0x57, 0xfa, 0xc4, 0x36, 0x95, 0x0e, 0x69, 0xbd, 0x82, 0x03, 0x92, - 0xd7, 0xf8, 0x45, 0x40, 0x1c, 0x11, 0x27, 0x95, 0xa0, 0x1d, 0x28, 0xa9, 0x26, 0xaf, 0xe3, 0x44, - 0xed, 0x32, 0x34, 0x8b, 0xba, 0x55, 0x9f, 0x1b, 0xcf, 0xc5, 0x07, 0xf6, 0x30, 0xe4, 0xbf, 0x8d, - 0xcf, 0x06, 0x36, 0xff, 0xd0, 0x13, 0x28, 0xf3, 0x67, 0x17, 0x1d, 0x43, 0xf3, 0x6e, 0x06, 0xd8, - 0xc8, 0x36, 0x45, 0xdb, 0xcb, 0xf3, 0xea, 0xeb, 0x29, 0x87, 0xbe, 0x1e, 0x19, 0xfb, 0xc2, 0x68, - 0x17, 0x0a, 0xe6, 0x97, 0xa9, 0x60, 0x78, 0x92, 0xe3, 0x65, 0x0b, 0xc7, 0x91, 0xff, 0x30, 0x1f, - 0x33, 0x97, 0xa7, 0xba, 0xe7, 0xaf, 0x6c, 0xd4, 0xfd, 0x8a, 0x29, 0x73, 0xe4, 0x0f, 0xa1, 0x24, - 0x32, 0xbc, 0x98, 0xcc, 0x5f, 0x1b, 0x67, 0x32, 0x87, 0xb3, 0x98, 0xbf, 0x61, 0xf1, 0x1a, 0x3d, - 0x60, 0xf4, 0x1d, 0x98, 0x20, 0xae, 0x0a, 0x37, 0x37, 0x7e, 0x38, 0x8e, 0x8a, 0x20, 0xae, 0x06, - 0x85, 0xaa, 0x68, 0x13, 0xa8, 0xe8, 0x1b, 0xcc, 0x5f, 0x8c, 0x97, 0x6d, 0x02, 0xed, 0x4a, 0x81, - 0xa7, 0xab, 0xbb, 0x6e, 0xb7, 0xfd, 0xe6, 0x97, 0xe7, 0x55, 0x08, 0x3e, 0x71, 0x58, 0x42, 0xfe, - 0x57, 0x09, 0xe6, 0xb9, 0x87, 0x3a, 0x8e, 0xa5, 0xd2, 0xc1, 0x8d, 0x25, 0xa6, 0x83, 0x48, 0x62, - 0xfa, 0x60, 0x88, 0x5b, 0x12, 0x16, 0x66, 0x26, 0xa7, 0x9f, 0x4b, 0xf0, 0x5a, 0x82, 0xfb, 0x06, - 0xe2, 0xe2, 0x7e, 0x34, 0x2e, 0xbe, 0x37, 0x6e, 0x87, 0x32, 0x62, 0xe3, 0x5f, 0xdd, 0x4e, 0xe9, - 0x0e, 0x5f, 0x29, 0x6b, 0x00, 0xa6, 0xa5, 0x9e, 0xaa, 0x1a, 0xe9, 0x89, 0xdb, 0xe9, 0x72, 0xe8, - 0x0d, 0x94, 0x4f, 0xc1, 0x21, 0x2e, 0x64, 0xc3, 0x62, 0x97, 0x1c, 0x29, 0x8e, 0x46, 0xd7, 0xbb, - 0xdd, 0x0d, 0xc5, 0x54, 0x0e, 0x55, 0x4d, 0xa5, 0xaa, 0x38, 0x2e, 0x98, 0x6c, 0x7c, 0xe2, 0xde, - 0x1a, 0xa7, 0x71, 0xbc, 0x3c, 0xaf, 0xde, 0x4d, 0xbb, 0x1d, 0xf2, 0x58, 0x06, 0x38, 0x03, 0x1a, - 0x0d, 0xa0, 0x62, 0x91, 0xef, 0x3a, 0xaa, 0x45, 0xba, 0x9b, 0x96, 0x61, 0x46, 0xd4, 0xe6, 0xb9, - 0xda, 0xdf, 0xbc, 0x38, 0xaf, 0x56, 0x70, 0x06, 0xcf, 0x70, 0xc5, 0x99, 0xf0, 0xe8, 0x39, 0x2c, - 0x28, 0xee, 0xd3, 0xb1, 0x88, 0x56, 0x77, 0x95, 0x7c, 0x74, 0x71, 0x5e, 0x5d, 0x58, 0x4f, 0x92, - 0x87, 0x2b, 0x4c, 0x03, 0x45, 0x75, 0x28, 0x9d, 0x1a, 0x9a, 0xd3, 0x27, 0x76, 0xa5, 0xc8, 0xf1, - 0x59, 0x22, 0x28, 0x1d, 0xb8, 0x4d, 0x2f, 0xcf, 0xab, 0x13, 0x8f, 0x5b, 0x7c, 0xf5, 0x79, 0x5c, - 0x6c, 0x43, 0xc9, 0x6a, 0x49, 0xb1, 0xe2, 0xf9, 0x89, 0x71, 0x39, 0x88, 0x5a, 0x4f, 0x03, 0x12, - 0x0e, 0xf3, 0xa1, 0x67, 0x30, 0x79, 0x2c, 0x4e, 0x25, 0xec, 0x4a, 0x69, 0xa4, 0x24, 0x1c, 0x39, - 0xc5, 0x68, 0xcc, 0x0b, 0x15, 0x93, 0x5e, 0xb3, 0x8d, 0x03, 0x44, 0xf4, 0x16, 0x94, 0xf8, 0xc7, - 0xd6, 0x26, 0x3f, 0x8e, 0x2b, 0x07, 0xb1, 0xed, 0xa9, 0xdb, 0x8c, 0x3d, 0xba, 0xc7, 0xba, 0xd5, - 0xdc, 0xe0, 0xc7, 0xc2, 0x31, 0xd6, 0xad, 0xe6, 0x06, 0xf6, 0xe8, 0xe8, 0x73, 0x28, 0xd9, 0x64, - 0x5b, 0xd5, 0x9d, 0xb3, 0x0a, 0x8c, 0x74, 0xa9, 0xdc, 0x7a, 0xc4, 0xb9, 0x63, 0x07, 0x63, 0x81, - 0x06, 0x41, 0xc7, 0x1e, 0x2c, 0x3a, 0x86, 0x49, 0xcb, 0xd1, 0xd7, 0xed, 0x7d, 0x9b, 0x58, 0x95, - 0x29, 0xae, 0x63, 0x58, 0x38, 0xc7, 0x1e, 0x7f, 0x5c, 0x8b, 0xef, 0x21, 0x9f, 0x03, 0x07, 0xe0, - 0xe8, 0x8f, 0x25, 0x40, 0xb6, 0x63, 0x9a, 0x1a, 0xe9, 0x13, 0x9d, 0x2a, 0x1a, 0x3f, 0x8b, 0xb3, - 0x2b, 0xb7, 0xb9, 0xce, 0xdf, 0x1a, 0xd6, 0xaf, 0x84, 0x60, 0x5c, 0xb9, 0x7f, 0xe8, 0x9d, 0x64, - 0xc5, 0x29, 0x7a, 0x99, 0x6b, 0x8f, 0x6c, 0xfe, 0xbb, 0x32, 0x3d, 0x92, 0x6b, 0xd3, 0xcf, 0x1c, - 0x03, 0xd7, 0x0a, 0x3a, 0xf6, 0x60, 0xd1, 0x01, 0x2c, 0x5a, 0x44, 0xe9, 0xee, 0xe9, 0xda, 0x00, - 0x1b, 0x06, 0x7d, 0xac, 0x6a, 0xc4, 0x1e, 0xd8, 0x94, 0xf4, 0x2b, 0x33, 0x7c, 0xd8, 0xfd, 0x47, - 0x19, 0x38, 0x95, 0x0b, 0x67, 0x48, 0xa3, 0x3e, 0x54, 0xbd, 0x90, 0xc1, 0xd6, 0x93, 0x1f, 0xb3, - 0x1e, 0xd9, 0x1d, 0x45, 0x73, 0xef, 0x01, 0x66, 0xb9, 0x82, 0x37, 0x2f, 0xce, 0xab, 0xd5, 0xcd, - 0xcb, 0x59, 0xf1, 0x30, 0x2c, 0xf4, 0x6d, 0xa8, 0x28, 0x59, 0x7a, 0xe6, 0xb8, 0x9e, 0x55, 0xd1, - 0x91, 0x4a, 0xa6, 0x92, 0x4c, 0x04, 0x44, 0x61, 0x4e, 0x89, 0xbe, 0x52, 0xb5, 0x2b, 0xf3, 0x23, - 0x1d, 0x46, 0xc6, 0x1e, 0xb7, 0x06, 0x07, 0x12, 0x31, 0x82, 0x8d, 0x13, 0x1a, 0xf8, 0x13, 0x0a, - 0x71, 0xa0, 0x7e, 0x33, 0x6f, 0x16, 0xc7, 0x7b, 0x42, 0x11, 0x98, 0xf6, 0xca, 0x9e, 0x50, 0x84, - 0x20, 0x2f, 0x3f, 0xc2, 0xfb, 0xaf, 0x1c, 0x2c, 0x04, 0xcc, 0x23, 0x3f, 0xa1, 0x48, 0x11, 0xb9, - 0xb6, 0x27, 0x14, 0xe9, 0x6f, 0x10, 0xf2, 0xd7, 0xfd, 0x06, 0xe1, 0x1a, 0x9e, 0x6e, 0xf0, 0x67, - 0x0d, 0x81, 0xeb, 0xfe, 0xef, 0x3d, 0x6b, 0x08, 0x6c, 0xcb, 0x28, 0xb4, 0xfe, 0x3e, 0x17, 0xee, - 0xc0, 0xff, 0xfb, 0xbb, 0xf5, 0x2f, 0xff, 0xb0, 0x53, 0xfe, 0x79, 0x1e, 0xe6, 0xe2, 0xab, 0x31, - 0x72, 0x05, 0x2b, 0x0d, 0xbd, 0x82, 0x6d, 0xc2, 0x9d, 0x23, 0x47, 0xd3, 0x06, 0xdc, 0x0d, 0xa1, - 0x7b, 0x58, 0xf7, 0x0a, 0xe5, 0x0d, 0x21, 0x79, 0xe7, 0x71, 0x0a, 0x0f, 0x4e, 0x95, 0xcc, 0xb8, - 0x4e, 0xce, 0x5f, 0xe9, 0x3a, 0x39, 0x71, 0xbb, 0x59, 0x18, 0xe3, 0x76, 0x33, 0xf5, 0x6a, 0xb8, - 0x78, 0x85, 0xab, 0xe1, 0xab, 0xdc, 0xe5, 0xa6, 0x04, 0xb1, 0x61, 0x77, 0xb9, 0xf2, 0x1b, 0xb0, - 0x2c, 0xc4, 0x28, 0xbf, 0x66, 0xd5, 0xa9, 0x65, 0x68, 0x1a, 0xb1, 0x36, 0x9d, 0x7e, 0x7f, 0x20, - 0x7f, 0x1d, 0x66, 0xa2, 0x0f, 0x08, 0xdc, 0x91, 0x76, 0xdf, 0x30, 0x88, 0x8b, 0xac, 0xd0, 0x48, - 0xbb, 0xed, 0xd8, 0xe7, 0x90, 0xbf, 0x2f, 0xc1, 0x62, 0xfa, 0x43, 0x41, 0xa4, 0xc1, 0x4c, 0x5f, - 0x39, 0x0b, 0xbf, 0xaa, 0x94, 0xae, 0x78, 0xc4, 0xc0, 0x6f, 0x8e, 0x77, 0x22, 0x58, 0x38, 0x86, - 0x2d, 0xff, 0x4a, 0x82, 0xa5, 0x8c, 0x3b, 0xdb, 0x9b, 0xb5, 0x04, 0x7d, 0x06, 0xe5, 0xbe, 0x72, - 0xd6, 0x72, 0xac, 0x1e, 0xb9, 0xf2, 0xa1, 0x0a, 0x8f, 0x18, 0x3b, 0x02, 0x05, 0xfb, 0x78, 0xf2, - 0x8f, 0x24, 0xa8, 0x64, 0x95, 0xb7, 0xe8, 0x61, 0xe4, 0x76, 0xf9, 0xab, 0xb1, 0xdb, 0xe5, 0xf9, - 0x84, 0xdc, 0x35, 0xdd, 0x2d, 0xff, 0x9d, 0x04, 0x8b, 0xe9, 0x65, 0x3e, 0x7a, 0x3f, 0x62, 0x61, - 0x35, 0x66, 0xe1, 0x6c, 0x4c, 0x4a, 0xd8, 0xf7, 0x1d, 0x98, 0x11, 0x9b, 0x01, 0x01, 0x23, 0xbc, - 0x2a, 0xa7, 0xc5, 0x4a, 0x01, 0xe1, 0x15, 0xbf, 0x7c, 0xbc, 0xa2, 0x6d, 0x38, 0x86, 0x26, 0xff, - 0x51, 0x0e, 0x8a, 0xad, 0x8e, 0xa2, 0x91, 0x1b, 0x28, 0xb3, 0xbe, 0x19, 0x29, 0xb3, 0x86, 0xfd, - 0x03, 0x82, 0x5b, 0x95, 0x59, 0x61, 0xe1, 0x58, 0x85, 0xf5, 0xf6, 0x48, 0x68, 0x97, 0x17, 0x57, - 0xbf, 0x01, 0x93, 0xbe, 0xd2, 0xf1, 0x62, 0xbe, 0xfc, 0xd7, 0x39, 0x98, 0x0a, 0xa9, 0x18, 0x33, - 0x63, 0x1c, 0x45, 0x32, 0xed, 0x28, 0xff, 0x85, 0x0a, 0xe9, 0xaa, 0x79, 0xb9, 0xd5, 0x7d, 0x28, - 0x18, 0x3c, 0x0d, 0x4b, 0xa6, 0xdc, 0xaf, 0xc3, 0x0c, 0xe5, 0xff, 0x15, 0xf2, 0x8f, 0x22, 0xf3, - 0x7c, 0x2e, 0xfa, 0xcf, 0x4b, 0xdb, 0x11, 0x2a, 0x8e, 0x71, 0x2f, 0x7f, 0x02, 0xd3, 0x11, 0x65, - 0x63, 0xbd, 0xf3, 0xfb, 0x07, 0x09, 0xbe, 0x3a, 0x74, 0xa3, 0x88, 0x1a, 0x91, 0x45, 0x52, 0x8b, - 0x2d, 0x92, 0x95, 0x6c, 0x80, 0x6b, 0x7c, 0x2f, 0xf2, 0xfd, 0x1c, 0xa0, 0xf6, 0xb1, 0x6a, 0x75, - 0x9b, 0x8a, 0x45, 0x07, 0x58, 0xfc, 0xe1, 0xeb, 0x06, 0x16, 0xcc, 0x43, 0x98, 0xea, 0x12, 0xbb, - 0x63, 0xa9, 0xdc, 0x39, 0xa2, 0x3a, 0xf7, 0x0f, 0x53, 0x36, 0x03, 0x12, 0x0e, 0xf3, 0xa1, 0x6f, - 0x41, 0xf9, 0xd4, 0xfd, 0x23, 0xa2, 0x77, 0x40, 0x3b, 0xac, 0x90, 0x0c, 0xfe, 0xba, 0x18, 0xcc, - 0x1f, 0xd1, 0x60, 0x63, 0x1f, 0x4c, 0xfe, 0xa1, 0x04, 0x8b, 0x49, 0x47, 0x6c, 0x32, 0x53, 0xaf, - 0xdf, 0x19, 0x6f, 0x40, 0x81, 0xa3, 0x33, 0x2f, 0xdc, 0x76, 0x0f, 0xde, 0x99, 0x66, 0xcc, 0x5b, - 0xe5, 0x7f, 0x97, 0x60, 0x39, 0xdd, 0xb4, 0x1b, 0x28, 0xdb, 0x3f, 0x8b, 0x96, 0xed, 0xc3, 0xce, - 0x2a, 0xd2, 0xed, 0xcc, 0x28, 0xe1, 0xff, 0x2d, 0xd5, 0xe7, 0x37, 0xd0, 0xa9, 0x83, 0x68, 0xa7, - 0x1e, 0x8c, 0xdd, 0xa9, 0xf4, 0x0e, 0x35, 0xde, 0x7d, 0xf1, 0xc5, 0xca, 0xad, 0x5f, 0x7c, 0xb1, - 0x72, 0xeb, 0x97, 0x5f, 0xac, 0xdc, 0xfa, 0x83, 0x8b, 0x15, 0xe9, 0xc5, 0xc5, 0x8a, 0xf4, 0x8b, - 0x8b, 0x15, 0xe9, 0x97, 0x17, 0x2b, 0xd2, 0x7f, 0x5e, 0xac, 0x48, 0x7f, 0xf6, 0xab, 0x95, 0x5b, - 0x9f, 0x95, 0x04, 0xee, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x57, 0xe8, 0x50, 0x1c, 0x48, 0x3d, - 0x00, 0x00, + 0x07, 0x43, 0x62, 0x0c, 0x0e, 0xcb, 0x04, 0xc1, 0x78, 0xfe, 0xfc, 0xac, 0x3a, 0x1d, 0xa1, 0xe1, + 0x28, 0xbc, 0xfc, 0x79, 0x0e, 0x60, 0x83, 0x98, 0x9a, 0x31, 0xe8, 0x13, 0xfd, 0x3a, 0x12, 0xee, + 0x6e, 0x24, 0xe1, 0xbe, 0x3b, 0x2c, 0x76, 0xfa, 0xa6, 0x65, 0x66, 0xdc, 0xef, 0xc4, 0x32, 0x6e, + 0x7d, 0x74, 0xc8, 0x8b, 0x53, 0xee, 0x7f, 0xe6, 0x61, 0x21, 0x60, 0x5e, 0x37, 0xf4, 0xae, 0xca, + 0xd7, 0xc7, 0x27, 0x91, 0x31, 0xfe, 0x8d, 0xd8, 0x18, 0x2f, 0xa5, 0x88, 0x84, 0xc6, 0x77, 0xcb, + 0xb7, 0x36, 0xc7, 0xc5, 0x3f, 0x88, 0x2a, 0x7f, 0x79, 0x56, 0x4d, 0xd9, 0xf3, 0xd4, 0x7c, 0xa4, + 0xa8, 0x89, 0xe8, 0x2e, 0x4c, 0x58, 0x44, 0xb1, 0x0d, 0x9d, 0x07, 0x8a, 0xc9, 0xa0, 0x2b, 0x98, + 0xb7, 0x62, 0x41, 0x45, 0x6f, 0x41, 0xa9, 0x4f, 0x6c, 0x5b, 0xe9, 0x11, 0x1e, 0x13, 0x26, 0x1b, + 0xb3, 0x82, 0xb1, 0xb4, 0xed, 0x36, 0x63, 0x8f, 0x8e, 0x9e, 0xc3, 0x8c, 0xa6, 0xd8, 0x62, 0x82, + 0xb6, 0xd5, 0x3e, 0xe1, 0xab, 0x7e, 0x6a, 0xf5, 0xed, 0xd1, 0xe6, 0x01, 0x93, 0x08, 0x32, 0xdb, + 0x56, 0x04, 0x09, 0xc7, 0x90, 0xd1, 0x09, 0x20, 0xd6, 0xd2, 0xb6, 0x14, 0xdd, 0x76, 0x1d, 0xc5, + 0xf4, 0x95, 0xc6, 0xd6, 0xe7, 0x47, 0xb8, 0xad, 0x04, 0x1a, 0x4e, 0xd1, 0x20, 0xff, 0x4c, 0x82, + 0x99, 0x60, 0x98, 0xae, 0xa1, 0x9a, 0xda, 0x89, 0x56, 0x53, 0x6f, 0x8d, 0x3c, 0x45, 0x33, 0xca, + 0xa9, 0xff, 0xc9, 0x01, 0x0a, 0x98, 0xd8, 0x02, 0x3f, 0x50, 0x3a, 0xc7, 0x23, 0xec, 0x15, 0x7e, + 0x24, 0x01, 0x12, 0xe1, 0x79, 0x4d, 0xd7, 0x0d, 0xca, 0x23, 0xbe, 0x67, 0xd6, 0xe6, 0xc8, 0x66, + 0x79, 0x1a, 0x6b, 0x7b, 0x09, 0xac, 0x87, 0x3a, 0xb5, 0x06, 0xc1, 0x88, 0x24, 0x19, 0x70, 0x8a, + 0x01, 0x48, 0x01, 0xb0, 0x04, 0x66, 0xdb, 0x10, 0x0b, 0xf9, 0xdd, 0x11, 0x62, 0x1e, 0x13, 0x58, + 0x37, 0xf4, 0x43, 0xb5, 0x17, 0x84, 0x1d, 0xec, 0x03, 0xe1, 0x10, 0xe8, 0xf2, 0x43, 0x58, 0xca, + 0xb0, 0x16, 0xcd, 0x41, 0xfe, 0x98, 0x0c, 0x5c, 0xb7, 0x61, 0xf6, 0x13, 0xdd, 0x0a, 0xef, 0xa9, + 0x26, 0xc5, 0x76, 0xe8, 0xe3, 0xdc, 0x47, 0x92, 0xfc, 0xd3, 0x62, 0x78, 0xee, 0xf0, 0x52, 0xf6, + 0x1e, 0x94, 0x2d, 0x62, 0x6a, 0x6a, 0x47, 0xb1, 0x45, 0x85, 0xc2, 0xab, 0x52, 0x2c, 0xda, 0xb0, + 0x4f, 0x8d, 0x14, 0xbd, 0xb9, 0xab, 0x2d, 0x7a, 0xf3, 0xaf, 0xa6, 0xe8, 0xfd, 0x03, 0x28, 0xdb, + 0x5e, 0xb9, 0x5b, 0xe0, 0x90, 0xf7, 0xc7, 0x88, 0xaf, 0xa2, 0xd2, 0xf5, 0x15, 0xf8, 0x35, 0xae, + 0x0f, 0x9a, 0x56, 0xdd, 0x16, 0xc7, 0xac, 0x6e, 0x5f, 0x69, 0x45, 0xca, 0x62, 0xaa, 0xa9, 0x38, + 0x36, 0xe9, 0xf2, 0x40, 0x54, 0x0e, 0x62, 0x6a, 0x93, 0xb7, 0x62, 0x41, 0x45, 0xcf, 0x22, 0x53, + 0xb6, 0x7c, 0x99, 0x29, 0x3b, 0x93, 0x3d, 0x5d, 0xd1, 0x1e, 0x2c, 0x99, 0x96, 0xd1, 0xb3, 0x88, + 0x6d, 0x6f, 0x10, 0xa5, 0xab, 0xa9, 0x3a, 0xf1, 0xfc, 0xe3, 0x96, 0x2a, 0xaf, 0x9f, 0x9f, 0x55, + 0x97, 0x9a, 0xe9, 0x2c, 0x38, 0x4b, 0x56, 0x7e, 0x51, 0x80, 0xb9, 0x78, 0x06, 0xcc, 0xa8, 0x1e, + 0xa5, 0x4b, 0x55, 0x8f, 0xef, 0x84, 0x16, 0x83, 0x5b, 0x5a, 0xfb, 0xa3, 0x9f, 0xb2, 0x20, 0xd6, + 0x60, 0x56, 0x44, 0x03, 0x8f, 0x28, 0xea, 0x67, 0x7f, 0xf4, 0xf7, 0xa2, 0x64, 0x1c, 0xe7, 0x67, + 0x35, 0x61, 0x50, 0xea, 0x79, 0x20, 0x85, 0x68, 0x4d, 0xb8, 0x16, 0x67, 0xc0, 0x49, 0x19, 0xb4, + 0x0d, 0x0b, 0x8e, 0x9e, 0x84, 0x72, 0x67, 0xe3, 0xeb, 0x02, 0x6a, 0x61, 0x2f, 0xc9, 0x82, 0xd3, + 0xe4, 0xd0, 0x21, 0x40, 0xc7, 0x4b, 0xdb, 0x76, 0x65, 0x82, 0x47, 0xd8, 0xd5, 0x91, 0xd7, 0x8e, + 0x9f, 0xf1, 0x83, 0xb8, 0xe6, 0x37, 0xd9, 0x38, 0x84, 0x8c, 0x3e, 0x81, 0x69, 0x8b, 0x6f, 0x08, + 0x3c, 0x83, 0xdd, 0xa2, 0xfa, 0x35, 0x21, 0x36, 0x8d, 0xc3, 0x44, 0x1c, 0xe5, 0x4d, 0xa9, 0x83, + 0xcb, 0x23, 0xd7, 0xc1, 0xff, 0x2c, 0x85, 0x93, 0x90, 0x5f, 0x02, 0x7f, 0x1c, 0x29, 0x8f, 0xee, + 0xc6, 0xca, 0xa3, 0xc5, 0xa4, 0x44, 0xa8, 0x3a, 0x32, 0xd2, 0xab, 0xdf, 0x0f, 0xc7, 0xaa, 0x7e, + 0x83, 0xe4, 0x39, 0xbc, 0xfc, 0xfd, 0xb1, 0x04, 0x8b, 0x8f, 0x5a, 0x8f, 0x2d, 0xc3, 0x31, 0x3d, + 0x73, 0x76, 0x4d, 0xd7, 0xaf, 0xdf, 0x80, 0x82, 0xe5, 0x68, 0x5e, 0x3f, 0xde, 0xf4, 0xfa, 0x81, + 0x1d, 0x8d, 0xf5, 0x63, 0x21, 0x26, 0xe5, 0x76, 0x82, 0x09, 0xa0, 0x1d, 0x98, 0xb0, 0x14, 0xbd, + 0x47, 0xbc, 0xb4, 0x7a, 0x77, 0x88, 0xf5, 0x9b, 0x1b, 0x98, 0xb1, 0x87, 0x8a, 0x37, 0x2e, 0x8d, + 0x05, 0x8a, 0xfc, 0x67, 0x12, 0xcc, 0x3e, 0x69, 0xb7, 0x9b, 0x9b, 0x3a, 0x5f, 0xd1, 0xfc, 0xf0, + 0xf5, 0x0e, 0x14, 0x4c, 0x85, 0x1e, 0xc5, 0x33, 0x3d, 0xa3, 0x61, 0x4e, 0x41, 0xdf, 0x85, 0x12, + 0x8b, 0x24, 0x44, 0xef, 0x8e, 0x58, 0x6a, 0x0b, 0xf8, 0x86, 0x2b, 0x14, 0x54, 0x88, 0xa2, 0x01, + 0x7b, 0x70, 0xf2, 0x31, 0xdc, 0x0a, 0x99, 0xc3, 0xfc, 0xc1, 0xcf, 0x0c, 0x51, 0x0b, 0x8a, 0x4c, + 0xb3, 0x77, 0x24, 0x38, 0xec, 0xe4, 0x2b, 0xd6, 0xa5, 0xa0, 0xd2, 0x61, 0x5f, 0x36, 0x76, 0xb1, + 0xe4, 0x6d, 0x98, 0xe6, 0x27, 0xce, 0x86, 0x45, 0xb9, 0x5b, 0xd0, 0x6d, 0xc8, 0xf7, 0x55, 0x5d, + 0xe4, 0xd9, 0x29, 0x21, 0x93, 0x67, 0x39, 0x82, 0xb5, 0x73, 0xb2, 0x72, 0x2a, 0x22, 0x4f, 0x40, + 0x56, 0x4e, 0x31, 0x6b, 0x97, 0x1f, 0x43, 0x49, 0xb8, 0x3b, 0x0c, 0x94, 0xbf, 0x18, 0x28, 0x9f, + 0x02, 0xb4, 0x0b, 0xa5, 0xcd, 0x66, 0x43, 0x33, 0xdc, 0xaa, 0xab, 0xa3, 0x76, 0xad, 0xf8, 0x58, + 0xac, 0x6f, 0x6e, 0x60, 0xcc, 0x29, 0x48, 0x86, 0x09, 0x72, 0xda, 0x21, 0x26, 0xe5, 0x33, 0x62, + 0xb2, 0x01, 0x6c, 0x94, 0x1f, 0xf2, 0x16, 0x2c, 0x28, 0xf2, 0x9f, 0xe7, 0xa0, 0x24, 0xdc, 0x71, + 0x0d, 0xbb, 0xb0, 0xad, 0xc8, 0x2e, 0xec, 0xed, 0xd1, 0xa6, 0x46, 0xe6, 0x16, 0xac, 0x1d, 0xdb, + 0x82, 0xbd, 0x33, 0x22, 0xde, 0xc5, 0xfb, 0xaf, 0x9f, 0x48, 0x30, 0x13, 0x9d, 0x94, 0xe8, 0x01, + 0x4c, 0xb1, 0x84, 0xa3, 0x76, 0xc8, 0x4e, 0x50, 0xe7, 0xfa, 0xa7, 0x23, 0xad, 0x80, 0x84, 0xc3, + 0x7c, 0xa8, 0xe7, 0x8b, 0xb1, 0x79, 0x24, 0x3a, 0x9d, 0xed, 0x52, 0x87, 0xaa, 0x5a, 0xcd, 0xbd, + 0x38, 0xa9, 0x6d, 0xea, 0x74, 0xd7, 0x6a, 0x51, 0x4b, 0xd5, 0x7b, 0x09, 0x45, 0x7c, 0x52, 0x86, + 0x91, 0xe5, 0x7f, 0x92, 0x60, 0x4a, 0x98, 0x7c, 0x0d, 0xbb, 0x8a, 0xdf, 0x8d, 0xee, 0x2a, 0xee, + 0x8e, 0xb8, 0xc0, 0xd3, 0xb7, 0x14, 0x7f, 0x1b, 0x98, 0xce, 0x96, 0x34, 0x9b, 0xd5, 0x47, 0x86, + 0x4d, 0xe3, 0xb3, 0x9a, 0x2d, 0x46, 0xcc, 0x29, 0xc8, 0x81, 0x39, 0x35, 0x16, 0x03, 0x84, 0x6b, + 0xeb, 0xa3, 0x59, 0xe2, 0x8b, 0x35, 0x2a, 0x02, 0x7e, 0x2e, 0x4e, 0xc1, 0x09, 0x15, 0x32, 0x81, + 0x04, 0x17, 0xfa, 0x14, 0x0a, 0x47, 0x94, 0x9a, 0x29, 0x07, 0xc9, 0x43, 0x22, 0x4f, 0x60, 0x42, + 0x99, 0xf7, 0xae, 0xdd, 0x6e, 0x62, 0x0e, 0x25, 0xff, 0x6f, 0xe0, 0x8f, 0x96, 0x3b, 0xc7, 0xfd, + 0x78, 0x2a, 0x5d, 0x26, 0x9e, 0x4e, 0xa5, 0xc5, 0x52, 0xf4, 0x04, 0xf2, 0x54, 0x1b, 0x75, 0x5b, + 0x28, 0x10, 0xdb, 0x5b, 0xad, 0x20, 0x20, 0xb5, 0xb7, 0x5a, 0x98, 0x41, 0xa0, 0x5d, 0x28, 0xb2, + 0xec, 0xc3, 0x96, 0x60, 0x7e, 0xf4, 0x25, 0xcd, 0xfa, 0x1f, 0x4c, 0x08, 0xf6, 0x65, 0x63, 0x17, + 0x47, 0xfe, 0x3e, 0x4c, 0x47, 0xd6, 0x29, 0xfa, 0x0c, 0x6e, 0x6a, 0x86, 0xd2, 0x6d, 0x28, 0x9a, + 0xa2, 0x77, 0x88, 0x77, 0x6a, 0x7f, 0x37, 0x6d, 0x87, 0xb1, 0x15, 0xe2, 0x13, 0xab, 0xdc, 0xbf, + 0x7b, 0x0b, 0xd3, 0x70, 0x04, 0x51, 0x56, 0x00, 0x82, 0x3e, 0xa2, 0x2a, 0x14, 0xd9, 0x3c, 0x73, + 0xf3, 0xc9, 0x64, 0x63, 0x92, 0x59, 0xc8, 0xa6, 0x9f, 0x8d, 0xdd, 0x76, 0xb4, 0x0a, 0x60, 0x93, + 0x8e, 0x45, 0x28, 0x0f, 0x06, 0xb9, 0xe8, 0x0d, 0x64, 0xcb, 0xa7, 0xe0, 0x10, 0x97, 0xfc, 0x2f, + 0x12, 0x4c, 0xef, 0x10, 0xfa, 0x03, 0xc3, 0x3a, 0x6e, 0xf2, 0xcb, 0xe2, 0x6b, 0x08, 0xb6, 0x38, + 0x12, 0x6c, 0xdf, 0x1b, 0x32, 0x32, 0x11, 0xeb, 0xb2, 0x42, 0xae, 0xfc, 0x33, 0x09, 0x96, 0x22, + 0x9c, 0x0f, 0x83, 0xa5, 0xbb, 0x07, 0x45, 0xd3, 0xb0, 0xa8, 0x97, 0x88, 0xc7, 0x52, 0xc8, 0xc2, + 0x58, 0x28, 0x15, 0x33, 0x18, 0xec, 0xa2, 0xa1, 0x2d, 0xc8, 0x51, 0x43, 0x4c, 0xd5, 0xf1, 0x30, + 0x09, 0xb1, 0x1a, 0x20, 0x30, 0x73, 0x6d, 0x03, 0xe7, 0xa8, 0xc1, 0x06, 0xa2, 0x12, 0xe1, 0x0a, + 0x07, 0x9f, 0x2b, 0xea, 0x01, 0x86, 0xc2, 0xa1, 0x65, 0xf4, 0x2f, 0xdd, 0x07, 0x7f, 0x20, 0x1e, + 0x59, 0x46, 0x1f, 0x73, 0x2c, 0xf9, 0xe7, 0x12, 0xcc, 0x47, 0x38, 0xaf, 0x21, 0xf0, 0x7f, 0x1a, + 0x0d, 0xfc, 0xef, 0x8c, 0xd3, 0x91, 0x8c, 0xf0, 0xff, 0xf3, 0x5c, 0xac, 0x1b, 0xac, 0xc3, 0xe8, + 0x10, 0xa6, 0x4c, 0xa3, 0xdb, 0x7a, 0x05, 0xf7, 0x74, 0xb3, 0x2c, 0x6f, 0x36, 0x03, 0x2c, 0x1c, + 0x06, 0x46, 0xa7, 0x30, 0xaf, 0x2b, 0x7d, 0x62, 0x9b, 0x4a, 0x87, 0xb4, 0x5e, 0xc1, 0x01, 0xc9, + 0x6b, 0xfc, 0x22, 0x20, 0x8e, 0x88, 0x93, 0x4a, 0xd0, 0x36, 0x94, 0x54, 0x93, 0xd7, 0x71, 0xa2, + 0x76, 0x19, 0x9a, 0x45, 0xdd, 0xaa, 0xcf, 0x8d, 0xe7, 0xe2, 0x03, 0x7b, 0x18, 0xf2, 0xdf, 0xc5, + 0x67, 0x03, 0x9b, 0x7f, 0xe8, 0x31, 0x94, 0xf9, 0xb3, 0x8b, 0x8e, 0xa1, 0x79, 0x37, 0x03, 0x6c, + 0x64, 0x9b, 0xa2, 0xed, 0xe5, 0x59, 0xf5, 0xf5, 0x94, 0x43, 0x5f, 0x8f, 0x8c, 0x7d, 0x61, 0xb4, + 0x03, 0x05, 0xf3, 0xab, 0x54, 0x30, 0x3c, 0xc9, 0xf1, 0xb2, 0x85, 0xe3, 0xc8, 0x7f, 0x9c, 0x8f, + 0x99, 0xcb, 0x53, 0xdd, 0xf3, 0x57, 0x36, 0xea, 0x7e, 0xc5, 0x94, 0x39, 0xf2, 0x07, 0x50, 0x12, + 0x19, 0x5e, 0x4c, 0xe6, 0x6f, 0x8c, 0x33, 0x99, 0xc3, 0x59, 0xcc, 0xdf, 0xb0, 0x78, 0x8d, 0x1e, + 0x30, 0xfa, 0x1e, 0x4c, 0x10, 0x57, 0x85, 0x9b, 0x1b, 0x3f, 0x1c, 0x47, 0x45, 0x10, 0x57, 0x83, + 0x42, 0x55, 0xb4, 0x09, 0x54, 0xf4, 0x2d, 0xe6, 0x2f, 0xc6, 0xcb, 0x36, 0x81, 0x76, 0xa5, 0xc0, + 0xd3, 0xd5, 0x6d, 0xb7, 0xdb, 0x7e, 0xf3, 0xcb, 0xb3, 0x2a, 0x04, 0x9f, 0x38, 0x2c, 0x21, 0xff, + 0x9b, 0x04, 0xf3, 0xdc, 0x43, 0x1d, 0xc7, 0x52, 0xe9, 0xe0, 0xda, 0x12, 0xd3, 0x7e, 0x24, 0x31, + 0x7d, 0x30, 0xc4, 0x2d, 0x09, 0x0b, 0x33, 0x93, 0xd3, 0x2f, 0x24, 0x78, 0x2d, 0xc1, 0x7d, 0x0d, + 0x71, 0x71, 0x2f, 0x1a, 0x17, 0xdf, 0x1b, 0xb7, 0x43, 0x19, 0xb1, 0xf1, 0xf3, 0x9b, 0x29, 0xdd, + 0xe1, 0x2b, 0x65, 0x15, 0xc0, 0xb4, 0xd4, 0x13, 0x55, 0x23, 0x3d, 0x71, 0x3b, 0x5d, 0x0e, 0xbd, + 0x81, 0xf2, 0x29, 0x38, 0xc4, 0x85, 0x6c, 0x58, 0xec, 0x92, 0x43, 0xc5, 0xd1, 0xe8, 0x5a, 0xb7, + 0xbb, 0xae, 0x98, 0xca, 0x81, 0xaa, 0xa9, 0x54, 0x15, 0xc7, 0x05, 0x93, 0x8d, 0x4f, 0xdc, 0x5b, + 0xe3, 0x34, 0x8e, 0x97, 0x67, 0xd5, 0xdb, 0x69, 0xb7, 0x43, 0x1e, 0xcb, 0x00, 0x67, 0x40, 0xa3, + 0x01, 0x54, 0x2c, 0xf2, 0x7d, 0x47, 0xb5, 0x48, 0x77, 0xc3, 0x32, 0xcc, 0x88, 0xda, 0x3c, 0x57, + 0xfb, 0xdb, 0xe7, 0x67, 0xd5, 0x0a, 0xce, 0xe0, 0x19, 0xae, 0x38, 0x13, 0x1e, 0x3d, 0x87, 0x05, + 0xc5, 0x7d, 0x3a, 0x16, 0xd1, 0xea, 0xae, 0x92, 0x8f, 0xce, 0xcf, 0xaa, 0x0b, 0x6b, 0x49, 0xf2, + 0x70, 0x85, 0x69, 0xa0, 0xa8, 0x0e, 0xa5, 0x13, 0x43, 0x73, 0xfa, 0xc4, 0xae, 0x14, 0x39, 0x3e, + 0x4b, 0x04, 0xa5, 0x7d, 0xb7, 0xe9, 0xe5, 0x59, 0x75, 0xe2, 0x51, 0x8b, 0xaf, 0x3e, 0x8f, 0x8b, + 0x6d, 0x28, 0x59, 0x2d, 0x29, 0x56, 0x3c, 0x3f, 0x31, 0x2e, 0x07, 0x51, 0xeb, 0x49, 0x40, 0xc2, + 0x61, 0x3e, 0xf4, 0x0c, 0x26, 0x8f, 0xc4, 0xa9, 0x84, 0x5d, 0x29, 0x8d, 0x94, 0x84, 0x23, 0xa7, + 0x18, 0x8d, 0x79, 0xa1, 0x62, 0xd2, 0x6b, 0xb6, 0x71, 0x80, 0x88, 0xde, 0x82, 0x12, 0xff, 0xd8, + 0xdc, 0xe0, 0xc7, 0x71, 0xe5, 0x20, 0xb6, 0x3d, 0x71, 0x9b, 0xb1, 0x47, 0xf7, 0x58, 0x37, 0x9b, + 0xeb, 0xfc, 0x58, 0x38, 0xc6, 0xba, 0xd9, 0x5c, 0xc7, 0x1e, 0x1d, 0x7d, 0x06, 0x25, 0x9b, 0x6c, + 0xa9, 0xba, 0x73, 0x5a, 0x81, 0x91, 0x2e, 0x95, 0x5b, 0x0f, 0x39, 0x77, 0xec, 0x60, 0x2c, 0xd0, + 0x20, 0xe8, 0xd8, 0x83, 0x45, 0x47, 0x30, 0x69, 0x39, 0xfa, 0x9a, 0xbd, 0x67, 0x13, 0xab, 0x32, + 0xc5, 0x75, 0x0c, 0x0b, 0xe7, 0xd8, 0xe3, 0x8f, 0x6b, 0xf1, 0x3d, 0xe4, 0x73, 0xe0, 0x00, 0x1c, + 0xfd, 0xa9, 0x04, 0xc8, 0x76, 0x4c, 0x53, 0x23, 0x7d, 0xa2, 0x53, 0x45, 0xe3, 0x67, 0x71, 0x76, + 0xe5, 0x26, 0xd7, 0xf9, 0x3b, 0xc3, 0xfa, 0x95, 0x10, 0x8c, 0x2b, 0xf7, 0x0f, 0xbd, 0x93, 0xac, + 0x38, 0x45, 0x2f, 0x73, 0xed, 0xa1, 0xcd, 0x7f, 0x57, 0xa6, 0x47, 0x72, 0x6d, 0xfa, 0x99, 0x63, + 0xe0, 0x5a, 0x41, 0xc7, 0x1e, 0x2c, 0xda, 0x87, 0x45, 0x8b, 0x28, 0xdd, 0x5d, 0x5d, 0x1b, 0x60, + 0xc3, 0xa0, 0x8f, 0x54, 0x8d, 0xd8, 0x03, 0x9b, 0x92, 0x7e, 0x65, 0x86, 0x0f, 0xbb, 0xff, 0x28, + 0x03, 0xa7, 0x72, 0xe1, 0x0c, 0x69, 0xd4, 0x87, 0xaa, 0x17, 0x32, 0xd8, 0x7a, 0xf2, 0x63, 0xd6, + 0x43, 0xbb, 0xa3, 0x68, 0xee, 0x3d, 0xc0, 0x2c, 0x57, 0xf0, 0xe6, 0xf9, 0x59, 0xb5, 0xba, 0x71, + 0x31, 0x2b, 0x1e, 0x86, 0x85, 0xbe, 0x0b, 0x15, 0x25, 0x4b, 0xcf, 0x1c, 0xd7, 0xf3, 0x06, 0x8b, + 0x43, 0x99, 0x0a, 0x32, 0xa5, 0x11, 0x85, 0x39, 0x25, 0xfa, 0x42, 0xd5, 0xae, 0xcc, 0x8f, 0x74, + 0x10, 0x19, 0x7b, 0xd8, 0x1a, 0x1c, 0x46, 0xc4, 0x08, 0x36, 0x4e, 0x68, 0xe0, 0xcf, 0x27, 0xc4, + 0x61, 0xfa, 0xf5, 0xbc, 0x57, 0x1c, 0xef, 0xf9, 0x44, 0x60, 0xda, 0x2b, 0x7b, 0x3e, 0x11, 0x82, + 0xbc, 0xf8, 0xf8, 0xee, 0xbf, 0x73, 0xb0, 0x10, 0x30, 0x8f, 0xfc, 0x7c, 0x22, 0x45, 0xe4, 0xca, + 0x9e, 0x4f, 0xa4, 0xbf, 0x3f, 0xc8, 0x5f, 0xf5, 0xfb, 0x83, 0x2b, 0x78, 0xb6, 0xc1, 0x9f, 0x34, + 0x04, 0xae, 0xfb, 0xff, 0xf7, 0xa4, 0x21, 0xb0, 0x2d, 0xa3, 0xc8, 0xfa, 0x87, 0x5c, 0xb8, 0x03, + 0xbf, 0xf6, 0xf7, 0xea, 0x5f, 0xfd, 0x51, 0xa7, 0xfc, 0x8b, 0x3c, 0xcc, 0xc5, 0x57, 0x63, 0xe4, + 0xfa, 0x55, 0x1a, 0x7a, 0xfd, 0xda, 0x84, 0x5b, 0x87, 0x8e, 0xa6, 0x0d, 0xb8, 0x1b, 0x42, 0x77, + 0xb0, 0xee, 0xf5, 0xc9, 0x1b, 0x42, 0xf2, 0xd6, 0xa3, 0x14, 0x1e, 0x9c, 0x2a, 0x99, 0x71, 0x95, + 0x9c, 0xbf, 0xd4, 0x55, 0x72, 0xe2, 0x66, 0xb3, 0x30, 0xc6, 0xcd, 0x66, 0xea, 0xb5, 0x70, 0xf1, + 0x12, 0xd7, 0xc2, 0x97, 0xb9, 0xc7, 0x4d, 0x09, 0x62, 0xc3, 0xee, 0x71, 0xe5, 0x37, 0x60, 0x59, + 0x88, 0x51, 0x7e, 0xc5, 0xaa, 0x53, 0xcb, 0xd0, 0x34, 0x62, 0x6d, 0x38, 0xfd, 0xfe, 0x40, 0xfe, + 0x26, 0xcc, 0x44, 0x1f, 0x0f, 0xb8, 0x23, 0xed, 0xbe, 0x5f, 0x10, 0x97, 0x58, 0xa1, 0x91, 0x76, + 0xdb, 0xb1, 0xcf, 0x21, 0xff, 0x50, 0x82, 0xc5, 0xf4, 0x47, 0x82, 0x48, 0x83, 0x99, 0xbe, 0x72, + 0x1a, 0x7e, 0x51, 0x29, 0x5d, 0xf2, 0x78, 0x81, 0xdf, 0x1a, 0x6f, 0x47, 0xb0, 0x70, 0x0c, 0x5b, + 0xfe, 0x52, 0x82, 0xa5, 0x8c, 0xfb, 0xda, 0xeb, 0xb5, 0x04, 0x3d, 0x85, 0x72, 0x5f, 0x39, 0x6d, + 0x39, 0x56, 0x8f, 0x5c, 0xfa, 0x40, 0x85, 0x47, 0x8c, 0x6d, 0x81, 0x82, 0x7d, 0x3c, 0xf9, 0xc7, + 0x12, 0x54, 0xb2, 0x4a, 0x5b, 0xf4, 0x20, 0x72, 0xb3, 0xfc, 0xf5, 0xd8, 0xcd, 0xf2, 0x7c, 0x42, + 0xee, 0x8a, 0xee, 0x95, 0xff, 0x5e, 0x82, 0xc5, 0xf4, 0x12, 0x1f, 0xbd, 0x1f, 0xb1, 0xb0, 0x1a, + 0xb3, 0x70, 0x36, 0x26, 0x25, 0xec, 0xfb, 0x1e, 0xcc, 0x88, 0x8d, 0x80, 0x80, 0x11, 0x5e, 0x95, + 0xd3, 0x62, 0xa5, 0x80, 0xf0, 0x0a, 0x5f, 0x3e, 0x5e, 0xd1, 0x36, 0x1c, 0x43, 0x93, 0xff, 0x24, + 0x07, 0xc5, 0x56, 0x47, 0xd1, 0xc8, 0x35, 0x94, 0x59, 0xdf, 0x8e, 0x94, 0x59, 0xc3, 0xfe, 0xfd, + 0xc0, 0xad, 0xca, 0xac, 0xb0, 0x70, 0xac, 0xc2, 0x7a, 0x7b, 0x24, 0xb4, 0x8b, 0x8b, 0xab, 0xdf, + 0x82, 0x49, 0x5f, 0xe9, 0x78, 0x31, 0x5f, 0xfe, 0x9b, 0x1c, 0x4c, 0x85, 0x54, 0x8c, 0x99, 0x31, + 0x0e, 0x23, 0x99, 0x76, 0x94, 0xff, 0x41, 0x85, 0x74, 0xd5, 0xbc, 0xdc, 0xea, 0x3e, 0x12, 0x0c, + 0x9e, 0x85, 0x25, 0x53, 0xee, 0x37, 0x61, 0x86, 0xf2, 0xff, 0x09, 0xf9, 0xc7, 0x90, 0x79, 0x3e, + 0x17, 0xfd, 0xa7, 0xa5, 0xed, 0x08, 0x15, 0xc7, 0xb8, 0x97, 0x3f, 0x81, 0xe9, 0x88, 0xb2, 0xb1, + 0xde, 0xf8, 0xfd, 0xa3, 0x04, 0x5f, 0x1f, 0xba, 0x49, 0x44, 0x8d, 0xc8, 0x22, 0xa9, 0xc5, 0x16, + 0xc9, 0x4a, 0x36, 0xc0, 0x15, 0xbe, 0x15, 0xf9, 0x61, 0x0e, 0x50, 0xfb, 0x48, 0xb5, 0xba, 0x4d, + 0xc5, 0xa2, 0x03, 0x2c, 0xfe, 0xec, 0x75, 0x0d, 0x0b, 0xe6, 0x01, 0x4c, 0x75, 0x89, 0xdd, 0xb1, + 0x54, 0xee, 0x1c, 0x51, 0x9d, 0xfb, 0x07, 0x29, 0x1b, 0x01, 0x09, 0x87, 0xf9, 0xd0, 0x77, 0xa0, + 0x7c, 0xe2, 0xfe, 0x09, 0xd1, 0x3b, 0x9c, 0x1d, 0x56, 0x48, 0x06, 0x7f, 0x5b, 0x0c, 0xe6, 0x8f, + 0x68, 0xb0, 0xb1, 0x0f, 0x26, 0x7f, 0x2e, 0xc1, 0x62, 0xd2, 0x11, 0x1b, 0xcc, 0xd4, 0xab, 0x77, + 0xc6, 0x1b, 0x50, 0xe0, 0xe8, 0xcc, 0x0b, 0x37, 0xdd, 0x43, 0x77, 0xa6, 0x19, 0xf3, 0x56, 0xf9, + 0x3f, 0x24, 0x58, 0x4e, 0x37, 0xed, 0x1a, 0xca, 0xf6, 0xa7, 0xd1, 0xb2, 0x7d, 0xd8, 0x39, 0x45, + 0xba, 0x9d, 0x19, 0x25, 0xfc, 0xbf, 0xa7, 0xfa, 0xfc, 0x1a, 0x3a, 0xb5, 0x1f, 0xed, 0xd4, 0xfd, + 0xb1, 0x3b, 0x95, 0xde, 0xa1, 0xc6, 0xbb, 0x2f, 0xbe, 0x58, 0xb9, 0xf1, 0xcb, 0x2f, 0x56, 0x6e, + 0xfc, 0xea, 0x8b, 0x95, 0x1b, 0x7f, 0x74, 0xbe, 0x22, 0xbd, 0x38, 0x5f, 0x91, 0x7e, 0x79, 0xbe, + 0x22, 0xfd, 0xea, 0x7c, 0x45, 0xfa, 0xaf, 0xf3, 0x15, 0xe9, 0x2f, 0xbe, 0x5c, 0xb9, 0xf1, 0xb4, + 0x24, 0x70, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x55, 0xc4, 0x0b, 0x53, 0x44, 0x3d, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto index 4564db967ca..a6fe9dd72b6 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto @@ -815,7 +815,7 @@ message PodSecurityPolicySpec { optional bool defaultAllowPrivilegeEscalation = 15; // AllowPrivilegeEscalation determines if a pod can request to allow - // privilege escalation. + // privilege escalation. If unspecified, defaults to true. // +optional optional bool allowPrivilegeEscalation = 16; diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.go b/staging/src/k8s.io/api/extensions/v1beta1/types.go index 0bcc7066403..4993d6398e4 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.go @@ -975,9 +975,9 @@ type PodSecurityPolicySpec struct { // +optional DefaultAllowPrivilegeEscalation *bool `json:"defaultAllowPrivilegeEscalation,omitempty" protobuf:"varint,15,opt,name=defaultAllowPrivilegeEscalation"` // AllowPrivilegeEscalation determines if a pod can request to allow - // privilege escalation. + // privilege escalation. If unspecified, defaults to true. // +optional - AllowPrivilegeEscalation bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,16,opt,name=allowPrivilegeEscalation"` + AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,16,opt,name=allowPrivilegeEscalation"` // is a white list of allowed host paths. Empty indicates that all host paths may be used. // +optional AllowedHostPaths []AllowedHostPath `json:"allowedHostPaths,omitempty" protobuf:"bytes,17,rep,name=allowedHostPaths"` diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index c28fd278687..e722f925d95 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -458,7 +458,7 @@ var map_PodSecurityPolicySpec = map[string]string{ "fsGroup": "FSGroup is the strategy that will dictate what fs group is used by the SecurityContext.", "readOnlyRootFilesystem": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", "defaultAllowPrivilegeEscalation": "DefaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.", - "allowPrivilegeEscalation": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation.", + "allowPrivilegeEscalation": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", "allowedHostPaths": "is a white list of allowed host paths. Empty indicates that all host paths may be used.", } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index 45b56997bf8..c173b3f418d 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -1431,6 +1431,15 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { **out = **in } } + if in.AllowPrivilegeEscalation != nil { + in, out := &in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation + if *in == nil { + *out = nil + } else { + *out = new(bool) + **out = **in + } + } if in.AllowedHostPaths != nil { in, out := &in.AllowedHostPaths, &out.AllowedHostPaths *out = make([]AllowedHostPath, len(*in)) From 80f06ffee7f4e3858c48d290e0b102dc76564291 Mon Sep 17 00:00:00 2001 From: George Kraft Date: Wed, 4 Oct 2017 13:26:14 -0500 Subject: [PATCH 48/51] Bump default snap channel to 1.8/stable in juju charms --- cluster/juju/layers/kubernetes-e2e/config.yaml | 2 +- cluster/juju/layers/kubernetes-master/config.yaml | 2 +- cluster/juju/layers/kubernetes-worker/config.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cluster/juju/layers/kubernetes-e2e/config.yaml b/cluster/juju/layers/kubernetes-e2e/config.yaml index f5b9b72a4b5..bf1ba66a77c 100644 --- a/cluster/juju/layers/kubernetes-e2e/config.yaml +++ b/cluster/juju/layers/kubernetes-e2e/config.yaml @@ -1,6 +1,6 @@ options: channel: type: string - default: "1.7/stable" + default: "1.8/stable" description: | Snap channel to install Kubernetes snaps from diff --git a/cluster/juju/layers/kubernetes-master/config.yaml b/cluster/juju/layers/kubernetes-master/config.yaml index bd74277becc..c328a43751c 100644 --- a/cluster/juju/layers/kubernetes-master/config.yaml +++ b/cluster/juju/layers/kubernetes-master/config.yaml @@ -23,7 +23,7 @@ options: detected on a worker node. channel: type: string - default: "1.7/stable" + default: "1.8/stable" description: | Snap channel to install Kubernetes master services from client_password: diff --git a/cluster/juju/layers/kubernetes-worker/config.yaml b/cluster/juju/layers/kubernetes-worker/config.yaml index b394df4a15e..9c91f7fc826 100644 --- a/cluster/juju/layers/kubernetes-worker/config.yaml +++ b/cluster/juju/layers/kubernetes-worker/config.yaml @@ -22,7 +22,7 @@ options: switch to privileged mode if gpu hardware is detected. channel: type: string - default: "1.7/stable" + default: "1.8/stable" description: | Snap channel to install Kubernetes worker services from require-manual-upgrade: From f107e378c92ffd5ca522aa3342d67f1fda74f628 Mon Sep 17 00:00:00 2001 From: Zihong Zheng Date: Mon, 18 Sep 2017 17:04:10 -0700 Subject: [PATCH 49/51] Allow setting --concurrent-service-syncs for kube-controller-manager in GCE startup scripts --- cluster/gce/config-default.sh | 4 ++++ cluster/gce/config-test.sh | 4 ++++ cluster/gce/container-linux/configure-helper.sh | 3 +++ cluster/gce/gci/configure-helper.sh | 3 +++ cluster/kubemark/gce/config-default.sh | 4 ++++ 5 files changed, 18 insertions(+) diff --git a/cluster/gce/config-default.sh b/cluster/gce/config-default.sh index 9dbc1858b5f..e724a280882 100755 --- a/cluster/gce/config-default.sh +++ b/cluster/gce/config-default.sh @@ -338,3 +338,7 @@ fi # Optional: enable certificate rotation of the kubelet certificates. ROTATE_CERTIFICATES="${ROTATE_CERTIFICATES:-}" + +# The number of services that are allowed to sync concurrently. Will be passed +# into kube-controller-manager via `--concurrent-service-syncs` +CONCURRENT_SERVICE_SYNCS="${CONCURRENT_SERVICE_SYNCS:-}" diff --git a/cluster/gce/config-test.sh b/cluster/gce/config-test.sh index f19b6a6925f..c6b87e41304 100755 --- a/cluster/gce/config-test.sh +++ b/cluster/gce/config-test.sh @@ -389,3 +389,7 @@ fi # Optional: enable certificate rotation of the kubelet certificates. ROTATE_CERTIFICATES="${ROTATE_CERTIFICATES:-}" + +# The number of services that are allowed to sync concurrently. Will be passed +# into kube-controller-manager via `--concurrent-service-syncs` +CONCURRENT_SERVICE_SYNCS="${CONCURRENT_SERVICE_SYNCS:-}" diff --git a/cluster/gce/container-linux/configure-helper.sh b/cluster/gce/container-linux/configure-helper.sh index 164b334b1c8..0440b27ece6 100755 --- a/cluster/gce/container-linux/configure-helper.sh +++ b/cluster/gce/container-linux/configure-helper.sh @@ -1103,6 +1103,9 @@ function start-kube-controller-manager { if [[ -n "${SERVICE_CLUSTER_IP_RANGE:-}" ]]; then params+=" --service-cluster-ip-range=${SERVICE_CLUSTER_IP_RANGE}" fi + if [[ -n "${CONCURRENT_SERVICE_SYNCS:-}" ]]; then + params+=" --concurrent-service-syncs=${CONCURRENT_SERVICE_SYNCS}" + fi if [[ "${NETWORK_PROVIDER:-}" == "kubenet" ]]; then params+=" --allocate-node-cidrs=true" elif [[ -n "${ALLOCATE_NODE_CIDRS:-}" ]]; then diff --git a/cluster/gce/gci/configure-helper.sh b/cluster/gce/gci/configure-helper.sh index 2011dd6fee3..a23c9348f2f 100644 --- a/cluster/gce/gci/configure-helper.sh +++ b/cluster/gce/gci/configure-helper.sh @@ -1581,6 +1581,9 @@ function start-kube-controller-manager { if [[ -n "${SERVICE_CLUSTER_IP_RANGE:-}" ]]; then params+=" --service-cluster-ip-range=${SERVICE_CLUSTER_IP_RANGE}" fi + if [[ -n "${CONCURRENT_SERVICE_SYNCS:-}" ]]; then + params+=" --concurrent-service-syncs=${CONCURRENT_SERVICE_SYNCS}" + fi if [[ "${NETWORK_PROVIDER:-}" == "kubenet" ]]; then params+=" --allocate-node-cidrs=true" elif [[ -n "${ALLOCATE_NODE_CIDRS:-}" ]]; then diff --git a/cluster/kubemark/gce/config-default.sh b/cluster/kubemark/gce/config-default.sh index bd52a345ac8..dc87f069588 100644 --- a/cluster/kubemark/gce/config-default.sh +++ b/cluster/kubemark/gce/config-default.sh @@ -116,3 +116,7 @@ ENABLE_POD_PRIORITY="${ENABLE_POD_PRIORITY:-}" if [[ "${ENABLE_POD_PRIORITY}" == "true" ]]; then FEATURE_GATES="${FEATURE_GATES},PodPriority=true" fi + +# The number of services that are allowed to sync concurrently. Will be passed +# into kube-controller-manager via `--concurrent-service-syncs` +CONCURRENT_SERVICE_SYNCS="${CONCURRENT_SERVICE_SYNCS:-}" From 995dd32a8706bbbea0fc3d9699001f41cb877db2 Mon Sep 17 00:00:00 2001 From: Nick Sardo Date: Tue, 3 Oct 2017 15:00:01 -0700 Subject: [PATCH 50/51] Handle missing subnet for auto networks and legacy networks --- pkg/cloudprovider/providers/gce/gce.go | 88 +++++++++++++------ .../gce/gce_loadbalancer_internal.go | 48 +++++----- pkg/cloudprovider/providers/gce/gce_test.go | 60 +++++++++++++ 3 files changed, 147 insertions(+), 49 deletions(-) diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index 6e817dae6ce..1c77a4f79a4 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -114,6 +114,7 @@ type GCECloud struct { localZone string // The zone in which we are running managedZones []string // List of zones we are spanning (for multi-AZ clusters, primarily when running on master) networkURL string + isLegacyNetwork bool subnetworkURL string secondaryRangeName string networkProjectID string @@ -397,31 +398,49 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { // ProjectID and.NetworkProjectID may be project number or name. projID, netProjID := tryConvertToProjectNames(config.ProjectID, config.NetworkProjectID, service) - onXPN := projID != netProjID var networkURL string var subnetURL string + var isLegacyNetwork bool - if config.NetworkName == "" && config.NetworkURL == "" { - // TODO: Stop using this call and return an error. - // This function returns the first network in a list of networks for a project. The project - // should be set via configuration instead of randomly taking the first. - networkName, err := getNetworkNameViaAPICall(service, config.NetworkProjectID) - if err != nil { - return nil, err - } - networkURL = gceNetworkURL(config.ApiEndpoint, netProjID, networkName) - } else if config.NetworkURL != "" { + if config.NetworkURL != "" { networkURL = config.NetworkURL - } else { + } else if config.NetworkName != "" { networkURL = gceNetworkURL(config.ApiEndpoint, netProjID, config.NetworkName) + } else { + // Other consumers may use the cloudprovider without utilizing the wrapped GCE API functions + // or functions requiring network/subnetwork URLs (e.g. Kubelet). + glog.Warningf("No network name or URL specified.") } if config.SubnetworkURL != "" { subnetURL = config.SubnetworkURL } else if config.SubnetworkName != "" { subnetURL = gceSubnetworkURL(config.ApiEndpoint, netProjID, config.Region, config.SubnetworkName) + } else { + // Attempt to determine the subnetwork in case it's an automatic network. + // Legacy networks will not have a subnetwork, so subnetworkURL should remain empty. + if networkName := lastComponent(networkURL); networkName != "" { + if n, err := getNetwork(service, netProjID, networkName); err != nil { + // Gracefully fail because kubelet calls CreateGCECloud without any config, and API calls will fail coming from minions. + glog.Warningf("Could not retrieve network %q in attempt to determine if legacy network or see list of subnets, err %v", networkURL, err) + } else { + // Legacy networks have a non-empty IPv4Range + if len(n.IPv4Range) > 0 { + glog.Infof("Determined network %q is type legacy", networkURL) + isLegacyNetwork = true + } else { + // Try to find the subnet in the list of subnets + subnetURL = findSubnetForRegion(n.Subnetworks, config.Region) + if len(subnetURL) > 0 { + glog.Infof("Using subnet %q within network %q & region %q because none was specified.", subnetURL, n.Name, config.Region) + } else { + glog.Warningf("Could not find any subnet in region %q within list %v.", config.Region, n.Subnetworks) + } + } + } + } } if len(config.ManagedZones) == 0 { @@ -449,6 +468,7 @@ func CreateGCECloud(config *CloudConfig) (*GCECloud, error) { localZone: config.Zone, managedZones: config.ManagedZones, networkURL: networkURL, + isLegacyNetwork: isLegacyNetwork, subnetworkURL: subnetURL, secondaryRangeName: config.SecondaryRangeName, nodeTags: config.NodeTags, @@ -572,6 +592,10 @@ func (gce *GCECloud) SubnetworkURL() string { return gce.subnetworkURL } +func (gce *GCECloud) IsLegacyNetwork() bool { + return gce.isLegacyNetwork +} + // Known-useless DNS search path. var uselessDNSSearchRE = regexp.MustCompile(`^[0-9]+.google.internal.$`) @@ -615,7 +639,7 @@ func gceSubnetworkURL(apiEndpoint, project, region, subnetwork string) string { return apiEndpoint + strings.Join([]string{"projects", project, "regions", region, "subnetworks", subnetwork}, "/") } -// getProjectIDInURL parses typical full resource URLS and shorter URLS +// getProjectIDInURL parses full resource URLS and shorter URLS // https://www.googleapis.com/compute/v1/projects/myproject/global/networks/mycustom // projects/myproject/global/networks/mycustom // All return "myproject" @@ -629,6 +653,20 @@ func getProjectIDInURL(urlStr string) (string, error) { return "", fmt.Errorf("could not find project field in url: %v", urlStr) } +// getRegionInURL parses full resource URLS and shorter URLS +// https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/subnetworks/a +// projects/myproject/regions/us-central1/subnetworks/a +// All return "us-central1" +func getRegionInURL(urlStr string) string { + fields := strings.Split(urlStr, "/") + for i, v := range fields { + if v == "regions" && i < len(fields)-1 { + return fields[i+1] + } + } + return "" +} + func getNetworkNameViaMetadata() (string, error) { result, err := metadata.Get("instance/network-interfaces/0/network") if err != nil { @@ -641,18 +679,9 @@ func getNetworkNameViaMetadata() (string, error) { return parts[3], nil } -func getNetworkNameViaAPICall(svc *compute.Service, projectID string) (string, error) { - // TODO: use PageToken to list all not just the first 500 - networkList, err := svc.Networks.List(projectID).Do() - if err != nil { - return "", err - } - - if networkList == nil || len(networkList.Items) <= 0 { - return "", fmt.Errorf("GCE Network List call returned no networks for project %q", projectID) - } - - return networkList.Items[0].Name, nil +// getNetwork returns a GCP network +func getNetwork(svc *compute.Service, networkProjectID, networkID string) (*compute.Network, error) { + return svc.Networks.Get(networkProjectID, networkID).Do() } // getProjectID returns the project's string ID given a project number or string @@ -687,6 +716,15 @@ func getZonesForRegion(svc *compute.Service, projectID, region string) ([]string return zones, nil } +func findSubnetForRegion(subnetURLs []string, region string) string { + for _, url := range subnetURLs { + if thisRegion := getRegionInURL(url); thisRegion == region { + return url + } + } + return "" +} + func newOauthClient(tokenSource oauth2.TokenSource) (*http.Client, error) { if tokenSource == nil { var err error diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go index 31d770c849a..5a5f72bf6a5 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go @@ -80,12 +80,18 @@ func (gce *GCECloud) ensureInternalLoadBalancer(clusterName, clusterID string, s // Determine IP which will be used for this LB. If no forwarding rule has been established // or specified in the Service spec, then requestedIP = "". requestedIP := determineRequestedIP(svc, existingFwdRule) - addrMgr := newAddressManager(gce, nm.String(), gce.Region(), gce.getInternalSubnetURL(), loadBalancerName, requestedIP, schemeInternal) - ipToUse, err := addrMgr.HoldAddress() - if err != nil { - return nil, err + ipToUse := requestedIP + + var addrMgr *addressManager + // If the network is not a legacy network, use the address manager + if !gce.IsLegacyNetwork() { + addrMgr = newAddressManager(gce, nm.String(), gce.Region(), gce.SubnetworkURL(), loadBalancerName, requestedIP, schemeInternal) + ipToUse, err = addrMgr.HoldAddress() + if err != nil { + return nil, err + } + glog.V(2).Infof("ensureInternalLoadBalancer(%v): reserved IP %q for the forwarding rule", loadBalancerName, ipToUse) } - glog.V(2).Infof("ensureInternalLoadBalancer(%v): reserved IP %q for the forwarding rule", loadBalancerName, ipToUse) // Ensure firewall rules if necessary if err = gce.ensureInternalFirewalls(loadBalancerName, ipToUse, clusterID, nm, svc, strconv.Itoa(int(hcPort)), sharedHealthCheck, nodes); err != nil { @@ -102,7 +108,7 @@ func (gce *GCECloud) ensureInternalLoadBalancer(clusterName, clusterID string, s LoadBalancingScheme: string(scheme), } - // Specify subnetwork if network type is manual + // Specify subnetwork if known if len(gce.subnetworkURL) > 0 { expectedFwdRule.Subnetwork = gce.subnetworkURL } else { @@ -138,13 +144,21 @@ func (gce *GCECloud) ensureInternalLoadBalancer(clusterName, clusterID string, s gce.clearPreviousInternalResources(svc, loadBalancerName, existingBackendService, backendServiceName, hcName) } - // Now that the controller knows the forwarding rule exists, we can release the address. - if err := addrMgr.ReleaseAddress(); err != nil { - glog.Errorf("ensureInternalLoadBalancer: failed to release address reservation, possibly causing an orphan: %v", err) + if addrMgr != nil { + // Now that the controller knows the forwarding rule exists, we can release the address. + if err := addrMgr.ReleaseAddress(); err != nil { + glog.Errorf("ensureInternalLoadBalancer: failed to release address reservation, possibly causing an orphan: %v", err) + } + } + + // Get the most recent forwarding rule for the address. + updatedFwdRule, err := gce.GetRegionForwardingRule(loadBalancerName, gce.region) + if err != nil { + return nil, err } status := &v1.LoadBalancerStatus{} - status.Ingress = []v1.LoadBalancerIngress{{IP: ipToUse}} + status.Ingress = []v1.LoadBalancerIngress{{IP: updatedFwdRule.IPAddress}} return status, nil } @@ -662,20 +676,6 @@ func (gce *GCECloud) getBackendServiceLink(name string) string { return gce.service.BasePath + strings.Join([]string{gce.projectID, "regions", gce.region, "backendServices", name}, "/") } -// getInternalSubnetURL first attempts to return the configured SubnetURL. -// If subnetwork-name was not specified, then a best-effort generation is made. -// Note subnet names might not be the network name for some auto networks. -func (gce *GCECloud) getInternalSubnetURL() string { - if gce.SubnetworkURL() != "" { - return gce.SubnetworkURL() - } - - networkName := getNameFromLink(gce.NetworkURL()) - v := gceSubnetworkURL("", gce.NetworkProjectID(), gce.Region(), networkName) - glog.Warningf("Generating subnetwork URL based off network since subnet name/URL was not configured: %q", v) - return v -} - func getNameFromLink(link string) string { if link == "" { return "" diff --git a/pkg/cloudprovider/providers/gce/gce_test.go b/pkg/cloudprovider/providers/gce/gce_test.go index 14d4e703418..e3020acb7db 100644 --- a/pkg/cloudprovider/providers/gce/gce_test.go +++ b/pkg/cloudprovider/providers/gce/gce_test.go @@ -626,3 +626,63 @@ func TestNewAlphaFeatureGate(t *testing.T) { delete(knownAlphaFeatures, "foo") delete(knownAlphaFeatures, "bar") } + +func TestGetRegionInURL(t *testing.T) { + cases := map[string]string{ + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-central1/subnetworks/a": "us-central1", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-west2/subnetworks/b": "us-west2", + "projects/my-project/regions/asia-central1/subnetworks/c": "asia-central1", + "regions/europe-north2": "europe-north2", + "my-url": "", + "": "", + } + for input, output := range cases { + result := getRegionInURL(input) + if result != output { + t.Errorf("Actual result %q does not match expected result %q for input: %q", result, output, input) + } + } +} + +func TestFindSubnetForRegion(t *testing.T) { + s := []string{ + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-central1/subnetworks/default-38b01f54907a15a7", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-west1/subnetworks/default", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-east1/subnetworks/default-277eec3815f742b6", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-east4/subnetworks/default", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/asia-northeast1/subnetworks/default", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/asia-east1/subnetworks/default-8e020b4b8b244809", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/australia-southeast1/subnetworks/default", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/southamerica-east1/subnetworks/default", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/europe-west3/subnetworks/default", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/asia-southeast1/subnetworks/default", + "", + } + actual := findSubnetForRegion(s, "asia-east1") + expectedResult := "https://www.googleapis.com/compute/v1/projects/my-project/regions/asia-east1/subnetworks/default-8e020b4b8b244809" + if actual != expectedResult { + t.Errorf("Actual result %q does not match expected result %q", actual, expectedResult) + } + + var nilSlice []string + res := findSubnetForRegion(nilSlice, "us-central1") + if res != "" { + t.Errorf("expected an empty result, got %v", res) + } +} + +func TestLastComponent(t *testing.T) { + cases := map[string]string{ + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-central1/subnetworks/a": "a", + "https://www.googleapis.com/compute/v1/projects/my-project/regions/us-central1/subnetworks/b": "b", + "projects/my-project/regions/us-central1/subnetworks/c": "c", + "d": "d", + "": "", + } + for input, output := range cases { + result := lastComponent(input) + if result != output { + t.Errorf("Actual result %q does not match expected result %q for input: %q", result, output, input) + } + } +} From e0bbb382af8a8fe045c0d15bc9e003aa5f2e49d7 Mon Sep 17 00:00:00 2001 From: Wojciech Tyczynski Date: Thu, 5 Oct 2017 12:50:06 +0200 Subject: [PATCH 51/51] Update CHANGELOG-1.7.md for v1.7.8. --- CHANGELOG-1.7.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 CHANGELOG-1.7.md diff --git a/CHANGELOG-1.7.md b/CHANGELOG-1.7.md new file mode 100644 index 00000000000..3c35fafc1af --- /dev/null +++ b/CHANGELOG-1.7.md @@ -0,0 +1,78 @@ + +- [v1.7.8](#v178) + - [Downloads for v1.7.8](#downloads-for-v178) + - [Client Binaries](#client-binaries) + - [Server Binaries](#server-binaries) + - [Node Binaries](#node-binaries) + - [Changelog since v1.7.7](#changelog-since-v177) + - [Other notable changes](#other-notable-changes) + + + + + +# v1.7.8 + +[Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/release-1.7/examples) + +## Downloads for v1.7.8 + + +filename | sha256 hash +-------- | ----------- +[kubernetes.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes.tar.gz) | `219bbdd3b36949004432230629f14caf6e36839537bac54d75c02ca0bc91af73` +[kubernetes-src.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-src.tar.gz) | `7d70756b49029921a4609db0748be279b9473cbb24319d45813f0f018248de67` + +### Client Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-darwin-386.tar.gz) | `4d3d683fd1520a2f3e229cac7f823c63a2630b831874cbd3b4c130fea6ce86cf` +[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-darwin-amd64.tar.gz) | `6c2d1d6de6d78823e4a4d66f02f780204214ed03aab89766cc4526b97eb56062` +[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-linux-386.tar.gz) | `318b0f1053d666b296be37a9ca264b31311cfd700f213bbff87a9010c786ef4b` +[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-linux-amd64.tar.gz) | `90d64d3642b1fd25d19f369803fee4b84bb53baa128f71c30ed67c9c4b9081aa` +[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-linux-arm64.tar.gz) | `b8eb3ae3598ccaf9cfd637110b8b6cb5fa324f772dc188b12bb1ca18cf3250e7` +[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-linux-arm.tar.gz) | `200cbc7076740781bb5a95ffbb2040a7b6c751d2c050f040c293adf0c41f5c4a` +[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-linux-ppc64le.tar.gz) | `e9033569028313d339cc2290447fcd96987c5ac56f8666063f1f147a71e76746` +[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-linux-s390x.tar.gz) | `5a6f597d73d43f34c40664940a79e096a2e3c645c6baf72bf0e8c60b723a6799` +[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-windows-386.tar.gz) | `306388adaf891b2636f8d74c4b473d3f67245daff480503a07ed8e92c9bf6127` +[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-client-windows-amd64.tar.gz) | `42e4bebbdafd6274ac816ef4d560011721b100a4c5caf54324193653779ad377` + +### Server Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-server-linux-amd64.tar.gz) | `80507ed2b515ab1762d3982b0a8ae18e78f1aeb7abd25e03b8777d66db1accfe` +[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-server-linux-arm64.tar.gz) | `e4401984dd3951985e390296bfca2383b78f7157519c9fa75ff56ee5a8654f93` +[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-server-linux-arm.tar.gz) | `4a515461dd9e10e3fac848bdb2e78d115ac154c10a2052a2489d34eb4a106bdb` +[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-server-linux-ppc64le.tar.gz) | `3c04ef5b83898aec1db99b4eea11b69763399e9787d1fc1df292e372537af480` +[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-server-linux-s390x.tar.gz) | `139c4292b88a076f576766d28cc2f2d1f3cc5805eedd8926e0b676f639628ffe` + +### Node Binaries + +filename | sha256 hash +-------- | ----------- +[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-node-linux-amd64.tar.gz) | `d485ba3ef78a5450f2c1f826a811a0812244fee469e583e8c99882f1d4a6c310` +[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-node-linux-arm64.tar.gz) | `3914eb9963347e2800ad1f821e61dd863f83bbffaf9a76d3f873c5e48c5163c8` +[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-node-linux-arm.tar.gz) | `cf90a98a505908e5a92de0720341f43d5a5c938467b3b161c1e11ca76f8216fa` +[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-node-linux-ppc64le.tar.gz) | `1f57f27cdd9a0ba6be5298a6b28c5aea5c53197cff65fddb02ff051bda1acc6e` +[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-node-linux-s390x.tar.gz) | `f6ff6604e758643cc6a6710eab98d968ede12b255b0c9d66e5160c88a263ccad` +[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.7.8/kubernetes-node-windows-amd64.tar.gz) | `31babad05d172c11a08e8433fd4d19cc273ee8a18a885f74ebdcda6f02a769ad` + +## Changelog since v1.7.7 + +### Other notable changes + +* Ignore pods marked for deletion that exceed their grace period in ResourceQuota ([#46542](https://github.com/kubernetes/kubernetes/pull/46542), [@derekwaynecarr](https://github.com/derekwaynecarr)) +* kubelet to master communication when doing node status updates now has a timeout to prevent indefinite hangs ([#52176](https://github.com/kubernetes/kubernetes/pull/52176), [@liggitt](https://github.com/liggitt)) +* Bumped Heapster version to 1.4.3 - more details https://github.com/kubernetes/heapster/releases/tag/v1.4.3 ([#53376](https://github.com/kubernetes/kubernetes/pull/53376), [@loburm](https://github.com/loburm)) +* Delete the federation namespace from control plane instead of individual objects ([#51768](https://github.com/kubernetes/kubernetes/pull/51768), [@shashidharatd](https://github.com/shashidharatd)) +* Bugfix: OpenAPI models may not get group-version-kind extension if kubernetes is vendored in another project (e.g. minikube). Kubectl 1.8 needs this extension to work with those projects. ([#53152](https://github.com/kubernetes/kubernetes/pull/53152), [@mbohlool](https://github.com/mbohlool)) +* Fix for Nodes in vSphere lacking an InternalIP. ([#48760](https://github.com/kubernetes/kubernetes/pull/48760)) ([#49202](https://github.com/kubernetes/kubernetes/pull/49202), [@cbonte](https://github.com/cbonte)) +* [fluentd-gcp addon] Update Stackdriver plugin to version 0.6.7 ([#52565](https://github.com/kubernetes/kubernetes/pull/52565), [@crassirostris](https://github.com/crassirostris)) +* Fixes an issue with RBAC reconciliation that could cause duplicated subjects in some bootstrapped rolebindings on each restart of the API server. ([#53239](https://github.com/kubernetes/kubernetes/pull/53239), [@enj](https://github.com/enj)) +* Restores redirect behavior for proxy subresources ([#52933](https://github.com/kubernetes/kubernetes/pull/52933), [@liggitt](https://github.com/liggitt)) +* Fix panic in ControllerManager on GCE when it has a problem with creating external loadbalancer healthcheck ([#52646](https://github.com/kubernetes/kubernetes/pull/52646), [@gmarek](https://github.com/gmarek)) +* custom resources that use unconventional pluralization now work properly with kubectl and garbage collection ([#50012](https://github.com/kubernetes/kubernetes/pull/50012), [@deads2k](https://github.com/deads2k)) +* When performing a GET then PUT, the kube-apiserver must write the canonical representation of the object to etcd if the current value does not match. That allows external agents to migrate content in etcd from one API version to another, across different storage types, or across varying encryption levels. This fixes a bug introduced in 1.5 where we unintentionally stopped writing the newest data. ([#48394](https://github.com/kubernetes/kubernetes/pull/48394), [@smarterclayton](https://github.com/smarterclayton)) +