diff --git a/internal/services/controller/controller_test.go b/internal/services/controller/controller_test.go index 219d3e2e..62b02c34 100644 --- a/internal/services/controller/controller_test.go +++ b/internal/services/controller/controller_test.go @@ -2,9 +2,8 @@ package controller import ( "context" - "errors" + "encoding/json" "fmt" - "reflect" "sync/atomic" "testing" "time" @@ -29,12 +28,11 @@ import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" - fakediscovery "k8s.io/client-go/discovery/fake" dynamic_fake "k8s.io/client-go/dynamic/fake" "k8s.io/client-go/kubernetes/fake" authfakev1 "k8s.io/client-go/kubernetes/typed/authorization/v1/fake" k8stesting "k8s.io/client-go/testing" - "k8s.io/metrics/pkg/apis/metrics/v1beta1" + "k8s.io/metrics/pkg/apis/external_metrics" metrics_fake "k8s.io/metrics/pkg/client/clientset/versioned/fake" "castai-agent/internal/castai" @@ -63,14 +61,127 @@ func TestMain(m *testing.M) { } func TestController_HappyPath(t *testing.T) { - scheme := runtime.NewScheme() - utilruntime.Must(karpenterCoreAlpha.SchemeBuilder.AddToScheme(scheme)) - utilruntime.Must(karpenterAlpha.SchemeBuilder.AddToScheme(scheme)) - utilruntime.Must(karpenterCore.SchemeBuilder.AddToScheme(scheme)) - utilruntime.Must(karpenter.SchemeBuilder.AddToScheme(scheme)) - utilruntime.Must(datadoghqv1alpha1.SchemeBuilder.AddToScheme(scheme)) - utilruntime.Must(argorollouts.SchemeBuilder.AddToScheme(scheme)) + tests := map[string]struct { + objectCount int + }{ + "All supported objects are found and received in delta": { + objectCount: 14, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + scheme := runtime.NewScheme() + utilruntime.Must(karpenterCoreAlpha.SchemeBuilder.AddToScheme(scheme)) + utilruntime.Must(karpenterAlpha.SchemeBuilder.AddToScheme(scheme)) + utilruntime.Must(karpenterCore.SchemeBuilder.AddToScheme(scheme)) + utilruntime.Must(karpenter.SchemeBuilder.AddToScheme(scheme)) + utilruntime.Must(datadoghqv1alpha1.SchemeBuilder.AddToScheme(scheme)) + utilruntime.Must(argorollouts.SchemeBuilder.AddToScheme(scheme)) + utilruntime.Must(external_metrics.SchemeBuilder.AddToScheme(scheme)) + + mockctrl := gomock.NewController(t) + castaiclient := mock_castai.NewMockClient(mockctrl) + version := mock_version.NewMockInterface(mockctrl) + provider := mock_types.NewMockProvider(mockctrl) + objectsData, clientset, dynamicClient := loadInitialHappyPathData(t, scheme) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + fakeSelfSubjectAccessReviewsClient := &authfakev1.FakeSelfSubjectAccessReviews{ + Fake: &authfakev1.FakeAuthorizationV1{ + Fake: &k8stesting.Fake{}, + }, + } + + // returns true for all requests to fakeSelfSubjectAccessReviewsClient + fakeSelfSubjectAccessReviewsClient.Fake.PrependReactor("create", "selfsubjectaccessreviews", func(action k8stesting.Action) (bool, runtime.Object, error) { + return true, &authorizationv1.SelfSubjectAccessReview{ + Status: authorizationv1.SubjectAccessReviewStatus{ + Allowed: true, + }, + }, nil + }) + + metricsClient := metrics_fake.NewSimpleClientset() + log := logrus.New() + log.SetLevel(logrus.DebugLevel) + + version.EXPECT().Full().Return("1.21+").MaxTimes(3) + + clusterID := uuid.New() + + var invocations int64 + + castaiclient.EXPECT(). + SendDelta(gomock.Any(), clusterID.String(), gomock.Any()).AnyTimes(). + DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { + defer atomic.AddInt64(&invocations, 1) + require.Equal(t, clusterID, d.ClusterID) + require.Equal(t, "1.21+", d.ClusterVersion) + require.True(t, d.FullSnapshot) + require.Len(t, d.Items, tt.objectCount) + + var actualValues []string + for _, item := range d.Items { + actualValues = append(actualValues, fmt.Sprintf("%s-%s-%v", item.Event, item.Kind, item.Data)) + } + + for k, v := range objectsData { + require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, k, v)) + } + + return nil + }) + + agentVersion := &config.AgentVersion{Version: "1.2.3"} + castaiclient.EXPECT().ExchangeAgentTelemetry(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes(). + Return(&castai.AgentTelemetryResponse{}, nil). + Do(func(ctx context.Context, clusterID string, req *castai.AgentTelemetryRequest) { + require.Equalf(t, "1.2.3", req.AgentVersion, "got request: %+v", req) + }) + + node := &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node1", Labels: map[string]string{}}} + provider.EXPECT().FilterSpot(gomock.Any(), []*v1.Node{node}).Return([]*v1.Node{node}, nil) + + ctrl := New( + log, + clientset, + dynamicClient, + castaiclient, + metricsClient, + provider, + clusterID.String(), + &config.Controller{ + Interval: 15 * time.Second, + PrepTimeout: 2 * time.Second, + InitialSleepDuration: 10 * time.Millisecond, + ConfigMapNamespaces: []string{v1.NamespaceDefault}, + }, + version, + agentVersion, + NewHealthzProvider(defaultHealthzCfg, log), + fakeSelfSubjectAccessReviewsClient, + ) + + ctrl.Start(ctx.Done()) + + go func() { + require.NoError(t, ctrl.Run(ctx)) + }() + + wait.Until(func() { + if atomic.LoadInt64(&invocations) >= 1 { + cancel() + } + }, 10*time.Millisecond, ctx.Done()) + }) + } +} + +func TestController_ShouldKeepDeltaAfterDelete(t *testing.T) { mockctrl := gomock.NewController(t) castaiclient := mock_castai.NewMockClient(mockctrl) version := mock_version.NewMockInterface(mockctrl) @@ -79,6 +190,124 @@ func TestController_HappyPath(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: v1.NamespaceDefault, Name: "pod1"}} + podData, err := delta.Encode(pod) + require.NoError(t, err) + + clientset := fake.NewSimpleClientset() + metricsClient := metrics_fake.NewSimpleClientset() + dynamicClient := dynamic_fake.NewSimpleDynamicClient(runtime.NewScheme()) + + version.EXPECT().Full().Return("1.21+").MaxTimes(3) + + clusterID := uuid.New() + log := logrus.New() + + var invocations int64 + + // initial full snapshot + castaiclient.EXPECT(). + SendDelta(gomock.Any(), clusterID.String(), gomock.Any()). + DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { + defer atomic.AddInt64(&invocations, 1) + + require.Equal(t, clusterID, d.ClusterID) + require.Equal(t, "1.21+", d.ClusterVersion) + require.True(t, d.FullSnapshot) + require.Len(t, d.Items, 0) + + _, err := clientset.CoreV1().Pods("default").Create(ctx, pod, metav1.CreateOptions{}) + require.NoError(t, err) + + return nil + }) + + // first delta add pod - fail and trigger pod delete + castaiclient.EXPECT(). + SendDelta(gomock.Any(), clusterID.String(), gomock.Any()). + DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { + defer atomic.AddInt64(&invocations, 1) + + require.Equal(t, clusterID, d.ClusterID) + require.Equal(t, "1.21+", d.ClusterVersion) + require.False(t, d.FullSnapshot) + require.Len(t, d.Items, 1) + + var actualValues []string + for _, item := range d.Items { + actualValues = append(actualValues, fmt.Sprintf("%s-%s-%v", item.Event, item.Kind, item.Data)) + } + + require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "Pod", podData)) + + err := clientset.CoreV1().Pods("default").Delete(ctx, pod.Name, metav1.DeleteOptions{}) + require.NoError(t, err) + + return fmt.Errorf("testError") + }) + + // second attempt to send data when pod delete is received + castaiclient.EXPECT(). + SendDelta(gomock.Any(), clusterID.String(), gomock.Any()). + DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { + defer atomic.AddInt64(&invocations, 1) + + require.Equal(t, clusterID, d.ClusterID) + require.Equal(t, "1.21+", d.ClusterVersion) + require.False(t, d.FullSnapshot) + require.Len(t, d.Items, 1) + + var actualValues []string + for _, item := range d.Items { + actualValues = append(actualValues, fmt.Sprintf("%s-%s-%v", item.Event, item.Kind, item.Data)) + } + + require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventDelete, "Pod", podData)) + + return nil + }) + + agentVersion := &config.AgentVersion{Version: "1.2.3"} + castaiclient.EXPECT().ExchangeAgentTelemetry(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes(). + Return(&castai.AgentTelemetryResponse{}, nil). + Do(func(ctx context.Context, clusterID string, req *castai.AgentTelemetryRequest) { + require.Equalf(t, "1.2.3", req.AgentVersion, "got request: %+v", req) + }) + + log.SetLevel(logrus.DebugLevel) + ctrl := New( + log, + clientset, + dynamicClient, + castaiclient, + metricsClient, + provider, + clusterID.String(), + &config.Controller{ + Interval: 2 * time.Second, + PrepTimeout: 2 * time.Second, + InitialSleepDuration: 10 * time.Millisecond, + }, + version, + agentVersion, + NewHealthzProvider(defaultHealthzCfg, log), + clientset.AuthorizationV1().SelfSubjectAccessReviews(), + ) + + ctrl.Start(ctx.Done()) + + go func() { + require.NoError(t, ctrl.Run(ctx)) + }() + + wait.Until(func() { + if atomic.LoadInt64(&invocations) >= 3 { + cancel() + } + }, 10*time.Millisecond, ctx.Done()) +} + +func loadInitialHappyPathData(t *testing.T, scheme *runtime.Scheme) (map[string]*json.RawMessage, *fake.Clientset, *dynamic_fake.FakeDynamicClient) { provisionersGvr := karpenterCoreAlpha.SchemeGroupVersion.WithResource("provisioners") machinesGvr := karpenterCoreAlpha.SchemeGroupVersion.WithResource("machines") awsNodeTemplatesGvr := karpenterAlpha.SchemeGroupVersion.WithResource("awsnodetemplates") @@ -242,27 +471,8 @@ func TestController_HappyPath(t *testing.T) { rolloutData, err := delta.Encode(rollout) require.NoError(t, err) - - fakeSelfSubjectAccessReviewsClient := &authfakev1.FakeSelfSubjectAccessReviews{ - Fake: &authfakev1.FakeAuthorizationV1{ - Fake: &k8stesting.Fake{}, - }, - } - - // returns true for all requests to fakeSelfSubjectAccessReviewsClient - fakeSelfSubjectAccessReviewsClient.Fake.PrependReactor("create", "selfsubjectaccessreviews", func(action k8stesting.Action) (bool, runtime.Object, error) { - return true, &authorizationv1.SelfSubjectAccessReview{ - Status: authorizationv1.SubjectAccessReviewStatus{ - Allowed: true, - }, - }, nil - }) - clientset := fake.NewSimpleClientset(node, pod, cfgMap, pdb, hpa, csi) - metricsClient := metrics_fake.NewSimpleClientset() dynamicClient := dynamic_fake.NewSimpleDynamicClient(scheme, provisioners, machines, awsNodeTemplates, nodePools, nodeClaims, ec2NodeClasses, datadogExtendedDSReplicaSet, rollout) - objectCount := len([]runtime.Object{node, pod, cfgMap, pdb, hpa, csi, provisioners, machines, awsNodeTemplates, nodePools, nodeClaims, ec2NodeClasses, datadogExtendedDSReplicaSet, rollout}) - clientset.Fake.Resources = []*metav1.APIResourceList{ { GroupVersion: autoscalingv1.SchemeGroupVersion.String(), @@ -397,261 +607,21 @@ func TestController_HappyPath(t *testing.T) { }, }, } - - version.EXPECT().Full().Return("1.21+").MaxTimes(3) - - clusterID := uuid.New() - - var invocations int64 - - castaiclient.EXPECT(). - SendDelta(gomock.Any(), clusterID.String(), gomock.Any()).AnyTimes(). - DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { - defer atomic.AddInt64(&invocations, 1) - - require.Equal(t, clusterID, d.ClusterID) - require.Equal(t, "1.21+", d.ClusterVersion) - require.True(t, d.FullSnapshot) - require.Len(t, d.Items, objectCount) - - var actualValues []string - for _, item := range d.Items { - actualValues = append(actualValues, fmt.Sprintf("%s-%s-%v", item.Event, item.Kind, item.Data)) - } - - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "Node", nodeData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "Pod", podData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "ConfigMap", cfgMapData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "PodDisruptionBudget", pdbData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "HorizontalPodAutoscaler", hpaData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "CSINode", csiData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "Provisioner", provisionersData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "Machine", machinesData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "AWSNodeTemplate", awsNodeTemplatesData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "NodePool", nodePoolsData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "NodeClaim", nodeClaimsData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "EC2NodeClass", ec2NodeClassesData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "ExtendedDaemonSetReplicaSet", datadogExtendedDSReplicaSetData)) - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "Rollout", rolloutData)) - - return nil - }) - - agentVersion := &config.AgentVersion{Version: "1.2.3"} - castaiclient.EXPECT().ExchangeAgentTelemetry(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes(). - Return(&castai.AgentTelemetryResponse{}, nil). - Do(func(ctx context.Context, clusterID string, req *castai.AgentTelemetryRequest) { - require.Equalf(t, "1.2.3", req.AgentVersion, "got request: %+v", req) - }) - - provider.EXPECT().FilterSpot(gomock.Any(), []*v1.Node{node}).Return([]*v1.Node{node}, nil) - - log := logrus.New() - log.SetLevel(logrus.DebugLevel) - ctrl := New( - log, - clientset, - dynamicClient, - castaiclient, - metricsClient, - provider, - clusterID.String(), - &config.Controller{ - Interval: 15 * time.Second, - PrepTimeout: 2 * time.Second, - InitialSleepDuration: 10 * time.Millisecond, - ConfigMapNamespaces: []string{v1.NamespaceDefault}, - }, - version, - agentVersion, - NewHealthzProvider(defaultHealthzCfg, log), - fakeSelfSubjectAccessReviewsClient, - ) - ctrl.Start(ctx.Done()) - - go func() { - require.NoError(t, ctrl.Run(ctx)) - }() - - wait.Until(func() { - if atomic.LoadInt64(&invocations) >= 1 { - cancel() - } - }, 10*time.Millisecond, ctx.Done()) -} - -func TestNew(t *testing.T) { - t.Run("should not collect pod metrics when discovery api is unavailable", func(t *testing.T) { - r := require.New(t) - mockctrl := gomock.NewController(t) - castaiclient := mock_castai.NewMockClient(mockctrl) - version := mock_version.NewMockInterface(mockctrl) - provider := mock_types.NewMockProvider(mockctrl) - - clientset := fake.NewSimpleClientset() - clientset.Discovery().(*fakediscovery.FakeDiscovery). - PrependReactor("get", "group", - func(_ k8stesting.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, errors.New("some error") - }) - metricsClient := metrics_fake.NewSimpleClientset() - dynamicClient := dynamic_fake.NewSimpleDynamicClient(runtime.NewScheme()) - - version.EXPECT().Full().Return("1.21+").MaxTimes(2) - - clusterID := uuid.New() - agentVersion := &config.AgentVersion{Version: "1.2.3"} - - log := logrus.New() - log.SetLevel(logrus.DebugLevel) - ctrl := New( - log, - clientset, - dynamicClient, - castaiclient, - metricsClient, - provider, - clusterID.String(), - &config.Controller{ - Interval: 15 * time.Second, - PrepTimeout: 2 * time.Second, - InitialSleepDuration: 10 * time.Millisecond, - }, - version, - agentVersion, - NewHealthzProvider(defaultHealthzCfg, log), - clientset.AuthorizationV1().SelfSubjectAccessReviews(), - ) - - r.NotNil(ctrl) - - _, found := ctrl.informers[reflect.TypeOf(&v1beta1.PodMetrics{}).String()] - r.False(found, "pod metrics informer should not be registered if metrics api is not available") - }) -} - -func TestController_ShouldKeepDeltaAfterDelete(t *testing.T) { - mockctrl := gomock.NewController(t) - castaiclient := mock_castai.NewMockClient(mockctrl) - version := mock_version.NewMockInterface(mockctrl) - provider := mock_types.NewMockProvider(mockctrl) - - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: v1.NamespaceDefault, Name: "pod1"}} - podData, err := delta.Encode(pod) - require.NoError(t, err) - - clientset := fake.NewSimpleClientset() - metricsClient := metrics_fake.NewSimpleClientset() - dynamicClient := dynamic_fake.NewSimpleDynamicClient(runtime.NewScheme()) - - version.EXPECT().Full().Return("1.21+").MaxTimes(3) - - clusterID := uuid.New() - log := logrus.New() - - var invocations int64 - - // initial full snapshot - castaiclient.EXPECT(). - SendDelta(gomock.Any(), clusterID.String(), gomock.Any()). - DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { - defer atomic.AddInt64(&invocations, 1) - - require.Equal(t, clusterID, d.ClusterID) - require.Equal(t, "1.21+", d.ClusterVersion) - require.True(t, d.FullSnapshot) - require.Len(t, d.Items, 0) - - _, err := clientset.CoreV1().Pods("default").Create(ctx, pod, metav1.CreateOptions{}) - require.NoError(t, err) - - return nil - }) - - // first delta add pod - fail and trigger pod delete - castaiclient.EXPECT(). - SendDelta(gomock.Any(), clusterID.String(), gomock.Any()). - DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { - defer atomic.AddInt64(&invocations, 1) - - require.Equal(t, clusterID, d.ClusterID) - require.Equal(t, "1.21+", d.ClusterVersion) - require.False(t, d.FullSnapshot) - require.Len(t, d.Items, 1) - - var actualValues []string - for _, item := range d.Items { - actualValues = append(actualValues, fmt.Sprintf("%s-%s-%v", item.Event, item.Kind, item.Data)) - } - - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventAdd, "Pod", podData)) - - err := clientset.CoreV1().Pods("default").Delete(ctx, pod.Name, metav1.DeleteOptions{}) - require.NoError(t, err) - - return fmt.Errorf("testError") - }) - - // second attempt to send data when pod delete is received - castaiclient.EXPECT(). - SendDelta(gomock.Any(), clusterID.String(), gomock.Any()). - DoAndReturn(func(_ context.Context, clusterID string, d *castai.Delta) error { - defer atomic.AddInt64(&invocations, 1) - - require.Equal(t, clusterID, d.ClusterID) - require.Equal(t, "1.21+", d.ClusterVersion) - require.False(t, d.FullSnapshot) - require.Len(t, d.Items, 1) - - var actualValues []string - for _, item := range d.Items { - actualValues = append(actualValues, fmt.Sprintf("%s-%s-%v", item.Event, item.Kind, item.Data)) - } - - require.Contains(t, actualValues, fmt.Sprintf("%s-%s-%v", castai.EventDelete, "Pod", podData)) - - return nil - }) - - agentVersion := &config.AgentVersion{Version: "1.2.3"} - castaiclient.EXPECT().ExchangeAgentTelemetry(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes(). - Return(&castai.AgentTelemetryResponse{}, nil). - Do(func(ctx context.Context, clusterID string, req *castai.AgentTelemetryRequest) { - require.Equalf(t, "1.2.3", req.AgentVersion, "got request: %+v", req) - }) - - log.SetLevel(logrus.DebugLevel) - ctrl := New( - log, - clientset, - dynamicClient, - castaiclient, - metricsClient, - provider, - clusterID.String(), - &config.Controller{ - Interval: 2 * time.Second, - PrepTimeout: 2 * time.Second, - InitialSleepDuration: 10 * time.Millisecond, - }, - version, - agentVersion, - NewHealthzProvider(defaultHealthzCfg, log), - clientset.AuthorizationV1().SelfSubjectAccessReviews(), - ) - - ctrl.Start(ctx.Done()) - - go func() { - require.NoError(t, ctrl.Run(ctx)) - }() - - wait.Until(func() { - if atomic.LoadInt64(&invocations) >= 3 { - cancel() - } - }, 10*time.Millisecond, ctx.Done()) + objects := make(map[string]*json.RawMessage) + objects["Node"] = nodeData + objects["Pod"] = podData + objects["ConfigMap"] = cfgMapData + objects["PodDisruptionBudget"] = pdbData + objects["HorizontalPodAutoscaler"] = hpaData + objects["CSINode"] = csiData + objects["Provisioner"] = provisionersData + objects["Machine"] = machinesData + objects["AWSNodeTemplate"] = awsNodeTemplatesData + objects["NodePool"] = nodePoolsData + objects["NodeClaim"] = nodeClaimsData + objects["EC2NodeClass"] = ec2NodeClassesData + objects["ExtendedDaemonSetReplicaSet"] = datadogExtendedDSReplicaSetData + objects["Rollout"] = rolloutData + + return objects, clientset, dynamicClient } diff --git a/internal/services/controller/handlers/handler_test.go b/internal/services/controller/handlers/handler_test.go index 0d44087a..0da72eeb 100644 --- a/internal/services/controller/handlers/handler_test.go +++ b/internal/services/controller/handlers/handler_test.go @@ -15,7 +15,7 @@ import ( "castai-agent/internal/castai" "castai-agent/internal/services/controller/delta" "castai-agent/internal/services/controller/handlers/transformers" - mock_workqueue "castai-agent/internal/services/controller/mock" + mock_workqueue "castai-agent/internal/services/controller/mock/workqueue" ) func Test_handler(t *testing.T) { diff --git a/internal/services/controller/mock/discovery/discovery.go b/internal/services/controller/mock/discovery/discovery.go new file mode 100644 index 00000000..a7a5f199 --- /dev/null +++ b/internal/services/controller/mock/discovery/discovery.go @@ -0,0 +1,189 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: k8s.io/client-go/discovery (interfaces: DiscoveryInterface) + +// Package mock_discovery is a generated GoMock package. +package discovery + +import ( + reflect "reflect" + + discovery "k8s.io/client-go/discovery" + + gomock "github.com/golang/mock/gomock" + openapi_v2 "github.com/google/gnostic-models/openapiv2" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + version "k8s.io/apimachinery/pkg/version" + openapi "k8s.io/client-go/openapi" + rest "k8s.io/client-go/rest" +) + +// MockDiscoveryInterface is a mock of DiscoveryInterface interface. +type MockDiscoveryInterface struct { + ctrl *gomock.Controller + recorder *MockDiscoveryInterfaceMockRecorder +} + +// MockDiscoveryInterfaceMockRecorder is the mock recorder for MockDiscoveryInterface. +type MockDiscoveryInterfaceMockRecorder struct { + mock *MockDiscoveryInterface +} + +// NewMockDiscoveryInterface creates a new mock instance. +func NewMockDiscoveryInterface(ctrl *gomock.Controller) *MockDiscoveryInterface { + mock := &MockDiscoveryInterface{ctrl: ctrl} + mock.recorder = &MockDiscoveryInterfaceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDiscoveryInterface) EXPECT() *MockDiscoveryInterfaceMockRecorder { + return m.recorder +} + +// OpenAPISchema mocks base method. +func (m *MockDiscoveryInterface) OpenAPISchema() (*openapi_v2.Document, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OpenAPISchema") + ret0, _ := ret[0].(*openapi_v2.Document) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// OpenAPISchema indicates an expected call of OpenAPISchema. +func (mr *MockDiscoveryInterfaceMockRecorder) OpenAPISchema() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenAPISchema", reflect.TypeOf((*MockDiscoveryInterface)(nil).OpenAPISchema)) +} + +// OpenAPIV3 mocks base method. +func (m *MockDiscoveryInterface) OpenAPIV3() openapi.Client { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OpenAPIV3") + ret0, _ := ret[0].(openapi.Client) + return ret0 +} + +// OpenAPIV3 indicates an expected call of OpenAPIV3. +func (mr *MockDiscoveryInterfaceMockRecorder) OpenAPIV3() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenAPIV3", reflect.TypeOf((*MockDiscoveryInterface)(nil).OpenAPIV3)) +} + +// RESTClient mocks base method. +func (m *MockDiscoveryInterface) RESTClient() rest.Interface { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RESTClient") + ret0, _ := ret[0].(rest.Interface) + return ret0 +} + +// RESTClient indicates an expected call of RESTClient. +func (mr *MockDiscoveryInterfaceMockRecorder) RESTClient() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RESTClient", reflect.TypeOf((*MockDiscoveryInterface)(nil).RESTClient)) +} + +// ServerGroups mocks base method. +func (m *MockDiscoveryInterface) ServerGroups() (*v1.APIGroupList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServerGroups") + ret0, _ := ret[0].(*v1.APIGroupList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ServerGroups indicates an expected call of ServerGroups. +func (mr *MockDiscoveryInterfaceMockRecorder) ServerGroups() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServerGroups", reflect.TypeOf((*MockDiscoveryInterface)(nil).ServerGroups)) +} + +// ServerGroupsAndResources mocks base method. +func (m *MockDiscoveryInterface) ServerGroupsAndResources() ([]*v1.APIGroup, []*v1.APIResourceList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServerGroupsAndResources") + ret0, _ := ret[0].([]*v1.APIGroup) + ret1, _ := ret[1].([]*v1.APIResourceList) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ServerGroupsAndResources indicates an expected call of ServerGroupsAndResources. +func (mr *MockDiscoveryInterfaceMockRecorder) ServerGroupsAndResources() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServerGroupsAndResources", reflect.TypeOf((*MockDiscoveryInterface)(nil).ServerGroupsAndResources)) +} + +// ServerPreferredNamespacedResources mocks base method. +func (m *MockDiscoveryInterface) ServerPreferredNamespacedResources() ([]*v1.APIResourceList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServerPreferredNamespacedResources") + ret0, _ := ret[0].([]*v1.APIResourceList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ServerPreferredNamespacedResources indicates an expected call of ServerPreferredNamespacedResources. +func (mr *MockDiscoveryInterfaceMockRecorder) ServerPreferredNamespacedResources() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServerPreferredNamespacedResources", reflect.TypeOf((*MockDiscoveryInterface)(nil).ServerPreferredNamespacedResources)) +} + +// ServerPreferredResources mocks base method. +func (m *MockDiscoveryInterface) ServerPreferredResources() ([]*v1.APIResourceList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServerPreferredResources") + ret0, _ := ret[0].([]*v1.APIResourceList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ServerPreferredResources indicates an expected call of ServerPreferredResources. +func (mr *MockDiscoveryInterfaceMockRecorder) ServerPreferredResources() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServerPreferredResources", reflect.TypeOf((*MockDiscoveryInterface)(nil).ServerPreferredResources)) +} + +// ServerResourcesForGroupVersion mocks base method. +func (m *MockDiscoveryInterface) ServerResourcesForGroupVersion(arg0 string) (*v1.APIResourceList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServerResourcesForGroupVersion", arg0) + ret0, _ := ret[0].(*v1.APIResourceList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ServerResourcesForGroupVersion indicates an expected call of ServerResourcesForGroupVersion. +func (mr *MockDiscoveryInterfaceMockRecorder) ServerResourcesForGroupVersion(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServerResourcesForGroupVersion", reflect.TypeOf((*MockDiscoveryInterface)(nil).ServerResourcesForGroupVersion), arg0) +} + +// ServerVersion mocks base method. +func (m *MockDiscoveryInterface) ServerVersion() (*version.Info, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ServerVersion") + ret0, _ := ret[0].(*version.Info) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ServerVersion indicates an expected call of ServerVersion. +func (mr *MockDiscoveryInterfaceMockRecorder) ServerVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServerVersion", reflect.TypeOf((*MockDiscoveryInterface)(nil).ServerVersion)) +} + +// WithLegacy mocks base method. +func (m *MockDiscoveryInterface) WithLegacy() discovery.DiscoveryInterface { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WithLegacy") + ret0, _ := ret[0].(discovery.DiscoveryInterface) + return ret0 +} + +// WithLegacy indicates an expected call of WithLegacy. +func (mr *MockDiscoveryInterfaceMockRecorder) WithLegacy() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WithLegacy", reflect.TypeOf((*MockDiscoveryInterface)(nil).WithLegacy)) +} diff --git a/internal/services/controller/mock/workqueue.go b/internal/services/controller/mock/workqueue/workqueue.go similarity index 99% rename from internal/services/controller/mock/workqueue.go rename to internal/services/controller/mock/workqueue/workqueue.go index 849c2540..4bbc45e6 100644 --- a/internal/services/controller/mock/workqueue.go +++ b/internal/services/controller/mock/workqueue/workqueue.go @@ -2,7 +2,7 @@ // Source: k8s.io/client-go/util/workqueue (interfaces: Interface) // Package mock_workqueue is a generated GoMock package. -package mock_workqueue +package workqueue import ( reflect "reflect"