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

roryqi 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 4408359f [ISSUE-48][FEATURE][FOLLOW UP] add unit test for validating 
rss objects (#248)
4408359f is described below

commit 4408359fcc9420571d1c8a1fb15c6b551c47f7ca
Author: jasonawang <[email protected]>
AuthorDate: Sat Oct 8 14:10:43 2022 +0800

    [ISSUE-48][FEATURE][FOLLOW UP] add unit test for validating rss objects 
(#248)
    
    ### What changes were proposed in this pull request?
    For issue #48
    I add some unit test about validating rss objects in webhook components.
    
    ### Why are the changes needed?
    Support K8S
    
    ### Does this PR introduce _any_ user-facing change?
    No
    
    ### How was this patch tested?
    Just test
---
 deploy/kubernetes/docker/Dockerfile                |   3 +
 deploy/kubernetes/docker/build.sh                  |   8 +-
 deploy/kubernetes/docker/rss-env.sh                |  33 ++++
 deploy/kubernetes/operator/Makefile                |  22 ++-
 .../pkg/controller/controller/process_rss_test.go  |   2 +
 .../controller/controller/shuffle_server_test.go   |   2 +-
 .../controller/sync/shuffleserver/shuffleserver.go |   3 +-
 .../operator/pkg/webhook/inspector/rss.go          |  38 ++--
 .../operator/pkg/webhook/inspector/rss_test.go     | 218 +++++++++++++++++++++
 9 files changed, 299 insertions(+), 30 deletions(-)

diff --git a/deploy/kubernetes/docker/Dockerfile 
b/deploy/kubernetes/docker/Dockerfile
index d1ed46bd..d2045cd2 100644
--- a/deploy/kubernetes/docker/Dockerfile
+++ b/deploy/kubernetes/docker/Dockerfile
@@ -38,8 +38,11 @@ USER rssadmin
 COPY rss-${RSS_VERSION}.tgz /data/rssadmin
 RUN tar -xvf /data/rssadmin/rss-${RSS_VERSION}.tgz -C /data/rssadmin
 RUN mv /data/rssadmin/rss-${RSS_VERSION} /data/rssadmin/rss
+RUN rm /data/rssadmin/rss/bin/rss-env.sh
 RUN rm -rf /data/rssadmin/rss-${RSS_VERSION}.tgz
 
+COPY rss-env.sh /data/rssadmin/rss/bin
+
 COPY start.sh /data/rssadmin/rss/bin
 
 COPY hadoop-${HADOOP_VERSION}.tar.gz /data/rssadmin
diff --git a/deploy/kubernetes/docker/build.sh 
b/deploy/kubernetes/docker/build.sh
index cdebba0d..86972934 100644
--- a/deploy/kubernetes/docker/build.sh
+++ b/deploy/kubernetes/docker/build.sh
@@ -83,17 +83,17 @@ cd $RSS_DIR || exit
 RSS_VERSION=$(mvn help:evaluate -Dexpression=project.version 2>/dev/null | 
grep -v "INFO" | grep -v "WARNING" | tail -n 1)
 RSS_FILE=rss-${RSS_VERSION}.tgz
 if [ ! -e "$RSS_FILE" ]; \
-  then sh build_distribution.sh \
+  then sh ./build_distribution.sh; \
   else echo "$RSS_FILE has been built"; \
 fi
 cd "$OLDPWD" || exit
 cp "$RSS_DIR/$RSS_FILE" .
 
-IMAGE=$REGISTRY/rss-server:$RSS_VERSION
-
-echo "building image: $IMAGE"
 GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
 GIT_COMMIT=$(git describe --dirty --always --tags | sed 's/-/./g')
+echo "image version: ${IMAGE_VERSION:=$RSS_VERSION-$GIT_COMMIT}"
+IMAGE=$REGISTRY/rss-server:$IMAGE_VERSION
+echo "building image: $IMAGE"
 docker build -t "$IMAGE" \
              --build-arg RSS_VERSION="$RSS_VERSION" \
              --build-arg HADOOP_VERSION="$HADOOP_VERSION" \
diff --git a/deploy/kubernetes/docker/rss-env.sh 
b/deploy/kubernetes/docker/rss-env.sh
new file mode 100644
index 00000000..26fd6a73
--- /dev/null
+++ b/deploy/kubernetes/docker/rss-env.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+
+#
+# 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.
+#
+
+set -o pipefail
+set -o nounset   # exit the script if you try to use an uninitialised variable
+set -o errexit   # exit the script if any statement returns a non-true return 
value
+
+HADOOP_HOME="/data/rssadmin/hadoop"
+RUNNER="${JAVA_HOME}/bin/java"
+JPS="${JAVA_HOME}/bin/jps"
+
+# RSS_HOME, RSS home directory (Default: parent directory of the script)
+# RSS_CONF_DIR, RSS configuration directory (Default: ${RSS_HOME}/conf)
+# HADOOP_CONF_DIR, Hadoop configuration directory (Default: 
${HADOOP_HOME}/etc/hadoop)
+# RSS_PID_DIR, Where the pid file is stored (Default: ${RSS_HOME})
+# RSS_LOG_DIR, Where log files are stored (Default: ${RSS_HOME}/logs)
+# RSS_IP, IP address Shuffle Server binds to on this node (Default: first 
non-loopback ipv4)
diff --git a/deploy/kubernetes/operator/Makefile 
b/deploy/kubernetes/operator/Makefile
index 4e40d0dd..f02969f0 100644
--- a/deploy/kubernetes/operator/Makefile
+++ b/deploy/kubernetes/operator/Makefile
@@ -20,6 +20,11 @@ REGISTRY ?= UNKNOWN_REGISTRY
 
 MODULES ?= webhook controller
 
+# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be 
downloaded by envtest binary.
+ENVTEST_K8S_VERSION = 1.22.1
+
+LOCAL_DIR=$(shell pwd)/local
+
 # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is 
set)
 ifeq (,$(shell go env GOBIN))
 GOBIN=$(shell go env GOPATH)/bin
@@ -59,7 +64,8 @@ vet: ## Run go vet against code.
        go vet ./...
 
 .PHONY: test
-test: manifests generate fmt vet ## Run tests.
+test: manifests generate fmt vet envtest ## Run tests.
+       export KUBEBUILDER_ASSETS=$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) 
--bin-dir $(LOCAL_DIR) -p path); \
        go test ./... -coverprofile cover.out
 
 .PHONY: build
@@ -69,7 +75,7 @@ build: test ## Build manager binary.
     done
 
 # Build the docker image
-docker-build: test version
+docker-build: build version
        @for module in ${MODULES}; do \
                image=${REGISTRY}/rss-$$module:$$(cat VERSION); \
                echo building $$image;\
@@ -77,36 +83,36 @@ docker-build: test version
        done
 
 # Push the docker image
-docker-push: version docker-build
+docker-push: docker-build
        @for module in ${MODULES}; do \
                image=${REGISTRY}/rss-$$module:$$(cat VERSION); \
                echo pushing $$image;\
                docker push $$image; \
        done
 
-CONTROLLER_GEN = $(shell pwd)/local/controller-gen
+CONTROLLER_GEN = $(LOCAL_DIR)/controller-gen
 .PHONY: controller-gen
 controller-gen: ## Download controller-gen locally if necessary.
        $(call 
go-get-tool,$(CONTROLLER_GEN),sigs.k8s.io/controller-tools/cmd/[email protected])
        ./hack/update-codegen.sh
 
-KUSTOMIZE = $(shell pwd)/local/kustomize
+KUSTOMIZE = $(LOCAL_DIR)/kustomize
 .PHONY: kustomize
 kustomize: ## Download kustomize locally if necessary.
        $(call 
go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/[email protected])
 
-ENVTEST = $(shell pwd)/local/setup-envtest
+ENVTEST = $(LOCAL_DIR)/setup-envtest
 .PHONY: envtest
 envtest: ## Download envtest-setup locally if necessary.
        $(call 
go-get-tool,$(ENVTEST),sigs.k8s.io/controller-runtime/tools/setup-envtest@latest)
 
-GOIMPORTS = $(shell pwd)/local/goimports
+GOIMPORTS = $(LOCAL_DIR)/goimports
 .PHONY: goimports
 goimports: ## Download goimports locally if necessary.
        $(call go-get-tool,$(GOIMPORTS),golang.org/x/tools/cmd/goimports@latest)
        $(GOIMPORTS) -local 
github.com/apache/incubator-uniffle/deploy/kubernetes/operator -w .
 
-REVIVE = $(shell pwd)/local/revive
+REVIVE = $(LOCAL_DIR)/revive
 .PHONY: revive
 revive: ## Download revive locally if necessary.
        $(call go-get-tool,$(REVIVE),github.com/mgechev/revive@latest)
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 8eba2abe..a867bb62 100644
--- a/deploy/kubernetes/operator/pkg/controller/controller/process_rss_test.go
+++ b/deploy/kubernetes/operator/pkg/controller/controller/process_rss_test.go
@@ -31,6 +31,7 @@ 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{
@@ -47,6 +48,7 @@ func buildEmptyPhaseRssObj() 
*unifflev1alpha1.RemoteShuffleService {
        }
 }
 
+// TestProcessEmptyPhaseRss tests rss objects' process of rss-controller
 func TestProcessEmptyPhaseRss(t *testing.T) {
        rss := buildEmptyPhaseRssObj()
 
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 85cb5c98..669bf318 100644
--- 
a/deploy/kubernetes/operator/pkg/controller/controller/shuffle_server_test.go
+++ 
b/deploy/kubernetes/operator/pkg/controller/controller/shuffle_server_test.go
@@ -66,7 +66,7 @@ func buildTestShuffleServerPod() *corev1.Pod {
                        },
                },
                Status: corev1.PodStatus{
-                       PodIP: "10.0.0.1",
+                       PodIP: "xxx.xxx.xxx.xxx",
                },
        }
 }
diff --git 
a/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go 
b/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go
index 9a65842d..cfab93d9 100644
--- 
a/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go
+++ 
b/deploy/kubernetes/operator/pkg/controller/sync/shuffleserver/shuffleserver.go
@@ -136,7 +136,8 @@ func GenerateNodePortSVC(rss 
*unifflev1alpha1.RemoteShuffleService) *corev1.Serv
 
 // getReplicas returns replicas of shuffle servers.
 func getReplicas(rss *unifflev1alpha1.RemoteShuffleService) *int32 {
-       // TODO: we will support hpa for rss object, and when we enable hpa, wo 
should not return replicas in .spec.shuffleServer field.
+       // TODO: we will support hpa for rss object,
+       // and when we enable hpa, we should not return replicas in 
.spec.shuffleServer field.
        return rss.Spec.ShuffleServer.Replicas
 }
 
diff --git a/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go 
b/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go
index 31bdff1d..e10890d4 100644
--- a/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go
+++ b/deploy/kubernetes/operator/pkg/webhook/inspector/rss.go
@@ -53,22 +53,10 @@ func (i *inspector) validateRSS(ar 
*admissionv1.AdmissionReview) *admissionv1.Ad
                        string(ar.Request.Object.Raw), err)
                return util.AdmissionReviewFailed(ar, err)
        }
-       // validate configurations for coordinators.
-       coordinator := newRSS.Spec.Coordinator
-       if len(coordinator.RPCNodePort) != int(*coordinator.Count) ||
-               len(coordinator.HTTPNodePort) != int(*coordinator.Count) {
-               return util.AdmissionReviewFailed(ar,
-                       fmt.Errorf("invalid number of http or rpc node ports 
(%v/%v) <> (%v)",
-                               len(coordinator.RPCNodePort), 
len(coordinator.HTTPNodePort), coordinator.Count))
-       }
-       if len(coordinator.ExcludeNodesFilePath) == 0 {
-               return util.AdmissionReviewFailed(ar,
-                       fmt.Errorf("empty exclude nodes file path for 
coordinators"))
-       }
-       // validate configurations of logHostPath for coordinators.
-       coordinatorLogPath := newRSS.Spec.Coordinator.LogHostPath
-       if len(coordinatorLogPath) > 0 && 
len(newRSS.Spec.Coordinator.HostPathMounts[coordinatorLogPath]) == 0 {
-               return util.AdmissionReviewFailed(ar, fmt.Errorf("empty log 
volume mount path for coordinators"))
+       if err := validateCoordinator(newRSS.Spec.Coordinator); err != nil {
+               klog.Errorf("validate coordinator config of rss (%v) failed: 
%v",
+                       utils.UniqueName(newRSS), err)
+               return util.AdmissionReviewFailed(ar, err)
        }
        // validate configurations of logHostPath for shuffle servers.
        shuffleServerLogPath := newRSS.Spec.ShuffleServer.LogHostPath
@@ -155,3 +143,21 @@ func generateRSSPatches(ar *admissionv1.AdmissionReview,
        klog.V(4).Infof("patch body (%v) for rss (%v)", string(patchBody), 
utils.UniqueName(rss))
        return patchBody, nil
 }
+
+// validateCoordinator validates configurations for coordinators.
+func validateCoordinator(coordinator *unifflev1alpha1.CoordinatorConfig) error 
{
+       if len(coordinator.RPCNodePort) != int(*coordinator.Count) ||
+               len(coordinator.HTTPNodePort) != int(*coordinator.Count) {
+               return fmt.Errorf("invalid number of http or rpc node ports 
(%v/%v) <> (%v)",
+                       len(coordinator.RPCNodePort), 
len(coordinator.HTTPNodePort), coordinator.Count)
+       }
+       if len(coordinator.ExcludeNodesFilePath) == 0 {
+               return fmt.Errorf("empty exclude nodes file path for 
coordinators")
+       }
+       // validate configurations of logHostPath for coordinators.
+       coordinatorLogPath := coordinator.LogHostPath
+       if len(coordinatorLogPath) > 0 && 
len(coordinator.HostPathMounts[coordinatorLogPath]) == 0 {
+               return fmt.Errorf("empty log volume mount path for 
coordinators")
+       }
+       return nil
+}
diff --git a/deploy/kubernetes/operator/pkg/webhook/inspector/rss_test.go 
b/deploy/kubernetes/operator/pkg/webhook/inspector/rss_test.go
new file mode 100644
index 00000000..8c7b08bb
--- /dev/null
+++ b/deploy/kubernetes/operator/pkg/webhook/inspector/rss_test.go
@@ -0,0 +1,218 @@
+/*
+ * 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 inspector
+
+import (
+       "encoding/json"
+       "testing"
+
+       admissionv1 "k8s.io/api/admission/v1"
+       corev1 "k8s.io/api/core/v1"
+       "k8s.io/apimachinery/pkg/runtime"
+       "k8s.io/utils/pointer"
+
+       unifflev1alpha1 
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/api/uniffle/v1alpha1"
+       
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/webhook/config"
+)
+
+func wrapTestRssObj(rss *unifflev1alpha1.RemoteShuffleService) 
*unifflev1alpha1.RemoteShuffleService {
+       rss.Name = "test"
+       rss.Namespace = corev1.NamespaceDefault
+       rss.UID = "uid-test"
+       return rss
+}
+
+// convertRssToRawExtension converts a rss object to runtime.RawExtension for 
testing.
+func convertRssToRawExtension(rss *unifflev1alpha1.RemoteShuffleService) 
(runtime.RawExtension, error) {
+       if rss == nil {
+               return 
convertRssToRawExtension(&unifflev1alpha1.RemoteShuffleService{})
+       }
+       body, err := json.Marshal(rss)
+       if err != nil {
+               return runtime.RawExtension{}, err
+       }
+       return runtime.RawExtension{
+               Raw:    body,
+               Object: rss,
+       }, nil
+}
+
+// buildTestAdmissionReview builds an AdmissionReview object for testing.
+func buildTestAdmissionReview(op admissionv1.Operation,
+       oldRss, newRss *unifflev1alpha1.RemoteShuffleService) 
*admissionv1.AdmissionReview {
+       oldObject, err := convertRssToRawExtension(oldRss)
+       if err != nil {
+               panic(err)
+       }
+       var object runtime.RawExtension
+       object, err = convertRssToRawExtension(newRss)
+       if err != nil {
+               panic(err)
+       }
+       return &admissionv1.AdmissionReview{
+               Request: &admissionv1.AdmissionRequest{
+                       Operation: op,
+                       Object:    object,
+                       OldObject: oldObject,
+               },
+       }
+}
+
+// TestValidateRSS tests rss objects' validation in rss-webhook.
+func TestValidateRSS(t *testing.T) {
+       testInspector := newInspector(&config.Config{}, nil)
+
+       rssWithCooNodePort := &unifflev1alpha1.RemoteShuffleService{
+               Spec: unifflev1alpha1.RemoteShuffleServiceSpec{
+                       Coordinator: &unifflev1alpha1.CoordinatorConfig{
+                               Count:        pointer.Int32(2),
+                               RPCNodePort:  []int32{30001, 30002},
+                               HTTPNodePort: []int32{30011, 30012},
+                       },
+               },
+       }
+
+       rssWithoutLogInCooMounts := rssWithCooNodePort.DeepCopy()
+       rssWithoutLogInCooMounts.Spec.Coordinator.ExcludeNodesFilePath = 
"/exclude_nodes"
+       rssWithoutLogInCooMounts.Spec.Coordinator.CommonConfig = 
&unifflev1alpha1.CommonConfig{
+               RSSPodSpec: &unifflev1alpha1.RSSPodSpec{
+                       LogHostPath:    "/data/logs",
+                       HostPathMounts: map[string]string{},
+               },
+       }
+
+       rssWithoutLogInServerMounts := rssWithoutLogInCooMounts.DeepCopy()
+       
rssWithoutLogInServerMounts.Spec.Coordinator.CommonConfig.RSSPodSpec.HostPathMounts["/data/logs"]
 = "/data/logs"
+       rssWithoutLogInServerMounts.Spec.ShuffleServer = 
&unifflev1alpha1.ShuffleServerConfig{
+               CommonConfig: &unifflev1alpha1.CommonConfig{
+                       RSSPodSpec: &unifflev1alpha1.RSSPodSpec{
+                               LogHostPath:    "/data/logs",
+                               HostPathMounts: map[string]string{},
+                       },
+               },
+       }
+
+       rssWithoutPartition := rssWithoutLogInServerMounts.DeepCopy()
+       
rssWithoutPartition.Spec.ShuffleServer.CommonConfig.RSSPodSpec.HostPathMounts["/data/logs"]
 = "/data/logs"
+       rssWithoutPartition.Spec.ShuffleServer.UpgradeStrategy = 
&unifflev1alpha1.ShuffleServerUpgradeStrategy{
+               Type: unifflev1alpha1.PartitionUpgrade,
+       }
+
+       rssWithInvalidPartition := rssWithoutLogInServerMounts.DeepCopy()
+       
rssWithInvalidPartition.Spec.ShuffleServer.CommonConfig.RSSPodSpec.HostPathMounts["/data/logs"]
 = "/data/logs"
+       rssWithInvalidPartition.Spec.ShuffleServer.UpgradeStrategy = 
&unifflev1alpha1.ShuffleServerUpgradeStrategy{
+               Type:      unifflev1alpha1.PartitionUpgrade,
+               Partition: pointer.Int32(-1),
+       }
+
+       rssWithoutSpecificNames := rssWithoutLogInServerMounts.DeepCopy()
+       
rssWithoutSpecificNames.Spec.ShuffleServer.CommonConfig.RSSPodSpec.HostPathMounts["/data/logs"]
 = "/data/logs"
+       rssWithoutSpecificNames.Spec.ShuffleServer.UpgradeStrategy = 
&unifflev1alpha1.ShuffleServerUpgradeStrategy{
+               Type: unifflev1alpha1.SpecificUpgrade,
+       }
+
+       rssWithoutUpgradeStrategyType := rssWithoutLogInServerMounts.DeepCopy()
+       
rssWithoutUpgradeStrategyType.Spec.ShuffleServer.CommonConfig.RSSPodSpec.HostPathMounts["/data/logs"]
 = "/data/logs"
+       rssWithoutUpgradeStrategyType.Spec.ShuffleServer.UpgradeStrategy = 
&unifflev1alpha1.ShuffleServerUpgradeStrategy{}
+
+       for _, tt := range []struct {
+               name    string
+               ar      *admissionv1.AdmissionReview
+               allowed bool
+       }{
+               {
+                       name: "try to modify a upgrading rss object",
+                       ar: buildTestAdmissionReview(admissionv1.Update, 
wrapTestRssObj(&unifflev1alpha1.RemoteShuffleService{
+                               Status: 
unifflev1alpha1.RemoteShuffleServiceStatus{
+                                       Phase: unifflev1alpha1.RSSUpgrading,
+                               },
+                       }), nil),
+                       allowed: false,
+               },
+               {
+                       name: "invalid rpc node port number in a rss object",
+                       ar: buildTestAdmissionReview(admissionv1.Update, nil, 
wrapTestRssObj(&unifflev1alpha1.RemoteShuffleService{
+                               Spec: unifflev1alpha1.RemoteShuffleServiceSpec{
+                                       Coordinator: 
&unifflev1alpha1.CoordinatorConfig{
+                                               Count:       pointer.Int32(2),
+                                               RPCNodePort: []int32{30001},
+                                       },
+                               },
+                       })),
+                       allowed: false,
+               },
+               {
+                       name: "invalid http node port number in a rss object",
+                       ar: buildTestAdmissionReview(admissionv1.Update, nil, 
wrapTestRssObj(&unifflev1alpha1.RemoteShuffleService{
+                               Spec: unifflev1alpha1.RemoteShuffleServiceSpec{
+                                       Coordinator: 
&unifflev1alpha1.CoordinatorConfig{
+                                               Count:        pointer.Int32(2),
+                                               RPCNodePort:  []int32{30001, 
30002},
+                                               HTTPNodePort: []int32{30011},
+                                       },
+                               },
+                       })),
+                       allowed: false,
+               },
+               {
+                       name:    "empty exclude nodes file path field in a rss 
object",
+                       ar:      buildTestAdmissionReview(admissionv1.Update, 
nil, wrapTestRssObj(rssWithCooNodePort)),
+                       allowed: false,
+               },
+               {
+                       name:    "can not find log host path in coordinators' 
host path mounts field in a rss object",
+                       ar:      buildTestAdmissionReview(admissionv1.Update, 
nil, wrapTestRssObj(rssWithoutLogInCooMounts)),
+                       allowed: false,
+               },
+               {
+                       name:    "can not find log host path in shuffle server' 
host path mounts field in a rss object",
+                       ar:      buildTestAdmissionReview(admissionv1.Update, 
nil, wrapTestRssObj(rssWithoutLogInServerMounts)),
+                       allowed: false,
+               },
+               {
+                       name:    "empty partition field when shuffler server of 
a rss object need partition upgrade",
+                       ar:      buildTestAdmissionReview(admissionv1.Update, 
nil, wrapTestRssObj(rssWithoutPartition)),
+                       allowed: false,
+               },
+               {
+                       name:    "invalid partition field when shuffler server 
of a rss object need partition upgrade",
+                       ar:      buildTestAdmissionReview(admissionv1.Update, 
nil, wrapTestRssObj(rssWithInvalidPartition)),
+                       allowed: false,
+               },
+               {
+                       name:    "empty specific names field when shuffler 
server of a rss object need specific upgrade",
+                       ar:      buildTestAdmissionReview(admissionv1.Update, 
nil, wrapTestRssObj(rssWithoutSpecificNames)),
+                       allowed: false,
+               },
+               {
+                       name:    "empty upgrade strategy type in shuffler 
server of a rss object",
+                       ar:      buildTestAdmissionReview(admissionv1.Update, 
nil, wrapTestRssObj(rssWithoutUpgradeStrategyType)),
+                       allowed: false,
+               },
+       } {
+               t.Run(tt.name, func(tc *testing.T) {
+                       updatedAR := testInspector.validateRSS(tt.ar)
+                       if !updatedAR.Response.Allowed {
+                               tc.Logf("==> message in result: %+v", 
updatedAR.Response.Result.Message)
+                       }
+                       if updatedAR.Response.Allowed != tt.allowed {
+                               tc.Errorf("invalid 'allowed' field in response: 
%v <> %v", updatedAR.Response.Allowed, tt.allowed)
+                       }
+               })
+       }
+}

Reply via email to