func buildService(name, namespace, clusterIP, protocol string, port int) *v1.Service { return &v1.Service{ ObjectMeta: v1.ObjectMeta{Name: name, Namespace: namespace}, Spec: v1.ServiceSpec{ Ports: []v1.ServicePort{{ Protocol: v1.Protocol(protocol), Port: int32(port), }}, ClusterIP: clusterIP, }, } }
func TestBuildListener(t *testing.T) { tests := []struct { name string lbPort int64 portName string instancePort int64 backendProtocolAnnotation string certAnnotation string sslPortAnnotation string expectError bool lbProtocol string instanceProtocol string certID string }{ { "No cert or BE protocol annotation, passthrough", 80, "", 7999, "", "", "", false, "tcp", "tcp", "", }, { "Cert annotation without BE protocol specified, SSL->TCP", 80, "", 8000, "", "cert", "", false, "ssl", "tcp", "cert", }, { "BE protocol without cert annotation, passthrough", 443, "", 8001, "https", "", "", false, "tcp", "tcp", "", }, { "Invalid cert annotation, bogus backend protocol", 443, "", 8002, "bacon", "foo", "", true, "tcp", "tcp", "", }, { "Invalid cert annotation, protocol followed by equal sign", 443, "", 8003, "http=", "=", "", true, "tcp", "tcp", "", }, { "HTTPS->HTTPS", 443, "", 8004, "https", "cert", "", false, "https", "https", "cert", }, { "HTTPS->HTTP", 443, "", 8005, "http", "cert", "", false, "https", "http", "cert", }, { "SSL->SSL", 443, "", 8006, "ssl", "cert", "", false, "ssl", "ssl", "cert", }, { "SSL->TCP", 443, "", 8007, "tcp", "cert", "", false, "ssl", "tcp", "cert", }, { "Port in whitelist", 1234, "", 8008, "tcp", "cert", "1234,5678", false, "ssl", "tcp", "cert", }, { "Port not in whitelist, passthrough", 443, "", 8009, "tcp", "cert", "1234,5678", false, "tcp", "tcp", "", }, { "Named port in whitelist", 1234, "bar", 8010, "tcp", "cert", "foo,bar", false, "ssl", "tcp", "cert", }, { "Named port not in whitelist, passthrough", 443, "", 8011, "tcp", "cert", "foo,bar", false, "tcp", "tcp", "", }, { "HTTP->HTTP", 80, "", 8012, "http", "", "", false, "http", "http", "", }, } for _, test := range tests { t.Logf("Running test case %s", test.name) annotations := make(map[string]string) if test.backendProtocolAnnotation != "" { annotations[ServiceAnnotationLoadBalancerBEProtocol] = test.backendProtocolAnnotation } if test.certAnnotation != "" { annotations[ServiceAnnotationLoadBalancerCertificate] = test.certAnnotation } ports := getPortSets(test.sslPortAnnotation) l, err := buildListener(v1.ServicePort{ NodePort: int32(test.instancePort), Port: int32(test.lbPort), Name: test.portName, Protocol: v1.Protocol("tcp"), }, annotations, ports) if test.expectError { if err == nil { t.Errorf("Should error for case %s", test.name) } } else { if err != nil { t.Errorf("Should succeed for case: %s, got %v", test.name, err) } else { var cert *string if test.certID != "" { cert = &test.certID } expected := &elb.Listener{ InstancePort: &test.instancePort, InstanceProtocol: &test.instanceProtocol, LoadBalancerPort: &test.lbPort, Protocol: &test.lbProtocol, SSLCertificateId: cert, } if !reflect.DeepEqual(l, expected) { t.Errorf("Incorrect listener (%v vs expected %v) for case: %s", l, expected, test.name) } } } } }