This is an automated email from the ASF dual-hosted git repository.

xianjin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-uniffle.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d24c261 [ISSUE-469][operator] feat: supports adding labels to rss 
pods.  (#528)
0d24c261 is described below

commit 0d24c26196b6726d4729adfd537511f6b43f7e4f
Author: jasonawang <[email protected]>
AuthorDate: Thu Feb 2 15:54:58 2023 +0800

    [ISSUE-469][operator] feat: supports adding labels to rss pods.  (#528)
    
    ### What changes were proposed in this pull request?
    supports adding labels to rss pods
    
    ### Why are the changes needed?
    this fixes #469
    
    ### Does this PR introduce _any_ user-facing change?
    rss cluster admin cloud specify labels to rss coordinator or server
    
    ### How was this patch tested?
    Added ut.
---
 .../uniffle/v1alpha1/remoteshuffleservice_types.go |   4 +
 .../api/uniffle/v1alpha1/zz_generated.deepcopy.go  |   7 ++
 .../uniffle.apache.org_remoteshuffleservices.yaml  |  12 +++
 .../pkg/controller/controller/process_rss_test.go  |  19 +---
 .../operator/pkg/controller/controller/rss_test.go |  40 +-------
 .../controller/controller/shuffle_server_test.go   |  20 +---
 .../pkg/controller/sync/coordinator/coordinator.go |  21 +++--
 .../sync/coordinator/coordinator_test.go           |  90 ++++++++++++++++++
 .../controller/sync/shuffleserver/shuffleserver.go |  13 ++-
 .../sync/shuffleserver/shuffleserver_test.go       |  96 +++++++++++++++++++
 deploy/kubernetes/operator/pkg/utils/rss.go        | 102 +++++++++++++++++++++
 deploy/kubernetes/operator/pkg/utils/rss_test.go   |  71 ++++++++++++++
 12 files changed, 415 insertions(+), 80 deletions(-)

diff --git 
a/deploy/kubernetes/operator/api/uniffle/v1alpha1/remoteshuffleservice_types.go 
b/deploy/kubernetes/operator/api/uniffle/v1alpha1/remoteshuffleservice_types.go
index 2767e37b..e5025665 100644
--- 
a/deploy/kubernetes/operator/api/uniffle/v1alpha1/remoteshuffleservice_types.go
+++ 
b/deploy/kubernetes/operator/api/uniffle/v1alpha1/remoteshuffleservice_types.go
@@ -200,6 +200,10 @@ type RSSPodSpec struct {
        // LogHostPath represents host path used to save logs of shuffle 
servers.
        // +optional
        LogHostPath string `json:"logHostPath,omitempty"`
+
+       // Labels represents labels to be added in coordinators or shuffle 
servers' pods.
+       // +optional
+       Labels map[string]string `json:"labels,omitempty"`
 }
 
 // MainContainer stores information of the main container of coordinators or 
shuffle servers,
diff --git 
a/deploy/kubernetes/operator/api/uniffle/v1alpha1/zz_generated.deepcopy.go 
b/deploy/kubernetes/operator/api/uniffle/v1alpha1/zz_generated.deepcopy.go
index 77a99dbf..4704e9bb 100644
--- a/deploy/kubernetes/operator/api/uniffle/v1alpha1/zz_generated.deepcopy.go
+++ b/deploy/kubernetes/operator/api/uniffle/v1alpha1/zz_generated.deepcopy.go
@@ -200,6 +200,13 @@ func (in *RSSPodSpec) DeepCopyInto(out *RSSPodSpec) {
                        (*out)[key] = val
                }
        }
+       if in.Labels != nil {
+               in, out := &in.Labels, &out.Labels
+               *out = make(map[string]string, len(*in))
+               for key, val := range *in {
+                       (*out)[key] = val
+               }
+       }
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new RSSPodSpec.
diff --git 
a/deploy/kubernetes/operator/config/crd/bases/uniffle.apache.org_remoteshuffleservices.yaml
 
b/deploy/kubernetes/operator/config/crd/bases/uniffle.apache.org_remoteshuffleservices.yaml
index 56b4bfcd..d45c2de1 100644
--- 
a/deploy/kubernetes/operator/config/crd/bases/uniffle.apache.org_remoteshuffleservices.yaml
+++ 
b/deploy/kubernetes/operator/config/crd/bases/uniffle.apache.org_remoteshuffleservices.yaml
@@ -240,6 +240,12 @@ spec:
                     description: InitContainerImage represents image of init 
container
                       used to change owner of host paths.
                     type: string
+                  labels:
+                    additionalProperties:
+                      type: string
+                    description: Labels represents labels to be added in 
coordinators
+                      or shuffle servers' pods.
+                    type: object
                   logHostPath:
                     description: LogHostPath represents host path used to save 
logs
                       of shuffle servers.
@@ -3429,6 +3435,12 @@ spec:
                     description: InitContainerImage represents image of init 
container
                       used to change owner of host paths.
                     type: string
+                  labels:
+                    additionalProperties:
+                      type: string
+                    description: Labels represents labels to be added in 
coordinators
+                      or shuffle servers' pods.
+                    type: object
                   logHostPath:
                     description: LogHostPath represents host path used to save 
logs
                       of shuffle servers.
diff --git 
a/deploy/kubernetes/operator/pkg/controller/controller/process_rss_test.go 
b/deploy/kubernetes/operator/pkg/controller/controller/process_rss_test.go
index a5ac8748..f52ca3a9 100644
--- a/deploy/kubernetes/operator/pkg/controller/controller/process_rss_test.go
+++ b/deploy/kubernetes/operator/pkg/controller/controller/process_rss_test.go
@@ -31,26 +31,9 @@ import (
        
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/utils"
 )
 
-// buildEmptyPhaseRssObj builds a rss object with empty phase for testing.
-func buildEmptyPhaseRssObj() *unifflev1alpha1.RemoteShuffleService {
-       return &unifflev1alpha1.RemoteShuffleService{
-               ObjectMeta: metav1.ObjectMeta{
-                       Name:            testRssName,
-                       Namespace:       testNamespace,
-                       ResourceVersion: "test",
-               },
-               Spec: unifflev1alpha1.RemoteShuffleServiceSpec{
-                       Coordinator: &unifflev1alpha1.CoordinatorConfig{
-                               ExcludeNodesFilePath: "/exclude_nodes",
-                       },
-               },
-               Status: unifflev1alpha1.RemoteShuffleServiceStatus{},
-       }
-}
-
 // TestProcessEmptyPhaseRss tests rss objects' process of rss-controller
 func TestProcessEmptyPhaseRss(t *testing.T) {
-       rss := buildEmptyPhaseRssObj()
+       rss := utils.BuildRSSWithDefaultValue()
 
        rssClient := fake.NewSimpleClientset(rss)
        kubeClient := kubefake.NewSimpleClientset()
diff --git a/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go 
b/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go
index ac905bb2..c2c3c1a4 100644
--- a/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go
+++ b/deploy/kubernetes/operator/pkg/controller/controller/rss_test.go
@@ -283,40 +283,10 @@ func initTestRss() (*corev1.ConfigMap, 
*unifflev1alpha1.RemoteShuffleService) {
                        constants.Log4jPropertiesKey:     "",
                },
        }
-       rss := &unifflev1alpha1.RemoteShuffleService{
-               ObjectMeta: metav1.ObjectMeta{
-                       Name:      testRssName,
-                       Namespace: testNamespace,
-               },
-               Spec: unifflev1alpha1.RemoteShuffleServiceSpec{
-                       ConfigMapName: testRssName,
-                       Coordinator: &unifflev1alpha1.CoordinatorConfig{
-                               HTTPNodePort: []int32{30001, 30011},
-                               RPCNodePort:  []int32{30002, 30012},
-                               CommonConfig: &unifflev1alpha1.CommonConfig{
-                                       ConfigDir: "/app/config",
-                                       RSSPodSpec: &unifflev1alpha1.RSSPodSpec{
-                                               MainContainer: 
&unifflev1alpha1.MainContainer{
-                                                       Image: 
testCoordinatorImage1,
-                                               },
-                                       },
-                               },
-                       },
-                       ShuffleServer: &unifflev1alpha1.ShuffleServerConfig{
-                               CommonConfig: &unifflev1alpha1.CommonConfig{
-                                       ConfigDir: "/app/config",
-                                       RSSPodSpec: &unifflev1alpha1.RSSPodSpec{
-                                               MainContainer: 
&unifflev1alpha1.MainContainer{
-                                                       Image: 
"rss-shuffleserver:latest",
-                                               },
-                                       },
-                                       XmxSize: "10G",
-                               },
-                               UpgradeStrategy: 
&unifflev1alpha1.ShuffleServerUpgradeStrategy{
-                                       Type: unifflev1alpha1.FullUpgrade,
-                               },
-                       },
-               },
-       }
+       rss := utils.BuildRSSWithDefaultValue()
+       rss.Spec.ConfigMapName = cm.Name
+       rss.Name = testRssName
+       rss.Namespace = testNamespace
+       rss.Spec.Coordinator.Image = testCoordinatorImage1
        return cm, rss
 }
diff --git 
a/deploy/kubernetes/operator/pkg/controller/controller/shuffle_server_test.go 
b/deploy/kubernetes/operator/pkg/controller/controller/shuffle_server_test.go
index 669bf318..749ae1c2 100644
--- 
a/deploy/kubernetes/operator/pkg/controller/controller/shuffle_server_test.go
+++ 
b/deploy/kubernetes/operator/pkg/controller/controller/shuffle_server_test.go
@@ -35,22 +35,12 @@ import (
 )
 
 func buildUpgradingRssObjWithTargetKeys(shuffleServerKey string) 
*unifflev1alpha1.RemoteShuffleService {
-       return &unifflev1alpha1.RemoteShuffleService{
-               ObjectMeta: metav1.ObjectMeta{
-                       Name:            testRssName,
-                       Namespace:       testNamespace,
-                       ResourceVersion: "test",
-               },
-               Spec: unifflev1alpha1.RemoteShuffleServiceSpec{
-                       Coordinator: &unifflev1alpha1.CoordinatorConfig{
-                               ExcludeNodesFilePath: "/exclude_nodes",
-                       },
-               },
-               Status: unifflev1alpha1.RemoteShuffleServiceStatus{
-                       Phase:      unifflev1alpha1.RSSUpgrading,
-                       TargetKeys: []string{shuffleServerKey},
-               },
+       rss := utils.BuildRSSWithDefaultValue()
+       rss.Status = unifflev1alpha1.RemoteShuffleServiceStatus{
+               Phase:      unifflev1alpha1.RSSUpgrading,
+               TargetKeys: []string{shuffleServerKey},
        }
+       return rss
 }
 
 func buildTestShuffleServerPod() *corev1.Pod {
diff --git 
a/deploy/kubernetes/operator/pkg/controller/sync/coordinator/coordinator.go 
b/deploy/kubernetes/operator/pkg/controller/sync/coordinator/coordinator.go
index 5ce3a562..45140a47 100644
--- a/deploy/kubernetes/operator/pkg/controller/sync/coordinator/coordinator.go
+++ b/deploy/kubernetes/operator/pkg/controller/sync/coordinator/coordinator.go
@@ -160,31 +160,34 @@ func GenerateDeploy(rss 
*unifflev1alpha1.RemoteShuffleService, index int) *appsv
                podSpec.DNSPolicy = corev1.DNSClusterFirstWithHostNet
        }
 
+       defaultLabels := map[string]string{
+               "app": name,
+       }
        deploy := &appsv1.Deployment{
                ObjectMeta: metav1.ObjectMeta{
                        Name:      name,
                        Namespace: rss.Namespace,
-                       Labels: map[string]string{
-                               "app": name,
-                       },
+                       Labels:    defaultLabels,
                },
                Spec: appsv1.DeploymentSpec{
                        Selector: &metav1.LabelSelector{
-                               MatchLabels: map[string]string{
-                                       "app": name,
-                               },
+                               MatchLabels: defaultLabels,
                        },
                        Replicas: rss.Spec.Coordinator.Replicas,
                        Template: corev1.PodTemplateSpec{
                                ObjectMeta: metav1.ObjectMeta{
-                                       Labels: map[string]string{
-                                               "app": name,
-                                       },
+                                       Labels: make(map[string]string),
                                },
                                Spec: podSpec,
                        },
                },
        }
+       for k, v := range rss.Spec.Coordinator.Labels {
+               deploy.Spec.Template.Labels[k] = v
+       }
+       for k, v := range defaultLabels {
+               deploy.Spec.Template.Labels[k] = v
+       }
 
        // add init containers, the main container and other containers.
        deploy.Spec.Template.Spec.InitContainers = 
util.GenerateInitContainers(rss.Spec.Coordinator.RSSPodSpec)
diff --git 
a/deploy/kubernetes/operator/pkg/controller/sync/coordinator/coordinator_test.go
 
b/deploy/kubernetes/operator/pkg/controller/sync/coordinator/coordinator_test.go
new file mode 100644
index 00000000..89ee7220
--- /dev/null
+++ 
b/deploy/kubernetes/operator/pkg/controller/sync/coordinator/coordinator_test.go
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package coordinator
+
+import (
+       "fmt"
+       "testing"
+
+       appsv1 "k8s.io/api/apps/v1"
+
+       unifflev1alpha1 
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/api/uniffle/v1alpha1"
+       
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/utils"
+)
+
+// IsValidDeploy checks generated deployment, returns whether it is valid and 
error message.
+type IsValidDeploy func(*appsv1.Deployment) (bool, error)
+
+var commonLabels = map[string]string{
+       "key1": "value1",
+       "key2": "value2",
+       "key3": "value3",
+}
+
+func buildRssWithLabels() *unifflev1alpha1.RemoteShuffleService {
+       rss := utils.BuildRSSWithDefaultValue()
+       rss.Spec.Coordinator.Labels = commonLabels
+       return rss
+}
+
+func TestGenerateDeploy(t *testing.T) {
+       for _, tt := range []struct {
+               name string
+               rss  *unifflev1alpha1.RemoteShuffleService
+               IsValidDeploy
+       }{
+               {
+                       name: "add custom labels",
+                       rss:  buildRssWithLabels(),
+                       IsValidDeploy: func(deploy *appsv1.Deployment) (bool, 
error) {
+                               var valid = true
+                               var err error
+
+                               expectedLabels := map[string]string{
+                                       "app": "rss-coordinator-rss-0",
+                               }
+                               for k := range commonLabels {
+                                       expectedLabels[k] = commonLabels[k]
+                               }
+
+                               currentLabels := deploy.Spec.Template.Labels
+                               if len(expectedLabels) != len(currentLabels) {
+                                       valid = false
+                               } else {
+                                       for k := range currentLabels {
+                                               if expectedLabels[k] != 
currentLabels[k] {
+                                                       valid = false
+                                                       break
+                                               }
+                                       }
+                               }
+                               if !valid {
+                                       err = fmt.Errorf("unexpected labels: 
%+v, expected: %+v", currentLabels, expectedLabels)
+                               }
+                               return valid, err
+                       },
+               },
+       } {
+               t.Run(tt.name, func(tc *testing.T) {
+                       deploy := GenerateDeploy(tt.rss, 0)
+                       if valid, err := tt.IsValidDeploy(deploy); !valid {
+                               tc.Error(err)
+                       }
+               })
+       }
+}
diff --git 
a/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go 
b/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go
index cfab93d9..c461049d 100644
--- 
a/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go
+++ 
b/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go
@@ -175,15 +175,16 @@ func GenerateSts(rss 
*unifflev1alpha1.RemoteShuffleService) *appsv1.StatefulSet
                podSpec.DNSPolicy = corev1.DNSClusterFirstWithHostNet
        }
 
+       defaultLabels := utils.GenerateShuffleServerLabels(rss)
        sts := &appsv1.StatefulSet{
                ObjectMeta: metav1.ObjectMeta{
                        Name:      name,
                        Namespace: rss.Namespace,
-                       Labels:    utils.GenerateShuffleServerLabels(rss),
+                       Labels:    defaultLabels,
                },
                Spec: appsv1.StatefulSetSpec{
                        Selector: &metav1.LabelSelector{
-                               MatchLabels: 
utils.GenerateShuffleServerLabels(rss),
+                               MatchLabels: defaultLabels,
                        },
                        UpdateStrategy: appsv1.StatefulSetUpdateStrategy{
                                Type: 
appsv1.RollingUpdateStatefulSetStrategyType,
@@ -195,7 +196,7 @@ func GenerateSts(rss *unifflev1alpha1.RemoteShuffleService) 
*appsv1.StatefulSet
                        Replicas:    replicas,
                        Template: corev1.PodTemplateSpec{
                                ObjectMeta: metav1.ObjectMeta{
-                                       Labels: 
utils.GenerateShuffleServerLabels(rss),
+                                       Labels: make(map[string]string),
                                        Annotations: map[string]string{
                                                constants.AnnotationRssName: 
rss.Name,
                                                constants.AnnotationRssUID:  
string(rss.UID),
@@ -209,6 +210,12 @@ func GenerateSts(rss 
*unifflev1alpha1.RemoteShuffleService) *appsv1.StatefulSet
                        },
                },
        }
+       for k, v := range rss.Spec.ShuffleServer.Labels {
+               sts.Spec.Template.Labels[k] = v
+       }
+       for k, v := range defaultLabels {
+               sts.Spec.Template.Labels[k] = v
+       }
 
        // add init containers, the main container and other containers.
        sts.Spec.Template.Spec.InitContainers = 
util.GenerateInitContainers(rss.Spec.ShuffleServer.RSSPodSpec)
diff --git 
a/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver_test.go
 
b/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver_test.go
new file mode 100644
index 00000000..ede041de
--- /dev/null
+++ 
b/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver_test.go
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package shuffleserver
+
+import (
+       "fmt"
+       "testing"
+
+       appsv1 "k8s.io/api/apps/v1"
+
+       unifflev1alpha1 
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/api/uniffle/v1alpha1"
+       
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/utils"
+)
+
+// IsValidSts checks generated statefulSet, returns whether it is valid and 
error message.
+type IsValidSts func(*appsv1.StatefulSet) (bool, error)
+
+var commonLabels = map[string]string{
+       "key1": "value1",
+       "key2": "value2",
+       "key3": "value3",
+}
+
+func buildRssWithLabels() *unifflev1alpha1.RemoteShuffleService {
+       rss := utils.BuildRSSWithDefaultValue()
+       rss.Spec.ShuffleServer.Labels = map[string]string{
+               "uniffle.apache.org/shuffle-server": "change-test",
+       }
+       for k := range commonLabels {
+               rss.Spec.ShuffleServer.Labels[k] = commonLabels[k]
+       }
+       return rss
+}
+
+func TestGenerateSts(t *testing.T) {
+       for _, tt := range []struct {
+               name string
+               rss  *unifflev1alpha1.RemoteShuffleService
+               IsValidSts
+       }{
+               {
+                       name: "add custom labels",
+                       rss:  buildRssWithLabels(),
+                       IsValidSts: func(sts *appsv1.StatefulSet) (bool, error) 
{
+                               var valid = true
+                               var err error
+
+                               expectedLabels := map[string]string{
+                                       "app":                               
"rss-shuffle-server-rss",
+                                       "uniffle.apache.org/shuffle-server": 
"true",
+                               }
+                               for k := range commonLabels {
+                                       expectedLabels[k] = commonLabels[k]
+                               }
+
+                               currentLabels := sts.Spec.Template.Labels
+                               if len(expectedLabels) != len(currentLabels) {
+                                       valid = false
+                               } else {
+                                       for k := range currentLabels {
+                                               if expectedLabels[k] != 
currentLabels[k] {
+                                                       valid = false
+                                                       break
+                                               }
+                                       }
+                               }
+                               if !valid {
+                                       err = fmt.Errorf("unexpected labels: 
%+v, expected: %+v", currentLabels, expectedLabels)
+                               }
+                               return valid, err
+                       },
+               },
+       } {
+               t.Run(tt.name, func(tc *testing.T) {
+                       sts := GenerateSts(tt.rss)
+                       if valid, err := tt.IsValidSts(sts); !valid {
+                               tc.Error(err)
+                       }
+               })
+       }
+}
diff --git a/deploy/kubernetes/operator/pkg/utils/rss.go 
b/deploy/kubernetes/operator/pkg/utils/rss.go
new file mode 100644
index 00000000..96346470
--- /dev/null
+++ b/deploy/kubernetes/operator/pkg/utils/rss.go
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package utils
+
+import (
+       corev1 "k8s.io/api/core/v1"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "k8s.io/utils/pointer"
+
+       unifflev1alpha1 
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/api/uniffle/v1alpha1"
+)
+
+const (
+       defaultRssName              = "rss"
+       defaultConfigMapName        = "rss-config"
+       defaultCoordinatorSync      = true
+       defaultCoordinatorCount     = 2
+       defaultExcludeNodesFilePath = "/config/exclude_nodes"
+       defaultShuffleServerSync    = false
+       defaultRPCPort              = 19997
+       defaultHTTPPort             = 19996
+       defaultReplicas             = 1
+       defaultXmxSize              = "800M"
+       defaultConfigDir            = "/data/rssadmin/rss/conf"
+       defaultHostNetwork          = true
+       defaultMainImage            = "rss-server:latest"
+)
+
+var (
+       defaultCoordinatorRPCNodePorts  = []int32{30001, 30011}
+       defaultCoordinatorHTTPNodePorts = []int32{30002, 30012}
+)
+
+// BuildRSSWithDefaultValue builds a rss object with required or default 
values for testing.
+func BuildRSSWithDefaultValue() *unifflev1alpha1.RemoteShuffleService {
+       return &unifflev1alpha1.RemoteShuffleService{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      defaultRssName,
+                       Namespace: corev1.NamespaceDefault,
+               },
+               Spec: unifflev1alpha1.RemoteShuffleServiceSpec{
+                       Coordinator:   buildCoordinatorConfigWithDefaultValue(),
+                       ShuffleServer: 
buildShuffleServerConfigWithDefaultValue(),
+                       ConfigMapName: defaultConfigMapName,
+               },
+       }
+}
+
+func buildCoordinatorConfigWithDefaultValue() 
*unifflev1alpha1.CoordinatorConfig {
+       return &unifflev1alpha1.CoordinatorConfig{
+               CommonConfig:         buildCommonConfig(),
+               Sync:                 pointer.Bool(defaultCoordinatorSync),
+               Count:                pointer.Int32(defaultCoordinatorCount),
+               Replicas:             pointer.Int32(defaultReplicas),
+               RPCPort:              pointer.Int32(defaultRPCPort),
+               HTTPPort:             pointer.Int32(defaultHTTPPort),
+               ExcludeNodesFilePath: defaultExcludeNodesFilePath,
+               RPCNodePort:          defaultCoordinatorRPCNodePorts,
+               HTTPNodePort:         defaultCoordinatorHTTPNodePorts,
+       }
+}
+
+func buildShuffleServerConfigWithDefaultValue() 
*unifflev1alpha1.ShuffleServerConfig {
+       return &unifflev1alpha1.ShuffleServerConfig{
+               CommonConfig: buildCommonConfig(),
+               Sync:         pointer.Bool(defaultShuffleServerSync),
+               Replicas:     pointer.Int32(defaultReplicas),
+               RPCPort:      pointer.Int32(defaultRPCPort),
+               HTTPPort:     pointer.Int32(defaultHTTPPort),
+               UpgradeStrategy: &unifflev1alpha1.ShuffleServerUpgradeStrategy{
+                       Type: unifflev1alpha1.FullUpgrade,
+               },
+       }
+}
+
+func buildCommonConfig() *unifflev1alpha1.CommonConfig {
+       return &unifflev1alpha1.CommonConfig{
+               RSSPodSpec: &unifflev1alpha1.RSSPodSpec{
+                       MainContainer: &unifflev1alpha1.MainContainer{
+                               Image: defaultMainImage,
+                       },
+                       HostNetwork: pointer.Bool(defaultHostNetwork),
+               },
+               XmxSize:   defaultXmxSize,
+               ConfigDir: defaultConfigDir,
+       }
+}
diff --git a/deploy/kubernetes/operator/pkg/utils/rss_test.go 
b/deploy/kubernetes/operator/pkg/utils/rss_test.go
new file mode 100644
index 00000000..be19074c
--- /dev/null
+++ b/deploy/kubernetes/operator/pkg/utils/rss_test.go
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package utils
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/assert"
+       "k8s.io/utils/pointer"
+
+       unifflev1alpha1 
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/api/uniffle/v1alpha1"
+)
+
+func TestBuildRSSWithDefaultValue(t *testing.T) {
+       rss := BuildRSSWithDefaultValue()
+       assertion := assert.New(t)
+       assertion.NotEmpty(rss.Name, "need to specify name of rss")
+       assertion.NotEmpty(rss.Namespace, "need to specify namespace of rss")
+       assertion.NotEmpty(rss.Spec.Coordinator, "need to configure 
coordinator")
+       assertion.NotEmpty(rss.Spec.ShuffleServer, "need to configure shuffle 
server")
+       assertion.NotEmpty(rss.Spec.ConfigMapName, "need to configure configMap 
name of rss")
+
+       // check config of coordinator.
+       assertion.NotEmpty(rss.Spec.Coordinator.CommonConfig, "need to 
configure commonConfig of coordinator")
+       checkCommonConfig(assertion, rss.Spec.Coordinator.CommonConfig)
+       assertion.Equal(rss.Spec.Coordinator.Sync, 
pointer.Bool(defaultCoordinatorSync))
+       assertion.Equal(rss.Spec.Coordinator.Count, 
pointer.Int32(defaultCoordinatorCount))
+       assertion.Equal(rss.Spec.Coordinator.Replicas, 
pointer.Int32(defaultReplicas))
+       assertion.Equal(rss.Spec.Coordinator.RPCPort, 
pointer.Int32(defaultRPCPort))
+       assertion.Equal(rss.Spec.Coordinator.HTTPPort, 
pointer.Int32(defaultHTTPPort))
+       assertion.Equal(rss.Spec.Coordinator.ExcludeNodesFilePath, 
defaultExcludeNodesFilePath)
+       assertion.Equal(rss.Spec.Coordinator.RPCNodePort, 
defaultCoordinatorRPCNodePorts)
+       assertion.Equal(rss.Spec.Coordinator.HTTPNodePort, 
defaultCoordinatorHTTPNodePorts)
+
+       // check config of shuffle server.
+       assertion.NotEmpty(rss.Spec.ShuffleServer.CommonConfig, "need to 
configure commonConfig of shuffle server")
+       checkCommonConfig(assertion, rss.Spec.ShuffleServer.CommonConfig)
+       assertion.Equal(rss.Spec.ShuffleServer.Sync, 
pointer.Bool(defaultShuffleServerSync))
+       assertion.Equal(rss.Spec.ShuffleServer.Replicas, 
pointer.Int32(defaultReplicas))
+       assertion.Equal(rss.Spec.ShuffleServer.RPCPort, 
pointer.Int32(defaultRPCPort))
+       assertion.Equal(rss.Spec.ShuffleServer.HTTPPort, 
pointer.Int32(defaultHTTPPort))
+       assertion.Equal(rss.Spec.ShuffleServer.UpgradeStrategy, 
&unifflev1alpha1.ShuffleServerUpgradeStrategy{
+               Type: unifflev1alpha1.FullUpgrade,
+       })
+}
+
+func checkCommonConfig(assertion *assert.Assertions, commonConfig 
*unifflev1alpha1.CommonConfig) {
+       assertion.Equal(commonConfig.RSSPodSpec, &unifflev1alpha1.RSSPodSpec{
+               MainContainer: &unifflev1alpha1.MainContainer{
+                       Image: defaultMainImage,
+               },
+               HostNetwork: pointer.Bool(defaultHostNetwork),
+       })
+       assertion.Equal(commonConfig.XmxSize, defaultXmxSize)
+       assertion.Equal(commonConfig.ConfigDir, defaultConfigDir)
+}

Reply via email to