github.phpd.cn/cilium/cilium@v1.6.12/pkg/k8s/ingress_test.go (about) 1 // Copyright 2018-2019 Authors of Cilium 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // +build !privileged_tests 16 17 package k8s 18 19 import ( 20 "fmt" 21 "net" 22 23 "github.com/cilium/cilium/pkg/checker" 24 "github.com/cilium/cilium/pkg/k8s/types" 25 "github.com/cilium/cilium/pkg/loadbalancer" 26 27 "gopkg.in/check.v1" 28 "k8s.io/api/extensions/v1beta1" 29 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 30 "k8s.io/apimachinery/pkg/util/intstr" 31 ) 32 33 func (s *K8sSuite) TestParseIngressID(c *check.C) { 34 k8sIngress := &types.Ingress{ 35 Ingress: &v1beta1.Ingress{ 36 ObjectMeta: metav1.ObjectMeta{ 37 Namespace: "bar", 38 }, 39 Spec: v1beta1.IngressSpec{ 40 Backend: &v1beta1.IngressBackend{ 41 ServiceName: "foo", 42 }, 43 }, 44 }, 45 } 46 47 c.Assert(ParseIngressID(k8sIngress), checker.DeepEquals, ServiceID{Namespace: "bar", Name: "foo"}) 48 } 49 50 func (s *K8sSuite) TestParseIngress(c *check.C) { 51 k8sIngress := &types.Ingress{ 52 Ingress: &v1beta1.Ingress{ 53 ObjectMeta: metav1.ObjectMeta{ 54 Namespace: "bar", 55 }, 56 Spec: v1beta1.IngressSpec{ 57 Backend: &v1beta1.IngressBackend{ 58 ServiceName: "svc1", 59 ServicePort: intstr.IntOrString{ 60 IntVal: 8080, 61 StrVal: "foo", 62 Type: intstr.Int, 63 }, 64 }, 65 }, 66 }, 67 } 68 host := net.ParseIP("172.0.0.1") 69 70 id, ingress, err := ParseIngress(k8sIngress, host) 71 c.Assert(err, check.IsNil) 72 c.Assert(id, checker.DeepEquals, ServiceID{Namespace: "bar", Name: "svc1"}) 73 c.Assert(ingress, checker.DeepEquals, &Service{ 74 FrontendIP: net.ParseIP("172.0.0.1"), 75 Ports: map[loadbalancer.FEPortName]*loadbalancer.FEPort{ 76 loadbalancer.FEPortName("svc1/8080"): { 77 L4Addr: &loadbalancer.L4Addr{ 78 Protocol: loadbalancer.TCP, 79 Port: 8080, 80 }, 81 }, 82 }, 83 NodePorts: map[loadbalancer.FEPortName]map[string]*loadbalancer.L3n4AddrID{}, 84 }) 85 } 86 87 func (s *K8sSuite) Test_parsingV1beta1(c *check.C) { 88 type args struct { 89 i *types.Ingress 90 host net.IP 91 } 92 tests := []struct { 93 name string 94 setupArgs func() args 95 setupWanted func() (*Service, error) 96 }{ 97 { 98 name: "Parse a normal Single Service Ingress with no ports", 99 setupArgs: func() args { 100 return args{ 101 i: &types.Ingress{ 102 Ingress: &v1beta1.Ingress{ 103 Spec: v1beta1.IngressSpec{ 104 Backend: &v1beta1.IngressBackend{ 105 ServiceName: "svc1", 106 }, 107 }, 108 }, 109 }, 110 host: net.ParseIP("172.0.0.1"), 111 } 112 }, 113 setupWanted: func() (*Service, error) { 114 return nil, fmt.Errorf("invalid port number") 115 }, 116 }, 117 { 118 name: "Parse a normal Single Service Ingress with ports", 119 setupArgs: func() args { 120 return args{ 121 i: &types.Ingress{ 122 Ingress: &v1beta1.Ingress{ 123 Spec: v1beta1.IngressSpec{ 124 Backend: &v1beta1.IngressBackend{ 125 ServiceName: "svc1", 126 ServicePort: intstr.IntOrString{ 127 IntVal: 8080, 128 StrVal: "foo", 129 Type: intstr.Int, 130 }, 131 }, 132 }, 133 }, 134 }, 135 host: net.ParseIP("172.0.0.1"), 136 } 137 }, 138 setupWanted: func() (*Service, error) { 139 return &Service{ 140 FrontendIP: net.ParseIP("172.0.0.1"), 141 Ports: map[loadbalancer.FEPortName]*loadbalancer.FEPort{ 142 loadbalancer.FEPortName("svc1/8080"): { 143 L4Addr: &loadbalancer.L4Addr{ 144 Protocol: loadbalancer.TCP, 145 Port: 8080, 146 }, 147 }, 148 }, 149 NodePorts: map[loadbalancer.FEPortName]map[string]*loadbalancer.L3n4AddrID{}, 150 }, nil 151 }, 152 }, 153 } 154 for _, tt := range tests { 155 args := tt.setupArgs() 156 wantK8sSvcInfo, wantError := tt.setupWanted() 157 _, gotK8sSvcInfo, gotError := ParseIngress(args.i, args.host) 158 c.Assert(gotError, checker.DeepEquals, wantError, check.Commentf("Test name: %q", tt.name)) 159 c.Assert(gotK8sSvcInfo, checker.DeepEquals, wantK8sSvcInfo, check.Commentf("Test name: %q", tt.name)) 160 } 161 } 162 163 func (s *K8sSuite) Test_supportV1beta1(c *check.C) { 164 type args struct { 165 i *types.Ingress 166 } 167 tests := []struct { 168 name string 169 setupArgs func() args 170 want bool 171 }{ 172 { 173 name: "We only support Single Service Ingress, which means Spec.Backend is not nil", 174 setupArgs: func() args { 175 return args{ 176 i: &types.Ingress{ 177 Ingress: &v1beta1.Ingress{ 178 Spec: v1beta1.IngressSpec{ 179 Backend: &v1beta1.IngressBackend{ 180 ServiceName: "svc1", 181 }, 182 }, 183 }, 184 }, 185 } 186 }, 187 want: true, 188 }, 189 { 190 name: "We don't support any other ingress type", 191 setupArgs: func() args { 192 return args{ 193 i: &types.Ingress{ 194 Ingress: &v1beta1.Ingress{ 195 Spec: v1beta1.IngressSpec{ 196 Rules: []v1beta1.IngressRule{ 197 { 198 Host: "hostless", 199 }, 200 }, 201 }, 202 }, 203 }, 204 } 205 }, 206 want: false, 207 }, 208 } 209 for _, tt := range tests { 210 args := tt.setupArgs() 211 want := tt.want 212 got := supportV1beta1(args.i) 213 c.Assert(got, checker.DeepEquals, want, check.Commentf("Test name: %q", tt.name)) 214 } 215 }