diff --git a/internal/builder/accounting_service.go b/internal/builder/accounting_service.go index cf7b37d..7996164 100644 --- a/internal/builder/accounting_service.go +++ b/internal/builder/accounting_service.go @@ -21,6 +21,7 @@ func (b *Builder) BuildAccountingService(accounting *slinkyv1alpha1.Accounting) Selector: labels.NewBuilder(). WithAccountingSelectorLabels(accounting). Build(), + Headless: accounting.Spec.Service.ServiceSpecWrapper.ServiceSpec.ClusterIP == corev1.ClusterIPNone, } opts.Metadata.Labels = structutils.MergeMaps(opts.Metadata.Labels, labels.NewBuilder().WithAccountingLabels(accounting).Build()) diff --git a/internal/builder/accounting_service_test.go b/internal/builder/accounting_service_test.go index 022b2e5..d0f92df 100644 --- a/internal/builder/accounting_service_test.go +++ b/internal/builder/accounting_service_test.go @@ -22,10 +22,12 @@ func TestBuilder_BuildAccountingService(t *testing.T) { accounting *slinkyv1alpha1.Accounting } tests := []struct { - name string - fields fields - args args - wantErr bool + name string + fields fields + args args + wantErr bool + wantClusterIP string + wantPublishNotReadyAddresses bool }{ { name: "default", @@ -58,6 +60,49 @@ func TestBuilder_BuildAccountingService(t *testing.T) { }, }, }, + wantClusterIP: "", + wantPublishNotReadyAddresses: false, + }, + { + name: "headless service", + fields: fields{ + client: fake.NewClientBuilder(). + WithObjects(&corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "mariadb", + }, + Data: map[string][]byte{ + "password": []byte("mariadb-password"), + }, + }). + Build(), + }, + args: args{ + accounting: &slinkyv1alpha1.Accounting{ + ObjectMeta: metav1.ObjectMeta{ + Name: "slurm", + }, + Spec: slinkyv1alpha1.AccountingSpec{ + Service: slinkyv1alpha1.ServiceSpec{ + ServiceSpecWrapper: slinkyv1alpha1.ServiceSpecWrapper{ + ServiceSpec: corev1.ServiceSpec{ + ClusterIP: corev1.ClusterIPNone, + }, + }, + }, + StorageConfig: slinkyv1alpha1.StorageConfig{ + PasswordKeyRef: corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "mariadb", + }, + Key: "password", + }, + }, + }, + }, + }, + wantClusterIP: corev1.ClusterIPNone, + wantPublishNotReadyAddresses: true, }, } for _, tt := range tests { @@ -87,6 +132,17 @@ func TestBuilder_BuildAccountingService(t *testing.T) { got2.Spec.Template.Spec.Containers[0].Ports[0].Name, got2.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort) } + + // Validate ClusterIP + if got.Spec.ClusterIP != tt.wantClusterIP { + t.Errorf("ClusterIP = %v, want %v", got.Spec.ClusterIP, tt.wantClusterIP) + } + + // Validate PublishNotReadyAddresses + if got.Spec.PublishNotReadyAddresses != tt.wantPublishNotReadyAddresses { + t.Errorf("PublishNotReadyAddresses = %v, want %v", + got.Spec.PublishNotReadyAddresses, tt.wantPublishNotReadyAddresses) + } }) } } diff --git a/internal/builder/controller_service.go b/internal/builder/controller_service.go index 6c414c2..a50d391 100644 --- a/internal/builder/controller_service.go +++ b/internal/builder/controller_service.go @@ -21,6 +21,7 @@ func (b *Builder) BuildControllerService(controller *slinkyv1alpha1.Controller) Selector: labels.NewBuilder(). WithControllerSelectorLabels(controller). Build(), + Headless: controller.Spec.Service.ServiceSpecWrapper.ServiceSpec.ClusterIP == corev1.ClusterIPNone, } opts.Metadata.Labels = structutils.MergeMaps(opts.Metadata.Labels, labels.NewBuilder().WithControllerLabels(controller).Build()) diff --git a/internal/builder/controller_service_test.go b/internal/builder/controller_service_test.go index c2cfd92..fa7536b 100644 --- a/internal/builder/controller_service_test.go +++ b/internal/builder/controller_service_test.go @@ -22,11 +22,13 @@ func TestBuilder_BuildControllerService(t *testing.T) { controller *slinkyv1alpha1.Controller } tests := []struct { - name string - fields fields - args args - want *corev1.Service - wantErr bool + name string + fields fields + args args + want *corev1.Service + wantErr bool + wantClusterIP string + wantPublishNotReadyAddresses bool }{ { name: "default", @@ -40,6 +42,32 @@ func TestBuilder_BuildControllerService(t *testing.T) { }, }, }, + wantClusterIP: "", + wantPublishNotReadyAddresses: false, + }, + { + name: "headless service", + fields: fields{ + client: fake.NewFakeClient(), + }, + args: args{ + controller: &slinkyv1alpha1.Controller{ + ObjectMeta: metav1.ObjectMeta{ + Name: "slurm", + }, + Spec: slinkyv1alpha1.ControllerSpec{ + Service: slinkyv1alpha1.ServiceSpec{ + ServiceSpecWrapper: slinkyv1alpha1.ServiceSpecWrapper{ + ServiceSpec: corev1.ServiceSpec{ + ClusterIP: corev1.ClusterIPNone, + }, + }, + }, + }, + }, + }, + wantClusterIP: corev1.ClusterIPNone, + wantPublishNotReadyAddresses: true, }, } for _, tt := range tests { @@ -69,6 +97,17 @@ func TestBuilder_BuildControllerService(t *testing.T) { got2.Spec.Template.Spec.Containers[0].Ports[0].Name, got2.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort) } + + // Validate ClusterIP + if got.Spec.ClusterIP != tt.wantClusterIP { + t.Errorf("ClusterIP = %v, want %v", got.Spec.ClusterIP, tt.wantClusterIP) + } + + // Validate PublishNotReadyAddresses + if got.Spec.PublishNotReadyAddresses != tt.wantPublishNotReadyAddresses { + t.Errorf("PublishNotReadyAddresses = %v, want %v", + got.Spec.PublishNotReadyAddresses, tt.wantPublishNotReadyAddresses) + } }) } } diff --git a/internal/builder/login_service.go b/internal/builder/login_service.go index 1d300d7..29a515c 100644 --- a/internal/builder/login_service.go +++ b/internal/builder/login_service.go @@ -21,6 +21,7 @@ func (b *Builder) BuildLoginService(loginset *slinkyv1alpha1.LoginSet) (*corev1. Selector: labels.NewBuilder(). WithLoginSelectorLabels(loginset). Build(), + Headless: loginset.Spec.Service.ServiceSpecWrapper.ServiceSpec.ClusterIP == corev1.ClusterIPNone, } opts.Metadata.Labels = structutils.MergeMaps(opts.Metadata.Labels, labels.NewBuilder().WithLoginLabels(loginset).Build()) diff --git a/internal/builder/login_service_test.go b/internal/builder/login_service_test.go index 911687a..e4009f4 100644 --- a/internal/builder/login_service_test.go +++ b/internal/builder/login_service_test.go @@ -22,11 +22,13 @@ func TestBuilder_BuildLoginService(t *testing.T) { loginset *slinkyv1alpha1.LoginSet } tests := []struct { - name string - fields fields - args args - want *corev1.Service - wantErr bool + name string + fields fields + args args + want *corev1.Service + wantErr bool + wantClusterIP string + wantPublishNotReadyAddresses bool }{ { name: "default", @@ -51,6 +53,41 @@ func TestBuilder_BuildLoginService(t *testing.T) { }, }, }, + wantClusterIP: "", + wantPublishNotReadyAddresses: false, + }, + { + name: "headless service", + fields: fields{ + client: fake.NewClientBuilder(). + WithObjects(&slinkyv1alpha1.Controller{ + ObjectMeta: metav1.ObjectMeta{ + Name: "slurm", + }, + }). + Build(), + }, + args: args{ + loginset: &slinkyv1alpha1.LoginSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "slurm-foo", + }, + Spec: slinkyv1alpha1.LoginSetSpec{ + Service: slinkyv1alpha1.ServiceSpec{ + ServiceSpecWrapper: slinkyv1alpha1.ServiceSpecWrapper{ + ServiceSpec: corev1.ServiceSpec{ + ClusterIP: corev1.ClusterIPNone, + }, + }, + }, + ControllerRef: slinkyv1alpha1.ObjectReference{ + Name: "slurm", + }, + }, + }, + }, + wantClusterIP: corev1.ClusterIPNone, + wantPublishNotReadyAddresses: true, }, } for _, tt := range tests { @@ -80,6 +117,17 @@ func TestBuilder_BuildLoginService(t *testing.T) { got2.Spec.Template.Spec.Containers[0].Ports[0].Name, got2.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort) } + + // Validate ClusterIP + if got.Spec.ClusterIP != tt.wantClusterIP { + t.Errorf("ClusterIP = %v, want %v", got.Spec.ClusterIP, tt.wantClusterIP) + } + + // Validate PublishNotReadyAddresses + if got.Spec.PublishNotReadyAddresses != tt.wantPublishNotReadyAddresses { + t.Errorf("PublishNotReadyAddresses = %v, want %v", + got.Spec.PublishNotReadyAddresses, tt.wantPublishNotReadyAddresses) + } }) } } diff --git a/internal/builder/restapi_service.go b/internal/builder/restapi_service.go index dad1af8..057dcd2 100644 --- a/internal/builder/restapi_service.go +++ b/internal/builder/restapi_service.go @@ -21,6 +21,7 @@ func (b *Builder) BuildRestapiService(restapi *slinkyv1alpha1.RestApi) (*corev1. Selector: labels.NewBuilder(). WithRestapiSelectorLabels(restapi). Build(), + Headless: restapi.Spec.Service.ServiceSpecWrapper.ServiceSpec.ClusterIP == corev1.ClusterIPNone, } opts.Metadata.Labels = structutils.MergeMaps(opts.Metadata.Labels, labels.NewBuilder().WithRestapiLabels(restapi).Build()) diff --git a/internal/builder/restapi_service_test.go b/internal/builder/restapi_service_test.go index 768aafd..71d140a 100644 --- a/internal/builder/restapi_service_test.go +++ b/internal/builder/restapi_service_test.go @@ -22,11 +22,13 @@ func TestBuilder_BuildRestapiService(t *testing.T) { restapi *slinkyv1alpha1.RestApi } tests := []struct { - name string - fields fields - args args - want *corev1.Service - wantErr bool + name string + fields fields + args args + want *corev1.Service + wantErr bool + wantClusterIP string + wantPublishNotReadyAddresses bool }{ { name: "default", @@ -51,6 +53,41 @@ func TestBuilder_BuildRestapiService(t *testing.T) { }, }, }, + wantClusterIP: "", + wantPublishNotReadyAddresses: false, + }, + { + name: "headless service", + fields: fields{ + client: fake.NewClientBuilder(). + WithObjects(&slinkyv1alpha1.Controller{ + ObjectMeta: metav1.ObjectMeta{ + Name: "slurm", + }, + }). + Build(), + }, + args: args{ + restapi: &slinkyv1alpha1.RestApi{ + ObjectMeta: metav1.ObjectMeta{ + Name: "slurm", + }, + Spec: slinkyv1alpha1.RestApiSpec{ + Service: slinkyv1alpha1.ServiceSpec{ + ServiceSpecWrapper: slinkyv1alpha1.ServiceSpecWrapper{ + ServiceSpec: corev1.ServiceSpec{ + ClusterIP: corev1.ClusterIPNone, + }, + }, + }, + ControllerRef: slinkyv1alpha1.ObjectReference{ + Name: "slurm", + }, + }, + }, + }, + wantClusterIP: corev1.ClusterIPNone, + wantPublishNotReadyAddresses: true, }, } for _, tt := range tests { @@ -80,6 +117,17 @@ func TestBuilder_BuildRestapiService(t *testing.T) { got2.Spec.Template.Spec.Containers[0].Ports[0].Name, got2.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort) } + + // Validate ClusterIP + if got.Spec.ClusterIP != tt.wantClusterIP { + t.Errorf("ClusterIP = %v, want %v", got.Spec.ClusterIP, tt.wantClusterIP) + } + + // Validate PublishNotReadyAddresses + if got.Spec.PublishNotReadyAddresses != tt.wantPublishNotReadyAddresses { + t.Errorf("PublishNotReadyAddresses = %v, want %v", + got.Spec.PublishNotReadyAddresses, tt.wantPublishNotReadyAddresses) + } }) } }