github.com/kubeflow/training-operator@v1.7.0/pkg/controller.v1/control/service_control_test.go (about) 1 // Copyright 2019 The Kubeflow Authors 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 package control 16 17 import ( 18 "encoding/json" 19 "net/http/httptest" 20 "testing" 21 22 "github.com/stretchr/testify/assert" 23 v1 "k8s.io/api/core/v1" 24 apiequality "k8s.io/apimachinery/pkg/api/equality" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 "k8s.io/apimachinery/pkg/runtime" 27 clientset "k8s.io/client-go/kubernetes" 28 clientscheme "k8s.io/client-go/kubernetes/scheme" 29 restclient "k8s.io/client-go/rest" 30 "k8s.io/client-go/tools/record" 31 utiltesting "k8s.io/client-go/util/testing" 32 33 testutilv1 "github.com/kubeflow/training-operator/test_job/test_util/v1" 34 ) 35 36 func TestCreateService(t *testing.T) { 37 ns := metav1.NamespaceDefault 38 body := runtime.EncodeOrDie( 39 clientscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), 40 &v1.Service{ObjectMeta: metav1.ObjectMeta{Name: "empty_service"}}) 41 fakeHandler := utiltesting.FakeHandler{ 42 StatusCode: 200, 43 ResponseBody: body, 44 } 45 testServer := httptest.NewServer(&fakeHandler) 46 defer testServer.Close() 47 clientset := clientset.NewForConfigOrDie(&restclient.Config{ 48 Host: testServer.URL, 49 ContentConfig: restclient.ContentConfig{ 50 GroupVersion: &v1.SchemeGroupVersion, 51 }, 52 }) 53 54 serviceControl := RealServiceControl{ 55 KubeClient: clientset, 56 Recorder: &record.FakeRecorder{}, 57 } 58 59 testJob := testutilv1.NewTestJob(1) 60 61 testName := "service-name" 62 service := testutilv1.NewBaseService(testName, testJob, t) 63 service.SetOwnerReferences([]metav1.OwnerReference{}) 64 65 // Make sure createReplica sends a POST to the apiserver with a pod from the controllers pod template 66 err := serviceControl.CreateServices(ns, service, testJob) 67 assert.NoError(t, err, "unexpected error: %v", err) 68 69 expectedService := v1.Service{ 70 ObjectMeta: metav1.ObjectMeta{ 71 Labels: testutilv1.GenLabels(testJob.Name), 72 Name: testName, 73 Namespace: ns, 74 }, 75 } 76 fakeHandler.ValidateRequest(t, 77 "/api/v1/namespaces/default/services", "POST", nil) 78 var actualService = &v1.Service{} 79 err = json.Unmarshal([]byte(fakeHandler.RequestBody), actualService) 80 assert.NoError(t, err, "unexpected error: %v", err) 81 assert.True(t, apiequality.Semantic.DeepDerivative(&expectedService, actualService), 82 "Body: %s", fakeHandler.RequestBody) 83 } 84 85 func TestCreateServicesWithControllerRef(t *testing.T) { 86 ns := metav1.NamespaceDefault 87 body := runtime.EncodeOrDie( 88 clientscheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), 89 &v1.Service{ObjectMeta: metav1.ObjectMeta{Name: "empty_service"}}) 90 fakeHandler := utiltesting.FakeHandler{ 91 StatusCode: 200, 92 ResponseBody: body, 93 } 94 testServer := httptest.NewServer(&fakeHandler) 95 defer testServer.Close() 96 clientset := clientset.NewForConfigOrDie(&restclient.Config{ 97 Host: testServer.URL, 98 ContentConfig: restclient.ContentConfig{ 99 GroupVersion: &v1.SchemeGroupVersion, 100 }, 101 }) 102 103 serviceControl := RealServiceControl{ 104 KubeClient: clientset, 105 Recorder: &record.FakeRecorder{}, 106 } 107 108 testJob := testutilv1.NewTestJob(1) 109 110 testName := "service-name" 111 service := testutilv1.NewBaseService(testName, testJob, t) 112 service.SetOwnerReferences([]metav1.OwnerReference{}) 113 114 ownerRef := testutilv1.GenOwnerReference(testJob) 115 116 // Make sure createReplica sends a POST to the apiserver with a pod from the controllers pod template 117 err := serviceControl.CreateServicesWithControllerRef(ns, service, testJob, ownerRef) 118 assert.NoError(t, err, "unexpected error: %v", err) 119 120 expectedService := v1.Service{ 121 ObjectMeta: metav1.ObjectMeta{ 122 Labels: testutilv1.GenLabels(testJob.Name), 123 Name: testName, 124 Namespace: ns, 125 OwnerReferences: []metav1.OwnerReference{*ownerRef}, 126 }, 127 } 128 fakeHandler.ValidateRequest(t, 129 "/api/v1/namespaces/default/services", "POST", nil) 130 var actualService = &v1.Service{} 131 err = json.Unmarshal([]byte(fakeHandler.RequestBody), actualService) 132 assert.NoError(t, err, "unexpected error: %v", err) 133 assert.True(t, apiequality.Semantic.DeepDerivative(&expectedService, actualService), 134 "Body: %s", fakeHandler.RequestBody) 135 }