From 5a9b06b717805ad47da1edda6018fea107ac4ce9 Mon Sep 17 00:00:00 2001 From: Jeffrey Regan Date: Fri, 19 May 2017 14:33:08 -0700 Subject: [PATCH] **What this PR does / why we need it**: Remove kubectl's dependence on pkg/api/helper, as part of broader effort to isolate kubectl from the rest of k8s. In this case, the code becomes private to kubectl; nobody else uses it. **Which issue this PR fixes** Part of a series of PRs to address kubernetes/community#598 **Special notes for your reviewer**: **Release note**: ```release-note NONE ``` --- build/visible_to/BUILD | 8 ++++ pkg/api/helper/BUILD | 1 - pkg/api/helper/helpers.go | 23 ---------- pkg/kubectl/BUILD | 5 +- pkg/kubectl/cmd/BUILD | 2 +- pkg/kubectl/cmd/logs.go | 4 +- pkg/kubectl/cmd/rollingupdate.go | 4 +- pkg/kubectl/rolling_updater.go | 4 +- pkg/kubectl/rolling_updater_test.go | 4 +- pkg/kubectl/util/BUILD | 31 +++++++++++++ pkg/kubectl/util/util.go | 46 +++++++++++++++++++ .../src/k8s.io/client-go/Godeps/Godeps.json | 2 +- .../src/k8s.io/client-go/pkg/api/helper/BUILD | 1 - .../client-go/pkg/api/helper/helpers.go | 23 ---------- 14 files changed, 98 insertions(+), 60 deletions(-) create mode 100644 pkg/kubectl/util/BUILD create mode 100644 pkg/kubectl/util/util.go diff --git a/build/visible_to/BUILD b/build/visible_to/BUILD index 7de7ce3d3d..20c9aa142e 100644 --- a/build/visible_to/BUILD +++ b/build/visible_to/BUILD @@ -352,6 +352,14 @@ package_group( ], ) +package_group( + name = "pkg_kubectl_util_CONSUMERS", + packages = [ + "//pkg/kubectl", + "//pkg/kubectl/cmd", + ], +) + # Added by ./hack/verify-bazel.sh; should be excluded from # that script since it makes no sense here. filegroup( diff --git a/pkg/api/helper/BUILD b/pkg/api/helper/BUILD index 9424c75941..546c4c7365 100644 --- a/pkg/api/helper/BUILD +++ b/pkg/api/helper/BUILD @@ -31,7 +31,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/conversion: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/apimachinery/pkg/selection:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], diff --git a/pkg/api/helper/helpers.go b/pkg/api/helper/helpers.go index ddf44ea783..6dafe95701 100644 --- a/pkg/api/helper/helpers.go +++ b/pkg/api/helper/helpers.go @@ -17,18 +17,15 @@ limitations under the License. package helper import ( - "crypto/md5" "encoding/json" "fmt" "strings" - "time" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/pkg/api" @@ -262,14 +259,6 @@ func AddToNodeAddresses(addresses *[]api.NodeAddress, addAddresses ...api.NodeAd } } -func HashObject(obj runtime.Object, codec runtime.Codec) (string, error) { - data, err := runtime.Encode(codec, obj) - if err != nil { - return "", err - } - return fmt.Sprintf("%x", md5.Sum(data)), nil -} - // TODO: make method on LoadBalancerStatus? func LoadBalancerStatusEqual(l, r *api.LoadBalancerStatus) bool { return ingressSliceEqual(l.Ingress, r.Ingress) @@ -362,18 +351,6 @@ func containsAccessMode(modes []api.PersistentVolumeAccessMode, mode api.Persist return false } -// ParseRFC3339 parses an RFC3339 date in either RFC3339Nano or RFC3339 format. -func ParseRFC3339(s string, nowFn func() metav1.Time) (metav1.Time, error) { - if t, timeErr := time.Parse(time.RFC3339Nano, s); timeErr == nil { - return metav1.Time{Time: t}, nil - } - t, err := time.Parse(time.RFC3339, s) - if err != nil { - return metav1.Time{}, err - } - return metav1.Time{Time: t}, nil -} - // NodeSelectorRequirementsAsSelector converts the []NodeSelectorRequirement api type into a struct that implements // labels.Selector. func NodeSelectorRequirementsAsSelector(nsm []api.NodeSelectorRequirement) (labels.Selector, error) { diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index afd5379b8e..c008aa5623 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -52,7 +52,6 @@ go_library( deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//pkg/api:go_default_library", - "//pkg/api/helper:go_default_library", "//pkg/api/util:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/api/v1/pod:go_default_library", @@ -80,6 +79,7 @@ go_library( "//pkg/controller/deployment/util:go_default_library", "//pkg/credentialprovider:go_default_library", "//pkg/kubectl/resource:go_default_library", + "//pkg/kubectl/util:go_default_library", "//pkg/printers:go_default_library", "//pkg/printers/internalversion:go_default_library", "//pkg/util:go_default_library", @@ -142,7 +142,6 @@ go_test( deps = [ "//federation/apis/federation/v1beta1:go_default_library", "//pkg/api:go_default_library", - "//pkg/api/helper:go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", "//pkg/api/v1:go_default_library", @@ -159,6 +158,7 @@ go_test( "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion:go_default_library", "//pkg/controller/deployment/util:go_default_library", + "//pkg/kubectl/util:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", @@ -193,6 +193,7 @@ filegroup( "//pkg/kubectl/plugins:all-srcs", "//pkg/kubectl/resource:all-srcs", "//pkg/kubectl/testing:all-srcs", + "//pkg/kubectl/util:all-srcs", ], tags = ["automanaged"], visibility = [ diff --git a/pkg/kubectl/cmd/BUILD b/pkg/kubectl/cmd/BUILD index f832fd844c..f220998f16 100644 --- a/pkg/kubectl/cmd/BUILD +++ b/pkg/kubectl/cmd/BUILD @@ -69,7 +69,6 @@ go_library( ], deps = [ "//pkg/api:go_default_library", - "//pkg/api/helper:go_default_library", "//pkg/api/v1:go_default_library", "//pkg/api/v1/helper:go_default_library", "//pkg/api/validation:go_default_library", @@ -95,6 +94,7 @@ go_library( "//pkg/kubectl/metricsutil:go_default_library", "//pkg/kubectl/plugins:go_default_library", "//pkg/kubectl/resource:go_default_library", + "//pkg/kubectl/util:go_default_library", "//pkg/kubelet/types:go_default_library", "//pkg/printers:go_default_library", "//pkg/printers/internalversion:go_default_library", diff --git a/pkg/kubectl/cmd/logs.go b/pkg/kubectl/cmd/logs.go index 4d7ec64b30..3f06f03e55 100644 --- a/pkg/kubectl/cmd/logs.go +++ b/pkg/kubectl/cmd/logs.go @@ -29,11 +29,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/helper" "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/util/i18n" ) @@ -158,7 +158,7 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm Timestamps: cmdutil.GetFlagBool(cmd, "timestamps"), } if sinceTime := cmdutil.GetFlagString(cmd, "since-time"); len(sinceTime) > 0 { - t, err := helper.ParseRFC3339(sinceTime, metav1.Now) + t, err := util.ParseRFC3339(sinceTime, metav1.Now) if err != nil { return err } diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index 4ec53cbdee..849ee221b9 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -32,12 +32,12 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/helper" "k8s.io/kubernetes/pkg/api/v1" "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/resource" + "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/util/i18n" ) @@ -278,7 +278,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args } // Update the existing replication controller with pointers to the 'next' controller // and adding the label if necessary to distinguish it from the 'next' controller. - oldHash, err := helper.HashObject(oldRc, codec) + oldHash, err := util.HashObject(oldRc, codec) if err != nil { return err } diff --git a/pkg/kubectl/rolling_updater.go b/pkg/kubectl/rolling_updater.go index 099ee105f9..bea9b96ee5 100644 --- a/pkg/kubectl/rolling_updater.go +++ b/pkg/kubectl/rolling_updater.go @@ -32,13 +32,13 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/integer" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/helper" "k8s.io/kubernetes/pkg/api/v1" podutil "k8s.io/kubernetes/pkg/api/v1/pod" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" "k8s.io/kubernetes/pkg/client/retry" client "k8s.io/kubernetes/pkg/client/unversioned" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" + "k8s.io/kubernetes/pkg/kubectl/util" ) const ( @@ -627,7 +627,7 @@ func CreateNewControllerFromCurrentController(rcClient coreclient.ReplicationCon newRc.Spec.Template.Spec.Containers[containerIndex].ImagePullPolicy = cfg.PullPolicy } - newHash, err := helper.HashObject(newRc, codec) + newHash, err := util.HashObject(newRc, codec) if err != nil { return nil, err } diff --git a/pkg/kubectl/rolling_updater_test.go b/pkg/kubectl/rolling_updater_test.go index 0ec460c405..922104a3c9 100644 --- a/pkg/kubectl/rolling_updater_test.go +++ b/pkg/kubectl/rolling_updater_test.go @@ -37,11 +37,11 @@ import ( manualfake "k8s.io/client-go/rest/fake" testcore "k8s.io/client-go/testing" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/helper" "k8s.io/kubernetes/pkg/api/testapi" apitesting "k8s.io/kubernetes/pkg/api/testing" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" + "k8s.io/kubernetes/pkg/kubectl/util" ) func oldRc(replicas int, original int) *api.ReplicationController { @@ -1077,7 +1077,7 @@ func TestRollingUpdater_multipleContainersInPod(t *testing.T) { codec := testapi.Default.Codec() - deploymentHash, err := helper.HashObject(test.newRc, codec) + deploymentHash, err := util.HashObject(test.newRc, codec) if err != nil { t.Errorf("unexpected error: %v", err) } diff --git a/pkg/kubectl/util/BUILD b/pkg/kubectl/util/BUILD new file mode 100644 index 0000000000..f4113db90f --- /dev/null +++ b/pkg/kubectl/util/BUILD @@ -0,0 +1,31 @@ +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["util.go"], + tags = ["automanaged"], + visibility = ["//build/visible_to:pkg_kubectl_util_CONSUMERS"], + deps = [ + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//build/visible_to:pkg_kubectl_util_CONSUMERS"], +) diff --git a/pkg/kubectl/util/util.go b/pkg/kubectl/util/util.go new file mode 100644 index 0000000000..7b6eeff81f --- /dev/null +++ b/pkg/kubectl/util/util.go @@ -0,0 +1,46 @@ +/* +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 util + +import ( + "crypto/md5" + "fmt" + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +// ParseRFC3339 parses an RFC3339 date in either RFC3339Nano or RFC3339 format. +func ParseRFC3339(s string, nowFn func() metav1.Time) (metav1.Time, error) { + if t, timeErr := time.Parse(time.RFC3339Nano, s); timeErr == nil { + return metav1.Time{Time: t}, nil + } + t, err := time.Parse(time.RFC3339, s) + if err != nil { + return metav1.Time{}, err + } + return metav1.Time{Time: t}, nil +} + +func HashObject(obj runtime.Object, codec runtime.Codec) (string, error) { + data, err := runtime.Encode(codec, obj) + if err != nil { + return "", err + } + return fmt.Sprintf("%x", md5.Sum(data)), nil +} diff --git a/staging/src/k8s.io/client-go/Godeps/Godeps.json b/staging/src/k8s.io/client-go/Godeps/Godeps.json index 884b82a9f1..45c6c593ca 100644 --- a/staging/src/k8s.io/client-go/Godeps/Godeps.json +++ b/staging/src/k8s.io/client-go/Godeps/Godeps.json @@ -1,6 +1,6 @@ { "ImportPath": "k8s.io/client-go", - "GoVersion": "go1.8", + "GoVersion": "go1.7", "GodepVersion": "v79", "Packages": [ "./..." diff --git a/staging/src/k8s.io/client-go/pkg/api/helper/BUILD b/staging/src/k8s.io/client-go/pkg/api/helper/BUILD index 0fd3da5a50..80f9cc2c19 100644 --- a/staging/src/k8s.io/client-go/pkg/api/helper/BUILD +++ b/staging/src/k8s.io/client-go/pkg/api/helper/BUILD @@ -19,7 +19,6 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/conversion: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/apimachinery/pkg/selection:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/client-go/pkg/api:go_default_library", diff --git a/staging/src/k8s.io/client-go/pkg/api/helper/helpers.go b/staging/src/k8s.io/client-go/pkg/api/helper/helpers.go index 073890b7a9..2ad686071c 100644 --- a/staging/src/k8s.io/client-go/pkg/api/helper/helpers.go +++ b/staging/src/k8s.io/client-go/pkg/api/helper/helpers.go @@ -17,18 +17,15 @@ limitations under the License. package helper import ( - "crypto/md5" "encoding/json" "fmt" "strings" - "time" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/pkg/api" @@ -262,14 +259,6 @@ func AddToNodeAddresses(addresses *[]api.NodeAddress, addAddresses ...api.NodeAd } } -func HashObject(obj runtime.Object, codec runtime.Codec) (string, error) { - data, err := runtime.Encode(codec, obj) - if err != nil { - return "", err - } - return fmt.Sprintf("%x", md5.Sum(data)), nil -} - // TODO: make method on LoadBalancerStatus? func LoadBalancerStatusEqual(l, r *api.LoadBalancerStatus) bool { return ingressSliceEqual(l.Ingress, r.Ingress) @@ -362,18 +351,6 @@ func containsAccessMode(modes []api.PersistentVolumeAccessMode, mode api.Persist return false } -// ParseRFC3339 parses an RFC3339 date in either RFC3339Nano or RFC3339 format. -func ParseRFC3339(s string, nowFn func() metav1.Time) (metav1.Time, error) { - if t, timeErr := time.Parse(time.RFC3339Nano, s); timeErr == nil { - return metav1.Time{Time: t}, nil - } - t, err := time.Parse(time.RFC3339, s) - if err != nil { - return metav1.Time{}, err - } - return metav1.Time{Time: t}, nil -} - // NodeSelectorRequirementsAsSelector converts the []NodeSelectorRequirement api type into a struct that implements // labels.Selector. func NodeSelectorRequirementsAsSelector(nsm []api.NodeSelectorRequirement) (labels.Selector, error) {