From f1ac6efadefca8f72d39f37ab8fb02d9300e7bf9 Mon Sep 17 00:00:00 2001 From: Jake Sanders Date: Thu, 19 Aug 2021 14:52:23 +0100 Subject: [PATCH] Add integration test for ensuring default solver service type is NodePort Signed-off-by: Jake Sanders --- pkg/issuer/acme/http/service_test.go | 232 +++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) diff --git a/pkg/issuer/acme/http/service_test.go b/pkg/issuer/acme/http/service_test.go index 8fec87ca7..2b132c960 100644 --- a/pkg/issuer/acme/http/service_test.go +++ b/pkg/issuer/acme/http/service_test.go @@ -162,6 +162,238 @@ func TestEnsureService(t *testing.T) { } }, }, + "http-01 ingress challenge without a service type should default to NodePort": { + Challenge: &cmacme.Challenge{ + Spec: cmacme.ChallengeSpec{ + DNSName: "test.com", + Solver: cmacme.ACMEChallengeSolver{ + HTTP01: &cmacme.ACMEChallengeSolverHTTP01{ + Ingress: &cmacme.ACMEChallengeSolverHTTP01Ingress{}, + }, + }, + }, + }, + PreFn: func(t *testing.T, s *solverFixture) { + expectedService, err := buildService(s.Challenge) + if err != nil { + t.Errorf("expectedService returned an error whilst building test fixture: %v", err) + } + // create a reactor that fails the test if a service is created + s.Builder.FakeKubeClient().PrependReactor("create", "services", func(action coretesting.Action) (handled bool, ret runtime.Object, err error) { + service := action.(coretesting.CreateAction).GetObject().(*v1.Service) + // clear service name as we don't know it yet in the expectedService + service.Name = "" + if !reflect.DeepEqual(service, expectedService) { + t.Errorf("Expected %v to equal %v", service, expectedService) + } + return false, ret, nil + }) + + s.Builder.Sync() + }, + CheckFn: func(t *testing.T, s *solverFixture, args ...interface{}) { + resp := args[0].(*v1.Service) + err := args[1] + if resp == nil && err == nil { + t.Errorf("unexpected service = nil") + t.Fail() + return + } + services, err := s.Solver.serviceLister.List(labels.NewSelector()) + if err != nil { + t.Errorf("unexpected error listing services: %v", err) + t.Fail() + return + } + if len(services) != 1 { + t.Errorf("unexpected %d services in lister: %+v", len(services), services) + t.Fail() + return + } + if !reflect.DeepEqual(services[0], resp) { + t.Errorf("Expected %v to equal %v", services[0], resp) + } + if services[0].Spec.Type != v1.ServiceTypeNodePort { + t.Errorf("Blank service type should default to NodePort, but was %q", services[0].Spec.Type) + } + }, + Err: false, + }, + "http-01 ingress challenge with a service type specified should end up on the generated solver service": { + Challenge: &cmacme.Challenge{ + Spec: cmacme.ChallengeSpec{ + DNSName: "test.com", + Solver: cmacme.ACMEChallengeSolver{ + HTTP01: &cmacme.ACMEChallengeSolverHTTP01{ + Ingress: &cmacme.ACMEChallengeSolverHTTP01Ingress{ + ServiceType: v1.ServiceTypeClusterIP, + }, + }, + }, + }, + }, + PreFn: func(t *testing.T, s *solverFixture) { + expectedService, err := buildService(s.Challenge) + if err != nil { + t.Errorf("expectedService returned an error whilst building test fixture: %v", err) + } + // create a reactor that fails the test if a service is created + s.Builder.FakeKubeClient().PrependReactor("create", "services", func(action coretesting.Action) (handled bool, ret runtime.Object, err error) { + service := action.(coretesting.CreateAction).GetObject().(*v1.Service) + // clear service name as we don't know it yet in the expectedService + service.Name = "" + if !reflect.DeepEqual(service, expectedService) { + t.Errorf("Expected %v to equal %v", service, expectedService) + } + return false, ret, nil + }) + + s.Builder.Sync() + }, + CheckFn: func(t *testing.T, s *solverFixture, args ...interface{}) { + resp := args[0].(*v1.Service) + err := args[1] + if resp == nil && err == nil { + t.Errorf("unexpected service = nil") + t.Fail() + return + } + services, err := s.Solver.serviceLister.List(labels.NewSelector()) + if err != nil { + t.Errorf("unexpected error listing services: %v", err) + t.Fail() + return + } + if len(services) != 1 { + t.Errorf("unexpected %d services in lister: %+v", len(services), services) + t.Fail() + return + } + if !reflect.DeepEqual(services[0], resp) { + t.Errorf("Expected %v to equal %v", services[0], resp) + } + if services[0].Spec.Type != v1.ServiceTypeClusterIP { + t.Errorf("expected service type %q, but was %q", v1.ServiceTypeClusterIP, services[0].Spec.Type) + } + }, + Err: false, + }, + "http-01 gateway httpRoute challenge without a service type should default to NodePort": { + Challenge: &cmacme.Challenge{ + Spec: cmacme.ChallengeSpec{ + DNSName: "test.com", + Solver: cmacme.ACMEChallengeSolver{ + HTTP01: &cmacme.ACMEChallengeSolverHTTP01{ + GatewayHTTPRoute: &cmacme.ACMEChallengeSolverHTTP01GatewayHTTPRoute{}, + }, + }, + }, + }, + PreFn: func(t *testing.T, s *solverFixture) { + expectedService, err := buildService(s.Challenge) + if err != nil { + t.Errorf("expectedService returned an error whilst building test fixture: %v", err) + } + // create a reactor that fails the test if a service is created + s.Builder.FakeKubeClient().PrependReactor("create", "services", func(action coretesting.Action) (handled bool, ret runtime.Object, err error) { + service := action.(coretesting.CreateAction).GetObject().(*v1.Service) + // clear service name as we don't know it yet in the expectedService + service.Name = "" + if !reflect.DeepEqual(service, expectedService) { + t.Errorf("Expected %v to equal %v", service, expectedService) + } + return false, ret, nil + }) + + s.Builder.Sync() + }, + CheckFn: func(t *testing.T, s *solverFixture, args ...interface{}) { + resp := args[0].(*v1.Service) + err := args[1] + if resp == nil && err == nil { + t.Errorf("unexpected service = nil") + t.Fail() + return + } + services, err := s.Solver.serviceLister.List(labels.NewSelector()) + if err != nil { + t.Errorf("unexpected error listing services: %v", err) + t.Fail() + return + } + if len(services) != 1 { + t.Errorf("unexpected %d services in lister: %+v", len(services), services) + t.Fail() + return + } + if !reflect.DeepEqual(services[0], resp) { + t.Errorf("Expected %v to equal %v", services[0], resp) + } + if services[0].Spec.Type != v1.ServiceTypeNodePort { + t.Errorf("Blank service type should default to NodePort, but was \"%s\"", services[0].Spec.Type) + } + }, + Err: false, + }, + "http-01 gateway httpRoute challenge with a service type specified should end up on the generated solver service": { + Challenge: &cmacme.Challenge{ + Spec: cmacme.ChallengeSpec{ + DNSName: "test.com", + Solver: cmacme.ACMEChallengeSolver{ + HTTP01: &cmacme.ACMEChallengeSolverHTTP01{ + GatewayHTTPRoute: &cmacme.ACMEChallengeSolverHTTP01GatewayHTTPRoute{ + ServiceType: v1.ServiceTypeClusterIP, + }, + }, + }, + }, + }, + PreFn: func(t *testing.T, s *solverFixture) { + expectedService, err := buildService(s.Challenge) + if err != nil { + t.Errorf("expectedService returned an error whilst building test fixture: %v", err) + } + // create a reactor that fails the test if a service is created + s.Builder.FakeKubeClient().PrependReactor("create", "services", func(action coretesting.Action) (handled bool, ret runtime.Object, err error) { + service := action.(coretesting.CreateAction).GetObject().(*v1.Service) + // clear service name as we don't know it yet in the expectedService + service.Name = "" + if !reflect.DeepEqual(service, expectedService) { + t.Errorf("Expected %v to equal %v", service, expectedService) + } + return false, ret, nil + }) + + s.Builder.Sync() + }, + CheckFn: func(t *testing.T, s *solverFixture, args ...interface{}) { + resp := args[0].(*v1.Service) + err := args[1] + if resp == nil && err == nil { + t.Errorf("unexpected service = nil") + t.Fail() + return + } + services, err := s.Solver.serviceLister.List(labels.NewSelector()) + if err != nil { + t.Errorf("unexpected error listing services: %v", err) + t.Fail() + return + } + if len(services) != 1 { + t.Errorf("unexpected %d services in lister: %+v", len(services), services) + t.Fail() + return + } + if !reflect.DeepEqual(services[0], resp) { + t.Errorf("Expected %v to equal %v", services[0], resp) + } + if services[0].Spec.Type != v1.ServiceTypeClusterIP { + t.Errorf("expected service type %q, but was %q", v1.ServiceTypeClusterIP, services[0].Spec.Type) + } + }, + Err: false, + }, } for name, test := range tests { t.Run(name, func(t *testing.T) {