diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 63ac6de5c9..32cf504a3c 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -4135,6 +4135,10 @@ "ImportPath": "k8s.io/utils/keymutex", "Rev": "ed37f7428a91fc2a81070808937195dcd46d320e" }, + { + "ImportPath": "k8s.io/utils/net", + "Rev": "ed37f7428a91fc2a81070808937195dcd46d320e" + }, { "ImportPath": "k8s.io/utils/nsenter", "Rev": "ed37f7428a91fc2a81070808937195dcd46d320e" diff --git a/Godeps/LICENSES b/Godeps/LICENSES index 97aeff79d4..88d6c73df8 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -117252,6 +117252,216 @@ third-party archives. ================================================================================ +================================================================================ += vendor/k8s.io/utils/net licensed under: = + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + += vendor/k8s.io/utils/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 +================================================================================ + + ================================================================================ = vendor/k8s.io/utils/nsenter licensed under: = diff --git a/cmd/kubeadm/.import-restrictions b/cmd/kubeadm/.import-restrictions index 797fdbaa4f..ccb06bb399 100644 --- a/cmd/kubeadm/.import-restrictions +++ b/cmd/kubeadm/.import-restrictions @@ -42,7 +42,8 @@ "k8s.io/utils/exec", "k8s.io/utils/integer", "k8s.io/utils/path", - "k8s.io/utils/pointer" + "k8s.io/utils/pointer", + "k8s.io/utils/net" ] }, { @@ -82,7 +83,6 @@ "k8s.io/kubernetes/pkg/util/initsystem", "k8s.io/kubernetes/pkg/util/ipvs", "k8s.io/kubernetes/pkg/util/metrics", - "k8s.io/kubernetes/pkg/util/net/sets", "k8s.io/kubernetes/pkg/util/node", "k8s.io/kubernetes/pkg/util/normalizer", "k8s.io/kubernetes/pkg/util/parsers", diff --git a/pkg/api/service/BUILD b/pkg/api/service/BUILD index e66d9bbc17..d28572faf1 100644 --- a/pkg/api/service/BUILD +++ b/pkg/api/service/BUILD @@ -12,7 +12,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/api/service", deps = [ "//pkg/apis/core:go_default_library", - "//pkg/util/net/sets:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) @@ -22,7 +22,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//pkg/util/net/sets:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/api/service/util.go b/pkg/api/service/util.go index 5de5f27657..a4262edad2 100644 --- a/pkg/api/service/util.go +++ b/pkg/api/service/util.go @@ -18,17 +18,18 @@ package service import ( "fmt" - api "k8s.io/kubernetes/pkg/apis/core" - netsets "k8s.io/kubernetes/pkg/util/net/sets" "strings" + + api "k8s.io/kubernetes/pkg/apis/core" + utilnet "k8s.io/utils/net" ) const ( defaultLoadBalancerSourceRanges = "0.0.0.0/0" ) -// IsAllowAll checks whether the netsets.IPNet allows traffic from 0.0.0.0/0 -func IsAllowAll(ipnets netsets.IPNet) bool { +// IsAllowAll checks whether the utilnet.IPNet allows traffic from 0.0.0.0/0 +func IsAllowAll(ipnets utilnet.IPNetSet) bool { for _, s := range ipnets.StringSlice() { if s == "0.0.0.0/0" { return true @@ -40,13 +41,13 @@ func IsAllowAll(ipnets netsets.IPNet) bool { // GetLoadBalancerSourceRanges first try to parse and verify LoadBalancerSourceRanges field from a service. // If the field is not specified, turn to parse and verify the AnnotationLoadBalancerSourceRangesKey annotation from a service, // extracting the source ranges to allow, and if not present returns a default (allow-all) value. -func GetLoadBalancerSourceRanges(service *api.Service) (netsets.IPNet, error) { - var ipnets netsets.IPNet +func GetLoadBalancerSourceRanges(service *api.Service) (utilnet.IPNetSet, error) { + var ipnets utilnet.IPNetSet var err error // if SourceRange field is specified, ignore sourceRange annotation if len(service.Spec.LoadBalancerSourceRanges) > 0 { specs := service.Spec.LoadBalancerSourceRanges - ipnets, err = netsets.ParseIPNets(specs...) + ipnets, err = utilnet.ParseIPNets(specs...) if err != nil { return nil, fmt.Errorf("service.Spec.LoadBalancerSourceRanges: %v is not valid. Expecting a list of IP ranges. For example, 10.0.0.0/24. Error msg: %v", specs, err) @@ -58,7 +59,7 @@ func GetLoadBalancerSourceRanges(service *api.Service) (netsets.IPNet, error) { val = defaultLoadBalancerSourceRanges } specs := strings.Split(val, ",") - ipnets, err = netsets.ParseIPNets(specs...) + ipnets, err = utilnet.ParseIPNets(specs...) if err != nil { return nil, fmt.Errorf("%s: %s is not valid. Expecting a comma-separated list of source IP ranges. For example, 10.0.0.0/24,192.168.2.0/24", api.AnnotationLoadBalancerSourceRangesKey, val) } diff --git a/pkg/api/service/util_test.go b/pkg/api/service/util_test.go index 5fb31f7b5d..81207046ac 100644 --- a/pkg/api/service/util_test.go +++ b/pkg/api/service/util_test.go @@ -21,7 +21,7 @@ import ( "testing" api "k8s.io/kubernetes/pkg/apis/core" - netsets "k8s.io/kubernetes/pkg/util/net/sets" + utilnet "k8s.io/utils/net" ) func TestGetLoadBalancerSourceRanges(t *testing.T) { @@ -48,7 +48,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { checkError("10.0.0.1/32, ") checkError("10.0.0.1") - checkOK := func(v string) netsets.IPNet { + checkOK := func(v string) utilnet.IPNetSet { annotations := make(map[string]string) annotations[api.AnnotationLoadBalancerSourceRangesKey] = v svc := api.Service{} @@ -112,7 +112,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { func TestAllowAll(t *testing.T) { checkAllowAll := func(allowAll bool, cidrs ...string) { - ipnets, err := netsets.ParseIPNets(cidrs...) + ipnets, err := utilnet.ParseIPNets(cidrs...) if err != nil { t.Errorf("Unexpected error parsing cidrs: %v", cidrs) } diff --git a/pkg/api/v1/service/BUILD b/pkg/api/v1/service/BUILD index a324d7cc82..5a16fca24d 100644 --- a/pkg/api/v1/service/BUILD +++ b/pkg/api/v1/service/BUILD @@ -11,8 +11,8 @@ go_library( srcs = ["util.go"], importpath = "k8s.io/kubernetes/pkg/api/v1/service", deps = [ - "//pkg/util/net/sets:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) @@ -21,8 +21,8 @@ go_test( srcs = ["util_test.go"], embed = [":go_default_library"], deps = [ - "//pkg/util/net/sets:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/api/v1/service/util.go b/pkg/api/v1/service/util.go index 4cb453cf3e..d1c6713888 100644 --- a/pkg/api/v1/service/util.go +++ b/pkg/api/v1/service/util.go @@ -21,15 +21,15 @@ import ( "strings" "k8s.io/api/core/v1" - netsets "k8s.io/kubernetes/pkg/util/net/sets" + utilnet "k8s.io/utils/net" ) const ( defaultLoadBalancerSourceRanges = "0.0.0.0/0" ) -// IsAllowAll checks whether the netsets.IPNet allows traffic from 0.0.0.0/0 -func IsAllowAll(ipnets netsets.IPNet) bool { +// IsAllowAll checks whether the utilnet.IPNet allows traffic from 0.0.0.0/0 +func IsAllowAll(ipnets utilnet.IPNetSet) bool { for _, s := range ipnets.StringSlice() { if s == "0.0.0.0/0" { return true @@ -41,13 +41,13 @@ func IsAllowAll(ipnets netsets.IPNet) bool { // GetLoadBalancerSourceRanges first try to parse and verify LoadBalancerSourceRanges field from a service. // If the field is not specified, turn to parse and verify the AnnotationLoadBalancerSourceRangesKey annotation from a service, // extracting the source ranges to allow, and if not present returns a default (allow-all) value. -func GetLoadBalancerSourceRanges(service *v1.Service) (netsets.IPNet, error) { - var ipnets netsets.IPNet +func GetLoadBalancerSourceRanges(service *v1.Service) (utilnet.IPNetSet, error) { + var ipnets utilnet.IPNetSet var err error // if SourceRange field is specified, ignore sourceRange annotation if len(service.Spec.LoadBalancerSourceRanges) > 0 { specs := service.Spec.LoadBalancerSourceRanges - ipnets, err = netsets.ParseIPNets(specs...) + ipnets, err = utilnet.ParseIPNets(specs...) if err != nil { return nil, fmt.Errorf("service.Spec.LoadBalancerSourceRanges: %v is not valid. Expecting a list of IP ranges. For example, 10.0.0.0/24. Error msg: %v", specs, err) @@ -59,7 +59,7 @@ func GetLoadBalancerSourceRanges(service *v1.Service) (netsets.IPNet, error) { val = defaultLoadBalancerSourceRanges } specs := strings.Split(val, ",") - ipnets, err = netsets.ParseIPNets(specs...) + ipnets, err = utilnet.ParseIPNets(specs...) if err != nil { return nil, fmt.Errorf("%s: %s is not valid. Expecting a comma-separated list of source IP ranges. For example, 10.0.0.0/24,192.168.2.0/24", v1.AnnotationLoadBalancerSourceRangesKey, val) } diff --git a/pkg/api/v1/service/util_test.go b/pkg/api/v1/service/util_test.go index 90b93f129d..04c94187b8 100644 --- a/pkg/api/v1/service/util_test.go +++ b/pkg/api/v1/service/util_test.go @@ -21,7 +21,7 @@ import ( "testing" "k8s.io/api/core/v1" - netsets "k8s.io/kubernetes/pkg/util/net/sets" + utilnet "k8s.io/utils/net" ) func TestGetLoadBalancerSourceRanges(t *testing.T) { @@ -48,7 +48,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { checkError("10.0.0.1/32, ") checkError("10.0.0.1") - checkOK := func(v string) netsets.IPNet { + checkOK := func(v string) utilnet.IPNetSet { annotations := make(map[string]string) annotations[v1.AnnotationLoadBalancerSourceRangesKey] = v svc := v1.Service{} @@ -112,7 +112,7 @@ func TestGetLoadBalancerSourceRanges(t *testing.T) { func TestAllowAll(t *testing.T) { checkAllowAll := func(allowAll bool, cidrs ...string) { - ipnets, err := netsets.ParseIPNets(cidrs...) + ipnets, err := utilnet.ParseIPNets(cidrs...) if err != nil { t.Errorf("Unexpected error parsing cidrs: %v", cidrs) } diff --git a/pkg/cloudprovider/providers/.import-restrictions b/pkg/cloudprovider/providers/.import-restrictions index 8fd5202e95..49ebc880fb 100644 --- a/pkg/cloudprovider/providers/.import-restrictions +++ b/pkg/cloudprovider/providers/.import-restrictions @@ -1,25 +1,34 @@ { "Rules": [ - { - "SelectorRegexp": "k8s[.]io/kubernetes", - "AllowedPrefixes": [ - "k8s.io/kubernetes/pkg/api/legacyscheme", - "k8s.io/kubernetes/pkg/api/service", - "k8s.io/kubernetes/pkg/api/v1/service", - "k8s.io/kubernetes/pkg/apis/core", - "k8s.io/kubernetes/pkg/cloudprovider", - "k8s.io/kubernetes/pkg/credentialprovider", - "k8s.io/kubernetes/pkg/features", - "k8s.io/kubernetes/pkg/kubelet/apis", - "k8s.io/kubernetes/pkg/master/ports", - "k8s.io/kubernetes/pkg/util/mount", - "k8s.io/kubernetes/pkg/util/net/sets", - "k8s.io/kubernetes/pkg/util/resizefs", - "k8s.io/kubernetes/pkg/version", - "k8s.io/kubernetes/pkg/volume" - ], - "ForbiddenPrefixes": [ - ] - } + { + "SelectorRegexp": "k8s[.]io/utils", + "AllowedPrefixes": [ + "k8s.io/utils/net", + "k8s.io/utils/nsenter", + "k8s.io/utils/io", + "k8s.io/utils/strings", + "k8s.io/utils/exec", + "k8s.io/utils/path" + ] + }, + { + "SelectorRegexp": "k8s[.]io/kubernetes", + "AllowedPrefixes": [ + "k8s.io/kubernetes/pkg/api/legacyscheme", + "k8s.io/kubernetes/pkg/api/service", + "k8s.io/kubernetes/pkg/api/v1/service", + "k8s.io/kubernetes/pkg/apis/core", + "k8s.io/kubernetes/pkg/cloudprovider", + "k8s.io/kubernetes/pkg/credentialprovider", + "k8s.io/kubernetes/pkg/features", + "k8s.io/kubernetes/pkg/kubelet/apis", + "k8s.io/kubernetes/pkg/master/ports", + "k8s.io/kubernetes/pkg/util/mount", + "k8s.io/kubernetes/pkg/util/resizefs", + "k8s.io/kubernetes/pkg/version", + "k8s.io/kubernetes/pkg/volume" + ], + "ForbiddenPrefixes": [] + } ] -} +} \ No newline at end of file diff --git a/pkg/cloudprovider/providers/gce/BUILD b/pkg/cloudprovider/providers/gce/BUILD index 3c98c175ae..89d0be136c 100644 --- a/pkg/cloudprovider/providers/gce/BUILD +++ b/pkg/cloudprovider/providers/gce/BUILD @@ -48,7 +48,6 @@ go_library( deps = [ "//pkg/api/v1/service:go_default_library", "//pkg/kubelet/apis:go_default_library", - "//pkg/util/net/sets:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", @@ -89,6 +88,7 @@ go_library( "//vendor/google.golang.org/api/tpu/v1:go_default_library", "//vendor/gopkg.in/gcfg.v1:go_default_library", "//vendor/k8s.io/klog:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) @@ -111,7 +111,6 @@ go_test( deps = [ "//pkg/api/v1/service:go_default_library", "//pkg/kubelet/apis:go_default_library", - "//pkg/util/net/sets:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", @@ -128,6 +127,7 @@ go_test( "//vendor/google.golang.org/api/compute/v0.beta:go_default_library", "//vendor/google.golang.org/api/compute/v1:go_default_library", "//vendor/google.golang.org/api/googleapi:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go index 5c9dbb027e..7bc1ea1d1e 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go @@ -24,16 +24,16 @@ import ( "sort" "strings" + "k8s.io/api/core/v1" "k8s.io/klog" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud" - "k8s.io/api/core/v1" cloudprovider "k8s.io/cloud-provider" - netsets "k8s.io/kubernetes/pkg/util/net/sets" + utilnet "k8s.io/utils/net" ) type cidrs struct { - ipn netsets.IPNet + ipn utilnet.IPNetSet isSet bool } @@ -44,7 +44,7 @@ var ( func init() { var err error // LB L7 proxies and all L3/4/7 health checkers have client addresses within these known CIDRs. - lbSrcRngsFlag.ipn, err = netsets.ParseIPNets([]string{"130.211.0.0/22", "35.191.0.0/16", "209.85.152.0/22", "209.85.204.0/22"}...) + lbSrcRngsFlag.ipn, err = utilnet.ParseIPNets([]string{"130.211.0.0/22", "35.191.0.0/16", "209.85.152.0/22", "209.85.204.0/22"}...) if err != nil { panic("Incorrect default GCE L7 source ranges") } @@ -64,7 +64,7 @@ func (c *cidrs) Set(value string) error { // On first Set(), clear the original defaults if !c.isSet { c.isSet = true - c.ipn = make(netsets.IPNet) + c.ipn = make(utilnet.IPNetSet) } else { return fmt.Errorf("GCE LB CIDRs have already been set") } diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go index 5606467586..6687a9d41b 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external.go @@ -29,7 +29,7 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" apiservice "k8s.io/kubernetes/pkg/api/v1/service" - netsets "k8s.io/kubernetes/pkg/util/net/sets" + utilnet "k8s.io/utils/net" computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" @@ -819,7 +819,7 @@ func translateAffinityType(affinityType v1.ServiceAffinity) string { } } -func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, ports []v1.ServicePort, sourceRanges netsets.IPNet) (exists bool, needsUpdate bool, err error) { +func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, ports []v1.ServicePort, sourceRanges utilnet.IPNetSet) (exists bool, needsUpdate bool, err error) { fw, err := g.GetFirewall(MakeFirewallName(name)) if err != nil { if isHTTPErrorCode(err, http.StatusNotFound) { @@ -843,7 +843,7 @@ func (g *Cloud) firewallNeedsUpdate(name, serviceName, region, ipAddress string, } // The service controller already verified that the protocol matches on all ports, no need to check. - actualSourceRanges, err := netsets.ParseIPNets(fw.SourceRanges...) + actualSourceRanges, err := utilnet.ParseIPNets(fw.SourceRanges...) if err != nil { // This really shouldn't happen... GCE has returned something unexpected klog.Warningf("Error parsing firewall SourceRanges: %v", fw.SourceRanges) @@ -934,7 +934,7 @@ func createForwardingRule(s CloudForwardingRuleService, name, serviceName, regio return nil } -func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourceRanges netsets.IPNet, ports []v1.ServicePort, hosts []*gceInstance) error { +func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error { firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts) if err != nil { return err @@ -952,7 +952,7 @@ func (g *Cloud) createFirewall(svc *v1.Service, name, region, desc string, sourc return nil } -func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourceRanges netsets.IPNet, ports []v1.ServicePort, hosts []*gceInstance) error { +func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) error { firewall, err := g.firewallObject(name, region, desc, sourceRanges, ports, hosts) if err != nil { return err @@ -971,7 +971,7 @@ func (g *Cloud) updateFirewall(svc *v1.Service, name, region, desc string, sourc return nil } -func (g *Cloud) firewallObject(name, region, desc string, sourceRanges netsets.IPNet, ports []v1.ServicePort, hosts []*gceInstance) (*compute.Firewall, error) { +func (g *Cloud) firewallObject(name, region, desc string, sourceRanges utilnet.IPNetSet, ports []v1.ServicePort, hosts []*gceInstance) (*compute.Firewall, error) { allowedPorts := make([]string, len(ports)) for ix := range ports { allowedPorts[ix] = strconv.Itoa(int(ports[ix].Port)) diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go index cc5c90cae6..ca0c1e4356 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go @@ -34,7 +34,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" - netsets "k8s.io/kubernetes/pkg/util/net/sets" + utilnet "k8s.io/utils/net" ) func TestEnsureStaticIP(t *testing.T) { @@ -620,10 +620,10 @@ func TestFirewallNeedsUpdate(t *testing.T) { ipAddr := status.Ingress[0].IP lbName := gce.GetLoadBalancerName(context.TODO(), "", svc) - ipnet, err := netsets.ParseIPNets("0.0.0.0/0") + ipnet, err := utilnet.ParseIPNets("0.0.0.0/0") require.NoError(t, err) - wrongIpnet, err := netsets.ParseIPNets("1.0.0.0/10") + wrongIpnet, err := utilnet.ParseIPNets("1.0.0.0/10") require.NoError(t, err) fw, err := gce.GetFirewall(MakeFirewallName(lbName)) @@ -633,7 +633,7 @@ func TestFirewallNeedsUpdate(t *testing.T) { lbName string ipAddr string ports []v1.ServicePort - ipnet netsets.IPNet + ipnet utilnet.IPNetSet fwIPProtocol string getHook func(context.Context, *meta.Key, *cloud.MockFirewalls) (bool, *ga.Firewall, error) sourceRange string @@ -864,7 +864,7 @@ func TestCreateAndUpdateFirewallSucceedsOnXPN(t *testing.T) { hostNames := nodeNames(nodes) hosts, err := gce.getInstancesByNames(hostNames) require.NoError(t, err) - ipnet, err := netsets.ParseIPNets("10.0.0.0/20") + ipnet, err := utilnet.ParseIPNets("10.0.0.0/20") require.NoError(t, err) gce.createFirewall( svc, diff --git a/pkg/controller/.import-restrictions b/pkg/controller/.import-restrictions index caf6ab74f0..403dc4115a 100644 --- a/pkg/controller/.import-restrictions +++ b/pkg/controller/.import-restrictions @@ -307,7 +307,6 @@ "k8s.io/kubernetes/pkg/scheduler/api", "k8s.io/kubernetes/pkg/scheduler/util", "k8s.io/kubernetes/pkg/security/apparmor", - "k8s.io/kubernetes/pkg/util/net/sets", "k8s.io/kubernetes/pkg/util/parsers", "k8s.io/kubernetes/pkg/fieldpath", "k8s.io/kubernetes/pkg/scheduler/volumebinder", @@ -342,7 +341,8 @@ "k8s.io/utils/path", "k8s.io/utils/pointer", "k8s.io/utils/exec", - "k8s.io/utils/strings" + "k8s.io/utils/strings", + "k8s.io/utils/net" ] }, { diff --git a/pkg/kubectl/.import-restrictions b/pkg/kubectl/.import-restrictions index cf4ac57da4..880029a178 100644 --- a/pkg/kubectl/.import-restrictions +++ b/pkg/kubectl/.import-restrictions @@ -132,7 +132,6 @@ "k8s.io/kubernetes/pkg/util/labels", "k8s.io/kubernetes/pkg/util/metrics", "k8s.io/kubernetes/pkg/util/mount", - "k8s.io/kubernetes/pkg/util/net/sets", "k8s.io/kubernetes/pkg/util/node", "k8s.io/kubernetes/pkg/util/parsers", "k8s.io/kubernetes/pkg/util/slice", @@ -144,7 +143,8 @@ "k8s.io/utils/nsenter", "k8s.io/utils/io", "k8s.io/utils/path", - "k8s.io/utils/pointer" + "k8s.io/utils/pointer", + "k8s.io/utils/net" ], "ForbiddenPrefixes": [] }] diff --git a/pkg/kubelet/dockershim/network/hostport/BUILD b/pkg/kubelet/dockershim/network/hostport/BUILD index cceadb121a..86afb9b03c 100644 --- a/pkg/kubelet/dockershim/network/hostport/BUILD +++ b/pkg/kubelet/dockershim/network/hostport/BUILD @@ -19,12 +19,12 @@ go_library( "//pkg/proxy/iptables:go_default_library", "//pkg/util/conntrack:go_default_library", "//pkg/util/iptables:go_default_library", - "//pkg/util/net:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/kubelet/dockershim/network/hostport/hostport_manager.go b/pkg/kubelet/dockershim/network/hostport/hostport_manager.go index ce5108fd31..f210ab5da2 100644 --- a/pkg/kubelet/dockershim/network/hostport/hostport_manager.go +++ b/pkg/kubelet/dockershim/network/hostport/hostport_manager.go @@ -31,8 +31,8 @@ import ( iptablesproxy "k8s.io/kubernetes/pkg/proxy/iptables" "k8s.io/kubernetes/pkg/util/conntrack" utiliptables "k8s.io/kubernetes/pkg/util/iptables" - utilnet "k8s.io/kubernetes/pkg/util/net" "k8s.io/utils/exec" + utilnet "k8s.io/utils/net" ) // HostPortManager is an interface for adding and removing hostport for a given pod sandbox. diff --git a/pkg/proxy/BUILD b/pkg/proxy/BUILD index 43040e6d81..a7969c25c8 100644 --- a/pkg/proxy/BUILD +++ b/pkg/proxy/BUILD @@ -18,12 +18,12 @@ go_library( deps = [ "//pkg/api/v1/service:go_default_library", "//pkg/proxy/util:go_default_library", - "//pkg/util/net:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/klog:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/proxy/endpoints.go b/pkg/proxy/endpoints.go index 067be71d79..c0992b290f 100644 --- a/pkg/proxy/endpoints.go +++ b/pkg/proxy/endpoints.go @@ -29,7 +29,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/tools/record" utilproxy "k8s.io/kubernetes/pkg/proxy/util" - utilnet "k8s.io/kubernetes/pkg/util/net" + utilnet "k8s.io/utils/net" ) // BaseEndpointInfo contains base information that defines an endpoint. diff --git a/pkg/proxy/iptables/BUILD b/pkg/proxy/iptables/BUILD index 2d1794529c..c69ff55892 100644 --- a/pkg/proxy/iptables/BUILD +++ b/pkg/proxy/iptables/BUILD @@ -18,7 +18,6 @@ go_library( "//pkg/util/async:go_default_library", "//pkg/util/conntrack:go_default_library", "//pkg/util/iptables:go_default_library", - "//pkg/util/net:go_default_library", "//pkg/util/sysctl:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", @@ -27,6 +26,7 @@ go_library( "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index 5f85684be3..7caace0933 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -46,9 +46,9 @@ import ( "k8s.io/kubernetes/pkg/util/async" "k8s.io/kubernetes/pkg/util/conntrack" utiliptables "k8s.io/kubernetes/pkg/util/iptables" - utilnet "k8s.io/kubernetes/pkg/util/net" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" utilexec "k8s.io/utils/exec" + utilnet "k8s.io/utils/net" ) const ( @@ -317,7 +317,7 @@ func NewProxier(ipt utiliptables.Interface, if len(clusterCIDR) == 0 { klog.Warning("clusterCIDR not specified, unable to distinguish between internal and external traffic") - } else if utilnet.IsIPv6CIDR(clusterCIDR) != ipt.IsIpv6() { + } else if utilnet.IsIPv6CIDRString(clusterCIDR) != ipt.IsIpv6() { return nil, fmt.Errorf("clusterCIDR %s has incorrect IP version: expect isIPv6=%t", clusterCIDR, ipt.IsIpv6()) } diff --git a/pkg/proxy/ipvs/BUILD b/pkg/proxy/ipvs/BUILD index 002b616f3f..667eacea90 100644 --- a/pkg/proxy/ipvs/BUILD +++ b/pkg/proxy/ipvs/BUILD @@ -55,7 +55,6 @@ go_library( "//pkg/util/ipset:go_default_library", "//pkg/util/iptables:go_default_library", "//pkg/util/ipvs:go_default_library", - "//pkg/util/net:go_default_library", "//pkg/util/sysctl:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", @@ -65,6 +64,7 @@ go_library( "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ "//vendor/github.com/vishvananda/netlink:go_default_library", diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index 1b1af87b70..ab20e70ca4 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -44,9 +44,9 @@ import ( utilipset "k8s.io/kubernetes/pkg/util/ipset" utiliptables "k8s.io/kubernetes/pkg/util/iptables" utilipvs "k8s.io/kubernetes/pkg/util/ipvs" - utilnet "k8s.io/kubernetes/pkg/util/net" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" utilexec "k8s.io/utils/exec" + utilnet "k8s.io/utils/net" ) const ( @@ -373,7 +373,7 @@ func NewProxier(ipt utiliptables.Interface, if len(clusterCIDR) == 0 { klog.Warningf("clusterCIDR not specified, unable to distinguish between internal and external traffic") - } else if utilnet.IsIPv6CIDR(clusterCIDR) != isIPv6 { + } else if utilnet.IsIPv6CIDRString(clusterCIDR) != isIPv6 { return nil, fmt.Errorf("clusterCIDR %s has incorrect IP version: expect isIPv6=%t", clusterCIDR, isIPv6) } diff --git a/pkg/proxy/service.go b/pkg/proxy/service.go index 307c3d1b3b..7de51df1ae 100644 --- a/pkg/proxy/service.go +++ b/pkg/proxy/service.go @@ -31,7 +31,7 @@ import ( "k8s.io/client-go/tools/record" apiservice "k8s.io/kubernetes/pkg/api/v1/service" utilproxy "k8s.io/kubernetes/pkg/proxy/util" - utilnet "k8s.io/kubernetes/pkg/util/net" + utilnet "k8s.io/utils/net" ) // BaseServiceInfo contains base information that defines a service. @@ -111,11 +111,11 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic // If ExternalIPs and LoadBalancerSourceRanges on service contains incorrect IP versions, // only filter out the incorrect ones. var incorrectIPs []string - info.ExternalIPs, incorrectIPs = utilnet.FilterIncorrectIPVersion(service.Spec.ExternalIPs, *sct.isIPv6Mode) + info.ExternalIPs, incorrectIPs = utilproxy.FilterIncorrectIPVersion(service.Spec.ExternalIPs, *sct.isIPv6Mode) if len(incorrectIPs) > 0 { utilproxy.LogAndEmitIncorrectIPVersionEvent(sct.recorder, "externalIPs", strings.Join(incorrectIPs, ","), service.Namespace, service.Name, service.UID) } - info.LoadBalancerSourceRanges, incorrectIPs = utilnet.FilterIncorrectCIDRVersion(service.Spec.LoadBalancerSourceRanges, *sct.isIPv6Mode) + info.LoadBalancerSourceRanges, incorrectIPs = utilproxy.FilterIncorrectCIDRVersion(service.Spec.LoadBalancerSourceRanges, *sct.isIPv6Mode) if len(incorrectIPs) > 0 { utilproxy.LogAndEmitIncorrectIPVersionEvent(sct.recorder, "loadBalancerSourceRanges", strings.Join(incorrectIPs, ","), service.Namespace, service.Name, service.UID) } diff --git a/pkg/proxy/util/BUILD b/pkg/proxy/util/BUILD index fbbb01b18e..f53b3a1cbb 100644 --- a/pkg/proxy/util/BUILD +++ b/pkg/proxy/util/BUILD @@ -12,12 +12,12 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/util/net:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/klog:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/proxy/util/utils.go b/pkg/proxy/util/utils.go index 2c1408da43..c513d26a5a 100644 --- a/pkg/proxy/util/utils.go +++ b/pkg/proxy/util/utils.go @@ -27,7 +27,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/tools/record" helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" - utilnet "k8s.io/kubernetes/pkg/util/net" + utilnet "k8s.io/utils/net" "k8s.io/klog" ) @@ -192,3 +192,25 @@ func LogAndEmitIncorrectIPVersionEvent(recorder record.EventRecorder, fieldName, }, v1.EventTypeWarning, "KubeProxyIncorrectIPVersion", errMsg) } } + +// FilterIncorrectIPVersion filters out the incorrect IP version case from a slice of IP strings. +func FilterIncorrectIPVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) { + return filterWithCondition(ipStrings, isIPv6Mode, utilnet.IsIPv6String) +} + +// FilterIncorrectCIDRVersion filters out the incorrect IP version case from a slice of CIDR strings. +func FilterIncorrectCIDRVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) { + return filterWithCondition(ipStrings, isIPv6Mode, utilnet.IsIPv6CIDRString) +} + +func filterWithCondition(strs []string, expectedCondition bool, conditionFunc func(string) bool) ([]string, []string) { + var corrects, incorrects []string + for _, str := range strs { + if conditionFunc(str) != expectedCondition { + incorrects = append(incorrects, str) + } else { + corrects = append(corrects, str) + } + } + return corrects, incorrects +} diff --git a/pkg/util/BUILD b/pkg/util/BUILD index 77bb1f119a..b52c95b50a 100644 --- a/pkg/util/BUILD +++ b/pkg/util/BUILD @@ -35,7 +35,6 @@ filegroup( "//pkg/util/maps:all-srcs", "//pkg/util/metrics:all-srcs", "//pkg/util/mount:all-srcs", - "//pkg/util/net:all-srcs", "//pkg/util/netsh:all-srcs", "//pkg/util/node:all-srcs", "//pkg/util/normalizer:all-srcs", diff --git a/pkg/util/conntrack/BUILD b/pkg/util/conntrack/BUILD index e078a914fc..958fba489a 100644 --- a/pkg/util/conntrack/BUILD +++ b/pkg/util/conntrack/BUILD @@ -6,9 +6,9 @@ go_library( importpath = "k8s.io/kubernetes/pkg/util/conntrack", visibility = ["//visibility:public"], deps = [ - "//pkg/util/net:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) @@ -17,10 +17,10 @@ go_test( srcs = ["conntrack_test.go"], embed = [":go_default_library"], deps = [ - "//pkg/util/net:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", ], ) diff --git a/pkg/util/conntrack/conntrack.go b/pkg/util/conntrack/conntrack.go index 5569b411dc..06b76edc6d 100644 --- a/pkg/util/conntrack/conntrack.go +++ b/pkg/util/conntrack/conntrack.go @@ -22,8 +22,8 @@ import ( "strings" "k8s.io/api/core/v1" - utilnet "k8s.io/kubernetes/pkg/util/net" "k8s.io/utils/exec" + utilnet "k8s.io/utils/net" ) // Utilities for dealing with conntrack diff --git a/pkg/util/conntrack/conntrack_test.go b/pkg/util/conntrack/conntrack_test.go index af05a65e12..6f74ea5136 100644 --- a/pkg/util/conntrack/conntrack_test.go +++ b/pkg/util/conntrack/conntrack_test.go @@ -22,9 +22,9 @@ import ( "testing" "k8s.io/api/core/v1" - utilnet "k8s.io/kubernetes/pkg/util/net" "k8s.io/utils/exec" fakeexec "k8s.io/utils/exec/testing" + utilnet "k8s.io/utils/net" ) func familyParamStr(isIPv6 bool) string { diff --git a/pkg/util/net/BUILD b/pkg/util/net/BUILD deleted file mode 100644 index 0d2a302e1e..0000000000 --- a/pkg/util/net/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -package(default_visibility = ["//visibility:public"]) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/util/net/sets:all-srcs", - ], - tags = ["automanaged"], -) - -go_library( - name = "go_default_library", - srcs = ["net.go"], - importpath = "k8s.io/kubernetes/pkg/util/net", -) - -go_test( - name = "go_default_test", - srcs = ["net_test.go"], - embed = [":go_default_library"], -) diff --git a/pkg/util/net/OWNERS b/pkg/util/net/OWNERS deleted file mode 100644 index 064cbc393e..0000000000 --- a/pkg/util/net/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -reviewers: - - sig-network-reviewers -approvers: - - sig-network-approvers diff --git a/pkg/util/net/net.go b/pkg/util/net/net.go deleted file mode 100644 index f838864cf5..0000000000 --- a/pkg/util/net/net.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2018 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 net - -import ( - "net" -) - -// IsIPv6 returns if netIP is IPv6. -func IsIPv6(netIP net.IP) bool { - return netIP != nil && netIP.To4() == nil -} - -// IsIPv6String returns if ip is IPv6. -func IsIPv6String(ip string) bool { - netIP := net.ParseIP(ip) - return IsIPv6(netIP) -} - -// IsIPv6CIDR returns if cidr is IPv6. -// This assumes cidr is a valid CIDR. -func IsIPv6CIDR(cidr string) bool { - ip, _, _ := net.ParseCIDR(cidr) - return IsIPv6(ip) -} - -// FilterIncorrectIPVersion filters out the incorrect IP version case from a slice of IP strings. -func FilterIncorrectIPVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) { - return filterWithCondition(ipStrings, isIPv6Mode, IsIPv6String) -} - -// FilterIncorrectCIDRVersion filters out the incorrect IP version case from a slice of CIDR strings. -func FilterIncorrectCIDRVersion(ipStrings []string, isIPv6Mode bool) ([]string, []string) { - return filterWithCondition(ipStrings, isIPv6Mode, IsIPv6CIDR) -} - -func filterWithCondition(strs []string, expectedCondition bool, conditionFunc func(string) bool) ([]string, []string) { - var corrects, incorrects []string - for _, str := range strs { - if conditionFunc(str) != expectedCondition { - incorrects = append(incorrects, str) - } else { - corrects = append(corrects, str) - } - } - return corrects, incorrects -} diff --git a/pkg/util/net/net_test.go b/pkg/util/net/net_test.go deleted file mode 100644 index c2d2f30f77..0000000000 --- a/pkg/util/net/net_test.go +++ /dev/null @@ -1,286 +0,0 @@ -/* -Copyright 2018 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 net - -import ( - "net" - "reflect" - "testing" -) - -func TestIsIPv6String(t *testing.T) { - testCases := []struct { - ip string - expectIPv6 bool - }{ - { - ip: "127.0.0.1", - expectIPv6: false, - }, - { - ip: "192.168.0.0", - expectIPv6: false, - }, - { - ip: "1.2.3.4", - expectIPv6: false, - }, - { - ip: "bad ip", - expectIPv6: false, - }, - { - ip: "::1", - expectIPv6: true, - }, - { - ip: "fd00::600d:f00d", - expectIPv6: true, - }, - { - ip: "2001:db8::5", - expectIPv6: true, - }, - } - for i := range testCases { - isIPv6 := IsIPv6String(testCases[i].ip) - if isIPv6 != testCases[i].expectIPv6 { - t.Errorf("[%d] Expect ipv6 %v, got %v", i+1, testCases[i].expectIPv6, isIPv6) - } - } -} - -func TestIsIPv6(t *testing.T) { - testCases := []struct { - ip net.IP - expectIPv6 bool - }{ - { - ip: net.IPv4zero, - expectIPv6: false, - }, - { - ip: net.IPv4bcast, - expectIPv6: false, - }, - { - ip: net.ParseIP("127.0.0.1"), - expectIPv6: false, - }, - { - ip: net.ParseIP("10.20.40.40"), - expectIPv6: false, - }, - { - ip: net.ParseIP("172.17.3.0"), - expectIPv6: false, - }, - { - ip: nil, - expectIPv6: false, - }, - { - ip: net.IPv6loopback, - expectIPv6: true, - }, - { - ip: net.IPv6zero, - expectIPv6: true, - }, - { - ip: net.ParseIP("fd00::600d:f00d"), - expectIPv6: true, - }, - { - ip: net.ParseIP("2001:db8::5"), - expectIPv6: true, - }, - } - for i := range testCases { - isIPv6 := IsIPv6(testCases[i].ip) - if isIPv6 != testCases[i].expectIPv6 { - t.Errorf("[%d] Expect ipv6 %v, got %v", i+1, testCases[i].expectIPv6, isIPv6) - } - } -} - -func TestIsIPv6CIDR(t *testing.T) { - testCases := []struct { - desc string - cidr string - expectResult bool - }{ - { - desc: "ipv4 CIDR 1", - cidr: "10.0.0.0/8", - expectResult: false, - }, - { - desc: "ipv4 CIDR 2", - cidr: "192.168.0.0/16", - expectResult: false, - }, - { - desc: "ipv6 CIDR 1", - cidr: "::/1", - expectResult: true, - }, - { - desc: "ipv6 CIDR 2", - cidr: "2000::/10", - expectResult: true, - }, - { - desc: "ipv6 CIDR 3", - cidr: "2001:db8::/32", - expectResult: true, - }, - } - - for _, tc := range testCases { - res := IsIPv6CIDR(tc.cidr) - if res != tc.expectResult { - t.Errorf("%v: want IsIPv6CIDR=%v, got %v", tc.desc, tc.expectResult, res) - } - } -} - -func TestFilterIncorrectIPVersion(t *testing.T) { - testCases := []struct { - desc string - isIPv6 bool - ipStrings []string - expectCorrects []string - expectIncorrects []string - }{ - { - desc: "all ipv4 strings in ipv4 mode", - isIPv6: false, - ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, - expectCorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, - expectIncorrects: nil, - }, - { - desc: "all ipv6 strings in ipv4 mode", - isIPv6: false, - ipStrings: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, - expectCorrects: nil, - expectIncorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, - }, - { - desc: "mixed versions in ipv4 mode", - isIPv6: false, - ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1", "::1", "fd00::600d:f00d", "2001:db8::5"}, - expectCorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, - expectIncorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, - }, - { - desc: "all ipv4 strings in ipv6 mode", - isIPv6: true, - ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, - expectCorrects: nil, - expectIncorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, - }, - { - desc: "all ipv6 strings in ipv6 mode", - isIPv6: true, - ipStrings: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, - expectCorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, - expectIncorrects: nil, - }, - { - desc: "mixed versions in ipv6 mode", - isIPv6: true, - ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1", "::1", "fd00::600d:f00d", "2001:db8::5"}, - expectCorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, - expectIncorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, - }, - } - - for _, tc := range testCases { - corrects, incorrects := FilterIncorrectIPVersion(tc.ipStrings, tc.isIPv6) - if !reflect.DeepEqual(tc.expectCorrects, corrects) { - t.Errorf("%v: want corrects=%v, got %v", tc.desc, tc.expectCorrects, corrects) - } - if !reflect.DeepEqual(tc.expectIncorrects, incorrects) { - t.Errorf("%v: want incorrects=%v, got %v", tc.desc, tc.expectIncorrects, incorrects) - } - } -} - -func TestFilterIncorrectCIDRVersion(t *testing.T) { - testCases := []struct { - desc string - isIPv6 bool - cidrStrings []string - expectCorrects []string - expectIncorrects []string - }{ - { - desc: "all ipv4 strings in ipv4 mode", - isIPv6: false, - cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1"}, - expectCorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, - expectIncorrects: nil, - }, - { - desc: "all ipv6 strings in ipv4 mode", - isIPv6: false, - cidrStrings: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, - expectCorrects: nil, - expectIncorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, - }, - { - desc: "mixed versions in ipv4 mode", - isIPv6: false, - cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1", "2001:db8::/32", "2001:0db8:0123:4567::/64"}, - expectCorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, - expectIncorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, - }, - { - desc: "all ipv4 strings in ipv6 mode", - isIPv6: true, - cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1"}, - expectCorrects: nil, - expectIncorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, - }, - { - desc: "all ipv6 strings in ipv6 mode", - isIPv6: true, - cidrStrings: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, - expectCorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, - expectIncorrects: nil, - }, - { - desc: "mixed versions in ipv6 mode", - isIPv6: true, - cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1", "2001:db8::/32", "2001:0db8:0123:4567::/64"}, - expectCorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, - expectIncorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, - }, - } - - for _, tc := range testCases { - corrects, incorrects := FilterIncorrectCIDRVersion(tc.cidrStrings, tc.isIPv6) - if !reflect.DeepEqual(tc.expectCorrects, corrects) { - t.Errorf("%v: want corrects=%v, got %v", tc.desc, tc.expectCorrects, corrects) - } - if !reflect.DeepEqual(tc.expectIncorrects, incorrects) { - t.Errorf("%v: want incorrects=%v, got %v", tc.desc, tc.expectIncorrects, incorrects) - } - } -} diff --git a/pkg/util/net/sets/doc.go b/pkg/util/net/sets/doc.go deleted file mode 100644 index 8414f74ac5..0000000000 --- a/pkg/util/net/sets/doc.go +++ /dev/null @@ -1,28 +0,0 @@ -/* -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. -*/ - -// This package contains hand-coded set implementations that should be similar -// to the autogenerated ones in pkg/util/sets. -// We can't simply use net.IPNet as a map-key in Go (because it contains a -// []byte). -// We could use the same workaround we use here (a string representation as the -// key) to autogenerate sets. If we do that, or decide on an alternate -// approach, we should replace the implementations in this package with the -// autogenerated versions. -// It is expected that callers will alias this import as "netsets" i.e. import -// netsets "k8s.io/kubernetes/pkg/util/net/sets" - -package sets diff --git a/pkg/util/net/sets/ipnet_test.go b/pkg/util/net/sets/ipnet_test.go deleted file mode 100644 index 524bd685bf..0000000000 --- a/pkg/util/net/sets/ipnet_test.go +++ /dev/null @@ -1,155 +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 sets - -import ( - "net" - "reflect" - "sort" - "testing" -) - -func parseIPNet(s string) *net.IPNet { - _, net, err := net.ParseCIDR(s) - if err != nil { - panic(err) - } - return net -} - -func TestIPNets(t *testing.T) { - s := IPNet{} - s2 := IPNet{} - if len(s) != 0 { - t.Errorf("Expected len=0: %d", len(s)) - } - a := parseIPNet("1.0.0.0/8") - b := parseIPNet("2.0.0.0/8") - c := parseIPNet("3.0.0.0/8") - d := parseIPNet("4.0.0.0/8") - - s.Insert(a, b) - if len(s) != 2 { - t.Errorf("Expected len=2: %d", len(s)) - } - s.Insert(c) - if s.Has(d) { - t.Errorf("Unexpected contents: %#v", s) - } - if !s.Has(a) { - t.Errorf("Missing contents: %#v", s) - } - s.Delete(a) - if s.Has(a) { - t.Errorf("Unexpected contents: %#v", s) - } - s.Insert(a) - if s.HasAll(a, b, d) { - t.Errorf("Unexpected contents: %#v", s) - } - if !s.HasAll(a, b) { - t.Errorf("Missing contents: %#v", s) - } - s2.Insert(a, b, d) - if s.IsSuperset(s2) { - t.Errorf("Unexpected contents: %#v", s) - } - s2.Delete(d) - if !s.IsSuperset(s2) { - t.Errorf("Missing contents: %#v", s) - } -} - -func TestIPNetSetDeleteMultiples(t *testing.T) { - s := IPNet{} - a := parseIPNet("1.0.0.0/8") - b := parseIPNet("2.0.0.0/8") - c := parseIPNet("3.0.0.0/8") - - s.Insert(a, b, c) - if len(s) != 3 { - t.Errorf("Expected len=3: %d", len(s)) - } - - s.Delete(a, c) - if len(s) != 1 { - t.Errorf("Expected len=1: %d", len(s)) - } - if s.Has(a) { - t.Errorf("Unexpected contents: %#v", s) - } - if s.Has(c) { - t.Errorf("Unexpected contents: %#v", s) - } - if !s.Has(b) { - t.Errorf("Missing contents: %#v", s) - } -} - -func TestNewIPSet(t *testing.T) { - s, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - if len(s) != 3 { - t.Errorf("Expected len=3: %d", len(s)) - } - a := parseIPNet("1.0.0.0/8") - b := parseIPNet("2.0.0.0/8") - c := parseIPNet("3.0.0.0/8") - - if !s.Has(a) || !s.Has(b) || !s.Has(c) { - t.Errorf("Unexpected contents: %#v", s) - } -} - -func TestIPNetSetDifference(t *testing.T) { - l, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - r, err := ParseIPNets("1.0.0.0/8", "2.0.0.0/8", "4.0.0.0/8", "5.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - c := l.Difference(r) - d := r.Difference(l) - if len(c) != 1 { - t.Errorf("Expected len=1: %d", len(c)) - } - if !c.Has(parseIPNet("3.0.0.0/8")) { - t.Errorf("Unexpected contents: %#v", c) - } - if len(d) != 2 { - t.Errorf("Expected len=2: %d", len(d)) - } - if !d.Has(parseIPNet("4.0.0.0/8")) || !d.Has(parseIPNet("5.0.0.0/8")) { - t.Errorf("Unexpected contents: %#v", d) - } -} - -func TestIPNetSetList(t *testing.T) { - s, err := ParseIPNets("3.0.0.0/8", "1.0.0.0/8", "2.0.0.0/8") - if err != nil { - t.Errorf("error parsing IPNets: %v", err) - } - l := s.StringSlice() - sort.Strings(l) - if !reflect.DeepEqual(l, []string{"1.0.0.0/8", "2.0.0.0/8", "3.0.0.0/8"}) { - t.Errorf("List gave unexpected result: %#v", l) - } -} diff --git a/test/test_owners.csv b/test/test_owners.csv index a8ef4cc5a3..a7729d72d3 100644 --- a/test/test_owners.csv +++ b/test/test_owners.csv @@ -795,7 +795,6 @@ k8s.io/kubernetes/pkg/util/iptables,rrati,0, k8s.io/kubernetes/pkg/util/labels,rmmh,1, k8s.io/kubernetes/pkg/util/limitwriter,deads2k,1, k8s.io/kubernetes/pkg/util/mount,xiang90,1, -k8s.io/kubernetes/pkg/util/net/sets,rrati,0, k8s.io/kubernetes/pkg/util/node,liggitt,0, k8s.io/kubernetes/pkg/util/oom,vishh,0, k8s.io/kubernetes/pkg/util/parsers,derekwaynecarr,1, diff --git a/vendor/BUILD b/vendor/BUILD index 09b4684368..f69a079edb 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -475,6 +475,7 @@ filegroup( "//vendor/k8s.io/utils/integer:all-srcs", "//vendor/k8s.io/utils/io:all-srcs", "//vendor/k8s.io/utils/keymutex:all-srcs", + "//vendor/k8s.io/utils/net:all-srcs", "//vendor/k8s.io/utils/nsenter:all-srcs", "//vendor/k8s.io/utils/path:all-srcs", "//vendor/k8s.io/utils/pointer:all-srcs", diff --git a/pkg/util/net/sets/BUILD b/vendor/k8s.io/utils/net/BUILD similarity index 50% rename from pkg/util/net/sets/BUILD rename to vendor/k8s.io/utils/net/BUILD index 6c342f122f..021c2b5365 100644 --- a/pkg/util/net/sets/BUILD +++ b/vendor/k8s.io/utils/net/BUILD @@ -1,24 +1,14 @@ -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_library( name = "go_default_library", srcs = [ - "doc.go", "ipnet.go", + "net.go", ], - importpath = "k8s.io/kubernetes/pkg/util/net/sets", -) - -go_test( - name = "go_default_test", - srcs = ["ipnet_test.go"], - embed = [":go_default_library"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/utils/net", + importpath = "k8s.io/utils/net", + visibility = ["//visibility:public"], ) filegroup( @@ -32,4 +22,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/pkg/util/net/sets/ipnet.go b/vendor/k8s.io/utils/net/ipnet.go similarity index 77% rename from pkg/util/net/sets/ipnet.go rename to vendor/k8s.io/utils/net/ipnet.go index 90ad58c635..abbb37a546 100644 --- a/pkg/util/net/sets/ipnet.go +++ b/vendor/k8s.io/utils/net/ipnet.go @@ -14,19 +14,19 @@ See the License for the specific language governing permissions and limitations under the License. */ -package sets +package net import ( "net" "strings" ) -// IPNet maps string to net.IPNet. -type IPNet map[string]*net.IPNet +// IPNetSet maps string to net.IPNet. +type IPNetSet map[string]*net.IPNet -// ParseIPNets parses string slice to IPNet. -func ParseIPNets(specs ...string) (IPNet, error) { - ipnetset := make(IPNet) +// ParseIPNets parses string slice to IPNetSet. +func ParseIPNets(specs ...string) (IPNetSet, error) { + ipnetset := make(IPNetSet) for _, spec := range specs { spec = strings.TrimSpace(spec) _, ipnet, err := net.ParseCIDR(spec) @@ -40,27 +40,27 @@ func ParseIPNets(specs ...string) (IPNet, error) { } // Insert adds items to the set. -func (s IPNet) Insert(items ...*net.IPNet) { +func (s IPNetSet) Insert(items ...*net.IPNet) { for _, item := range items { s[item.String()] = item } } // Delete removes all items from the set. -func (s IPNet) Delete(items ...*net.IPNet) { +func (s IPNetSet) Delete(items ...*net.IPNet) { for _, item := range items { delete(s, item.String()) } } // Has returns true if and only if item is contained in the set. -func (s IPNet) Has(item *net.IPNet) bool { +func (s IPNetSet) Has(item *net.IPNet) bool { _, contained := s[item.String()] return contained } // HasAll returns true if and only if all items are contained in the set. -func (s IPNet) HasAll(items ...*net.IPNet) bool { +func (s IPNetSet) HasAll(items ...*net.IPNet) bool { for _, item := range items { if !s.Has(item) { return false @@ -75,8 +75,8 @@ func (s IPNet) HasAll(items ...*net.IPNet) bool { // s2 = {a1, a2, a4, a5} // s1.Difference(s2) = {a3} // s2.Difference(s1) = {a4, a5} -func (s IPNet) Difference(s2 IPNet) IPNet { - result := make(IPNet) +func (s IPNetSet) Difference(s2 IPNetSet) IPNetSet { + result := make(IPNetSet) for k, i := range s { _, found := s2[k] if found { @@ -89,7 +89,7 @@ func (s IPNet) Difference(s2 IPNet) IPNet { // StringSlice returns a []string with the String representation of each element in the set. // Order is undefined. -func (s IPNet) StringSlice() []string { +func (s IPNetSet) StringSlice() []string { a := make([]string, 0, len(s)) for k := range s { a = append(a, k) @@ -98,7 +98,7 @@ func (s IPNet) StringSlice() []string { } // IsSuperset returns true if and only if s1 is a superset of s2. -func (s IPNet) IsSuperset(s2 IPNet) bool { +func (s IPNetSet) IsSuperset(s2 IPNetSet) bool { for k := range s2 { _, found := s[k] if !found { @@ -111,11 +111,11 @@ func (s IPNet) IsSuperset(s2 IPNet) bool { // Equal returns true if and only if s1 is equal (as a set) to s2. // Two sets are equal if their membership is identical. // (In practice, this means same elements, order doesn't matter) -func (s IPNet) Equal(s2 IPNet) bool { +func (s IPNetSet) Equal(s2 IPNetSet) bool { return len(s) == len(s2) && s.IsSuperset(s2) } // Len returns the size of the set. -func (s IPNet) Len() int { +func (s IPNetSet) Len() int { return len(s) } diff --git a/vendor/k8s.io/utils/net/net.go b/vendor/k8s.io/utils/net/net.go new file mode 100644 index 0000000000..178d7052f1 --- /dev/null +++ b/vendor/k8s.io/utils/net/net.go @@ -0,0 +1,37 @@ +/* +Copyright 2018 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 net + +import "net" + +// IsIPv6 returns if netIP is IPv6. +func IsIPv6(netIP net.IP) bool { + return netIP != nil && netIP.To4() == nil +} + +// IsIPv6String returns if ip is IPv6. +func IsIPv6String(ip string) bool { + netIP := net.ParseIP(ip) + return IsIPv6(netIP) +} + +// IsIPv6CIDRString returns if cidr is IPv6. +// This assumes cidr is a valid CIDR. +func IsIPv6CIDRString(cidr string) bool { + ip, _, _ := net.ParseCIDR(cidr) + return IsIPv6(ip) +}