You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/04/05 15:15:05 UTC

[shardingsphere-on-cloud] branch main updated: chore(ci): add golangci-lint and refactor according to the result (#294)

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

zhonghongsheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git


The following commit(s) were added to refs/heads/main by this push:
     new c02a11e  chore(ci): add golangci-lint and refactor according to the result (#294)
c02a11e is described below

commit c02a11e40652b273e524ab38dcccea0886737211
Author: liyao <ma...@126.com>
AuthorDate: Wed Apr 5 23:14:58 2023 +0800

    chore(ci): add golangci-lint and refactor according to the result (#294)
    
    * chore: add golangci-lint check config and update Makefile for check
    
    * fix: fix according to golangci-lint
    
    * fix: rename Api to API
    
    * fix: fix sharedVolumeAndMountBuild SetVolumeMountSize non-zero slice
    
    * fix: remove overlapped Build method from shardingSphereProxyContainerBuilder
    
    * chore: add license header
---
 shardingsphere-operator/.golangci.yml              |  85 ++++++++++++++++
 shardingsphere-operator/Makefile                   |   9 ++
 .../api/v1alpha1/compute_node_types.go             |   3 +-
 .../api/v1alpha1/proxy_status.go                   |   7 +-
 .../pkg/controllers/compute_node_controller.go     |   4 +-
 .../controllers/compute_node_controller_test.go    | 111 +++++++++++++++++++++
 .../pkg/controllers/proxy_controller.go            |   2 +-
 .../pkg/controllers/proxyconfig_controller.go      |   2 +-
 .../pkg/reconcile/computenode/configmap.go         |   4 +-
 .../pkg/reconcile/computenode/configmap_test.go    |   4 +-
 .../pkg/reconcile/computenode/deployment.go        |  26 ++---
 .../pkg/reconcile/computenode/deployment_test.go   |  27 +++--
 .../pkg/reconcile/computenode/service.go           |  19 ++--
 .../pkg/reconcile/computenode/service_test.go      |   3 +-
 .../pkg/reconcile/proxy/deployment.go              |  12 +--
 .../pkg/reconcile/proxy/deployment_test.go         |   2 +-
 .../pkg/reconcile/proxy/service.go                 |   2 +-
 shardingsphere-operator/pkg/webhook/webhook.go     |  11 +-
 18 files changed, 265 insertions(+), 68 deletions(-)

diff --git a/shardingsphere-operator/.golangci.yml b/shardingsphere-operator/.golangci.yml
new file mode 100644
index 0000000..1b9b6ce
--- /dev/null
+++ b/shardingsphere-operator/.golangci.yml
@@ -0,0 +1,85 @@
+#
+# 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.
+#
+
+run:
+  timeout: 10m
+linters:
+  disable-all: true
+  enable:
+    - ineffassign
+    - typecheck
+    - varcheck
+    - unused
+    - structcheck
+    - deadcode
+    - gosimple
+    - goimports
+    - errcheck
+    - staticcheck
+    - stylecheck
+    - gosec
+    - asciicheck
+    - bodyclose
+    - exportloopref
+    - rowserrcheck
+    - makezero
+    - durationcheck
+    - prealloc
+    - predeclared
+
+# Refers: https://gist.github.com/maratori/47a4d00457a92aa426dbd48a18776322
+linters-settings:
+  cyclop:
+    # The maximal code complexity to report.
+    # Default: 10
+    max-complexity: 30
+    # The maximal average package complexity.
+    # If it's higher than 0.0 (float) the check is enabled
+    # Default: 0.0
+    package-average: 10.0
+  errcheck:
+    # Report about not checking of errors in type assertions: `a := b.(MyStruct)`.
+    # Such cases aren't reported by default.
+    # Default: false
+    check-type-assertions: true
+  exhaustive:
+    # Program elements to check for exhaustiveness.
+    # Default: [ switch ]
+    check:
+      - switch
+      - map
+  funlen:
+    # Checks the number of lines in a function.
+    # If lower than 0, disable the check.
+    # Default: 60
+    lines: 100
+    # Checks the number of statements in a function.
+    # If lower than 0, disable the check.
+    # Default: 40
+    statements: 50
+  gocognit:
+    # Minimal code complexity to report.
+    # Default: 30 (but we recommend 10-20)
+    min-complexity: 20
+issues:
+  exclude-rules:
+    - path: _test\.go
+      linters:
+        - errcheck
+        - gosec
+        - rowserrcheck
+        - makezero
diff --git a/shardingsphere-operator/Makefile b/shardingsphere-operator/Makefile
index 00096d0..3fc269a 100644
--- a/shardingsphere-operator/Makefile
+++ b/shardingsphere-operator/Makefile
@@ -111,6 +111,7 @@ $(LOCALBIN):
 KUSTOMIZE ?= $(LOCALBIN)/kustomize
 CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
 ENVTEST ?= $(LOCALBIN)/setup-envtest
+CHECK_LINT?= $(LOCALBIN)/setup-golangci-lint
 
 ## Tool Versions
 KUSTOMIZE_VERSION ?= v4.5.7
@@ -131,3 +132,11 @@ $(CONTROLLER_GEN): $(LOCALBIN)
 envtest: $(ENVTEST) ## Download envtest-setup locally if necessary.
 $(ENVTEST): $(LOCALBIN)
 	GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
+
+.PHONY: check
+check: check-lint 
+
+.PHONY: check-lint
+check-lint: $(CHECK_LINT) ## Download golangci-lint-setup locally if necessary.
+$(CHECK_LINT): $(LOCALBIN)
+	GOBIN=$(LOCALBIN) CGO_ENABLED=0 golangci-lint run -v
diff --git a/shardingsphere-operator/api/v1alpha1/compute_node_types.go b/shardingsphere-operator/api/v1alpha1/compute_node_types.go
index 7e9a550..9f07385 100644
--- a/shardingsphere-operator/api/v1alpha1/compute_node_types.go
+++ b/shardingsphere-operator/api/v1alpha1/compute_node_types.go
@@ -19,7 +19,6 @@ package v1alpha1
 
 import (
 	corev1 "k8s.io/api/core/v1"
-	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -274,7 +273,7 @@ type ComputeNodeSpec struct {
 	// +optional
 	Env []corev1.EnvVar `json:"env,omitempty"`
 	// +optional
-	Resources v1.ResourceRequirements `json:"resources,omitempty"`
+	Resources corev1.ResourceRequirements `json:"resources,omitempty"`
 	// +optional
 	PortBindings []PortBinding `json:"portBindings,omitempty" yaml:"portBinding"`
 
diff --git a/shardingsphere-operator/api/v1alpha1/proxy_status.go b/shardingsphere-operator/api/v1alpha1/proxy_status.go
index 3064141..238230f 100644
--- a/shardingsphere-operator/api/v1alpha1/proxy_status.go
+++ b/shardingsphere-operator/api/v1alpha1/proxy_status.go
@@ -19,7 +19,6 @@ package v1alpha1
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 type PhaseStatus string
@@ -67,7 +66,7 @@ type Conditions []Condition
 // | NotReady      | Failed     | ShardingSphere-Proxy failed to start correctly due to some problems|
 
 type Condition struct {
-	Type           ConditionType      `json:"type"`
-	Status         v1.ConditionStatus `json:"status"`
-	LastUpdateTime metav1.Time        `json:"lastUpdateTime,omitempty"`
+	Type           ConditionType          `json:"type"`
+	Status         metav1.ConditionStatus `json:"status"`
+	LastUpdateTime metav1.Time            `json:"lastUpdateTime,omitempty"`
 }
diff --git a/shardingsphere-operator/pkg/controllers/compute_node_controller.go b/shardingsphere-operator/pkg/controllers/compute_node_controller.go
index 2cc0a86..9fb84a7 100644
--- a/shardingsphere-operator/pkg/controllers/compute_node_controller.go
+++ b/shardingsphere-operator/pkg/controllers/compute_node_controller.go
@@ -298,7 +298,7 @@ func newConditions(conditions []v1alpha1.ComputeNodeCondition, cond v1alpha1.Com
 	}
 
 	found := false
-	for idx, _ := range conditions {
+	for idx := range conditions {
 		if conditions[idx].Type == cond.Type {
 			conditions[idx].LastUpdateTime = cond.LastUpdateTime
 			conditions[idx].Status = cond.Status
@@ -321,7 +321,7 @@ func updateReadyConditions(conditions []v1alpha1.ComputeNodeCondition, cond v1al
 func updateNotReadyConditions(conditions []v1alpha1.ComputeNodeCondition, cond v1alpha1.ComputeNodeCondition) []v1alpha1.ComputeNodeCondition {
 	cur := newConditions(conditions, cond)
 
-	for idx, _ := range cur {
+	for idx := range cur {
 		if cur[idx].Type == v1alpha1.ComputeNodeConditionReady {
 			cur[idx].LastUpdateTime = metav1.Now()
 			cur[idx].Status = v1alpha1.ConditionStatusFalse
diff --git a/shardingsphere-operator/pkg/controllers/compute_node_controller_test.go b/shardingsphere-operator/pkg/controllers/compute_node_controller_test.go
new file mode 100644
index 0000000..7b791f4
--- /dev/null
+++ b/shardingsphere-operator/pkg/controllers/compute_node_controller_test.go
@@ -0,0 +1,111 @@
+/*
+ * 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 controllers
+
+import (
+	"testing"
+
+	v1 "k8s.io/api/core/v1"
+)
+
+func Test_GetReadyProxyInstances(t *testing.T) {
+	// create sample PodList
+	podlist := v1.PodList{
+		Items: []v1.Pod{
+			{
+				Status: v1.PodStatus{
+					Phase: v1.PodRunning,
+					Conditions: []v1.PodCondition{
+						{
+							Type:   v1.PodReady,
+							Status: v1.ConditionTrue,
+						},
+					},
+					ContainerStatuses: []v1.ContainerStatus{
+						{
+							Name:  "shardingsphere-proxy",
+							Ready: true,
+						},
+					},
+				},
+			},
+			{
+				Status: v1.PodStatus{
+					Phase: v1.PodRunning,
+					Conditions: []v1.PodCondition{
+						{
+							Type:   v1.PodReady,
+							Status: v1.ConditionTrue,
+						},
+					},
+					ContainerStatuses: []v1.ContainerStatus{
+						{
+							Name:  "another-container",
+							Ready: true,
+						},
+					},
+				},
+			},
+			{
+				Status: v1.PodStatus{
+					Phase: v1.PodRunning,
+					Conditions: []v1.PodCondition{
+						{
+							Type:   v1.PodReady,
+							Status: v1.ConditionFalse,
+						},
+					},
+					ContainerStatuses: []v1.ContainerStatus{
+						{
+							Name:  "shardingsphere-proxy",
+							Ready: false,
+						},
+					},
+				},
+			},
+			{
+				Status: v1.PodStatus{
+					Phase: v1.PodPending,
+					Conditions: []v1.PodCondition{
+						{
+							Type:   v1.PodReady,
+							Status: v1.ConditionTrue,
+						},
+					},
+					ContainerStatuses: []v1.ContainerStatus{
+						{
+							Name:  "shardingsphere-proxy",
+							Ready: true,
+						},
+					},
+				},
+			},
+		},
+	}
+
+	// expected result is 1 because only one pod has a ready shardingsphere-proxy container
+	expected := int32(1)
+
+	// call the function to get the actual result
+	actual := getReadyProxyInstances(podlist)
+
+	// compare the expected and actual results
+	if actual != expected {
+		t.Errorf("getReadyInstances returned %d, expected %d", actual, expected)
+	}
+}
diff --git a/shardingsphere-operator/pkg/controllers/proxy_controller.go b/shardingsphere-operator/pkg/controllers/proxy_controller.go
index c970393..3bddc73 100644
--- a/shardingsphere-operator/pkg/controllers/proxy_controller.go
+++ b/shardingsphere-operator/pkg/controllers/proxy_controller.go
@@ -66,7 +66,7 @@ type ProxyReconciler struct {
 // move the current state of the cluster closer to the desired state.
 
 func (r *ProxyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
-	logger := r.Log.WithValues(computeNodeControllerName, req.NamespacedName)
+	logger := r.Log.WithValues(proxyControllerName, req.NamespacedName)
 
 	rt, err := r.getRuntimeShardingSphereProxy(ctx, req.NamespacedName)
 	if apierrors.IsNotFound(err) {
diff --git a/shardingsphere-operator/pkg/controllers/proxyconfig_controller.go b/shardingsphere-operator/pkg/controllers/proxyconfig_controller.go
index 2cb41bc..cb960ab 100644
--- a/shardingsphere-operator/pkg/controllers/proxyconfig_controller.go
+++ b/shardingsphere-operator/pkg/controllers/proxyconfig_controller.go
@@ -60,7 +60,7 @@ type ProxyConfigReconciler struct {
 // For more details, check Reconcile and its Result here:
 // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.11.0/pkg/reconcile
 func (r *ProxyConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
-	logger := r.Log.WithValues(computeNodeControllerName, req.NamespacedName)
+	logger := r.Log.WithValues(proxyConfigControllerName, req.NamespacedName)
 
 	run := &shardingspherev1alpha1.ShardingSphereProxyServerConfig{}
 	err := r.Get(ctx, req.NamespacedName, run)
diff --git a/shardingsphere-operator/pkg/reconcile/computenode/configmap.go b/shardingsphere-operator/pkg/reconcile/computenode/configmap.go
index 8a2d532..f59ccb3 100644
--- a/shardingsphere-operator/pkg/reconcile/computenode/configmap.go
+++ b/shardingsphere-operator/pkg/reconcile/computenode/configmap.go
@@ -61,7 +61,9 @@ func NewConfigMap(cn *v1alpha1.ComputeNode) *v1.ConfigMap {
 		servconf := cn.Spec.Bootstrap.ServerConfig.DeepCopy()
 		if cn.Spec.Bootstrap.ServerConfig.Mode.Type == v1alpha1.ModeTypeCluster {
 			if len(cluster) > 0 {
-				json.Unmarshal([]byte(cluster), &servconf.Mode.Repository)
+				if err := json.Unmarshal([]byte(cluster), &servconf.Mode.Repository); err != nil {
+					return &v1.ConfigMap{}
+				}
 			}
 		}
 		if y, err := yaml.Marshal(servconf); err == nil {
diff --git a/shardingsphere-operator/pkg/reconcile/computenode/configmap_test.go b/shardingsphere-operator/pkg/reconcile/computenode/configmap_test.go
index d2fd027..3574a68 100644
--- a/shardingsphere-operator/pkg/reconcile/computenode/configmap_test.go
+++ b/shardingsphere-operator/pkg/reconcile/computenode/configmap_test.go
@@ -28,8 +28,8 @@ import (
 
 var _ = Describe("ConfigMap", func() {
 	var (
-		expect *corev1.ConfigMap     = &corev1.ConfigMap{}
-		cn     *v1alpha1.ComputeNode = &v1alpha1.ComputeNode{
+		expect = &corev1.ConfigMap{}
+		cn     = &v1alpha1.ComputeNode{
 			ObjectMeta: metav1.ObjectMeta{
 				Name:      "test_name",
 				Namespace: "test_namespace",
diff --git a/shardingsphere-operator/pkg/reconcile/computenode/deployment.go b/shardingsphere-operator/pkg/reconcile/computenode/deployment.go
index f54d81c..96c655d 100644
--- a/shardingsphere-operator/pkg/reconcile/computenode/deployment.go
+++ b/shardingsphere-operator/pkg/reconcile/computenode/deployment.go
@@ -22,7 +22,6 @@ import (
 
 	"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
 	appsv1 "k8s.io/api/apps/v1"
-	v1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
@@ -94,11 +93,6 @@ func NewShardingSphereProxyContainerBuilder() ShardingSphereProxyContainerBuilde
 	}
 }
 
-// Build returns a Container
-func (b *shardingSphereProxyContainerBuilder) Build() *corev1.Container {
-	return b.ContainerBuilder.Build()
-}
-
 // BootstrapContainerBuilder returns a Container for initialization
 // The container will handle initilialization in Pod's InitContainer
 type BootstrapContainerBuilder interface {
@@ -406,7 +400,7 @@ func (b *sharedVolumeAndMountBuilder) SetVolumeMountSize(size int) SharedVolumeA
 	if len(b.volumeMounts) != size {
 		vms := make([]*corev1.VolumeMount, size)
 		for vm := range b.volumeMounts {
-			vms = append(vms, b.volumeMounts[vm].DeepCopy())
+			vms[vm] = b.volumeMounts[vm].DeepCopy()
 		}
 		b.volumeMounts = vms
 	}
@@ -541,7 +535,7 @@ func (d *deploymentBuilder) Build() *appsv1.Deployment {
 }
 
 // NewDeployment creates a new Deployment
-func NewDeployment(cn *v1alpha1.ComputeNode) *v1.Deployment {
+func NewDeployment(cn *v1alpha1.ComputeNode) *appsv1.Deployment {
 	builder := NewDeploymentBuilder(cn.GetObjectMeta(), cn.GetObjectKind().GroupVersionKind())
 	builder.SetName(cn.Name).SetNamespace(cn.Namespace).SetLabelsAndSelectors(cn.Labels, cn.Spec.Selector).SetAnnotations(cn.Annotations).SetReplicas(&cn.Spec.Replicas)
 
@@ -681,11 +675,11 @@ func (d *deploymentBuilder) SetAgentBin(scb ContainerBuilder, cn *v1alpha1.Compu
 }
 
 // DefaultDeployment describes the default deployment
-func DefaultDeployment(meta metav1.Object, gvk schema.GroupVersionKind) *v1.Deployment {
+func DefaultDeployment(meta metav1.Object, gvk schema.GroupVersionKind) *appsv1.Deployment {
 	defaultMaxUnavailable := intstr.FromInt(0)
 	defaultMaxSurge := intstr.FromInt(3)
 
-	return &v1.Deployment{
+	return &appsv1.Deployment{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      "shardingsphere-proxy",
 			Namespace: "default",
@@ -694,10 +688,10 @@ func DefaultDeployment(meta metav1.Object, gvk schema.GroupVersionKind) *v1.Depl
 				*metav1.NewControllerRef(meta, gvk),
 			},
 		},
-		Spec: v1.DeploymentSpec{
-			Strategy: v1.DeploymentStrategy{
-				Type: v1.RollingUpdateDeploymentStrategyType,
-				RollingUpdate: &v1.RollingUpdateDeployment{
+		Spec: appsv1.DeploymentSpec{
+			Strategy: appsv1.DeploymentStrategy{
+				Type: appsv1.RollingUpdateDeploymentStrategyType,
+				RollingUpdate: &appsv1.RollingUpdateDeployment{
 					MaxUnavailable: &defaultMaxUnavailable,
 					MaxSurge:       &defaultMaxSurge,
 				},
@@ -742,8 +736,8 @@ func DefaultDeployment(meta metav1.Object, gvk schema.GroupVersionKind) *v1.Depl
 }
 
 // UpdateDeployment updates the deployment
-func UpdateDeployment(cn *v1alpha1.ComputeNode, cur *v1.Deployment) *v1.Deployment {
-	exp := &v1.Deployment{}
+func UpdateDeployment(cn *v1alpha1.ComputeNode, cur *appsv1.Deployment) *appsv1.Deployment {
+	exp := &appsv1.Deployment{}
 	exp.ObjectMeta = cur.ObjectMeta
 	exp.ObjectMeta.ResourceVersion = ""
 	exp.Labels = cur.Labels
diff --git a/shardingsphere-operator/pkg/reconcile/computenode/deployment_test.go b/shardingsphere-operator/pkg/reconcile/computenode/deployment_test.go
index 5cfb738..c49e1b1 100644
--- a/shardingsphere-operator/pkg/reconcile/computenode/deployment_test.go
+++ b/shardingsphere-operator/pkg/reconcile/computenode/deployment_test.go
@@ -24,7 +24,6 @@ import (
 	"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
 	"github.com/stretchr/testify/assert"
 	appsv1 "k8s.io/api/apps/v1"
-	v1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
@@ -38,7 +37,7 @@ func Test_NewDeployment(t *testing.T) {
 	cases := []struct {
 		id      int
 		cn      *v1alpha1.ComputeNode
-		exp     *v1.Deployment
+		exp     *appsv1.Deployment
 		message string
 	}{
 		{
@@ -105,7 +104,7 @@ func Test_NewDeployment(t *testing.T) {
 					},
 				},
 			},
-			exp: &v1.Deployment{
+			exp: &appsv1.Deployment{
 				ObjectMeta: metav1.ObjectMeta{
 					Name:      "test-name",
 					Namespace: "test-namespace",
@@ -117,11 +116,11 @@ func Test_NewDeployment(t *testing.T) {
 						"anno1": "value1",
 					},
 				},
-				Spec: v1.DeploymentSpec{
+				Spec: appsv1.DeploymentSpec{
 					Replicas: &defaultReplicas,
-					Strategy: v1.DeploymentStrategy{
-						Type: v1.RollingUpdateDeploymentStrategyType,
-						RollingUpdate: &v1.RollingUpdateDeployment{
+					Strategy: appsv1.DeploymentStrategy{
+						Type: appsv1.RollingUpdateDeploymentStrategyType,
+						RollingUpdate: &appsv1.RollingUpdateDeployment{
 							MaxUnavailable: &defaultMaxUnavailable,
 							MaxSurge:       &defaultMaxSurge,
 						},
@@ -265,7 +264,7 @@ func Test_NewDeployment(t *testing.T) {
 					},
 				},
 			},
-			exp: &v1.Deployment{
+			exp: &appsv1.Deployment{
 				ObjectMeta: metav1.ObjectMeta{
 					Name:      "test-java-agent",
 					Namespace: "test-namespace",
@@ -276,11 +275,11 @@ func Test_NewDeployment(t *testing.T) {
 						"anno1": "value1",
 					},
 				},
-				Spec: v1.DeploymentSpec{
+				Spec: appsv1.DeploymentSpec{
 					Replicas: &defaultReplicas,
-					Strategy: v1.DeploymentStrategy{
-						Type: v1.RollingUpdateDeploymentStrategyType,
-						RollingUpdate: &v1.RollingUpdateDeployment{
+					Strategy: appsv1.DeploymentStrategy{
+						Type: appsv1.RollingUpdateDeploymentStrategyType,
+						RollingUpdate: &appsv1.RollingUpdateDeployment{
 							MaxUnavailable: &defaultMaxUnavailable,
 							MaxSurge:       &defaultMaxSurge,
 						},
@@ -432,14 +431,14 @@ func assertObjectMeta(t *testing.T, exp, act metav1.ObjectMeta) bool {
 		assert.Equal(t, exp.Labels, act.Labels, "labels should be equal")
 }
 
-func assertDeploymentSpec(t *testing.T, exp, act v1.DeploymentSpec) bool {
+func assertDeploymentSpec(t *testing.T, exp, act appsv1.DeploymentSpec) bool {
 	return assertRollingUpdateDeployment(t, *exp.Strategy.RollingUpdate, *act.Strategy.RollingUpdate) &&
 		assert.Equal(t, exp.Selector, act.Selector, "selectors should be equal") &&
 		assert.Equal(t, exp.Replicas, act.Replicas, "replicas should be equal") &&
 		assertTemplateSpec(t, exp.Template, act.Template)
 }
 
-func assertRollingUpdateDeployment(t *testing.T, exp, act v1.RollingUpdateDeployment) bool {
+func assertRollingUpdateDeployment(t *testing.T, exp, act appsv1.RollingUpdateDeployment) bool {
 	return assert.Equal(t, exp.MaxSurge, act.MaxSurge, "maxSurge should be equal") &&
 		assert.Equal(t, exp.MaxUnavailable, act.MaxUnavailable, "maxUnavailable should be equal")
 }
diff --git a/shardingsphere-operator/pkg/reconcile/computenode/service.go b/shardingsphere-operator/pkg/reconcile/computenode/service.go
index 4b01c95..0f52225 100644
--- a/shardingsphere-operator/pkg/reconcile/computenode/service.go
+++ b/shardingsphere-operator/pkg/reconcile/computenode/service.go
@@ -20,18 +20,17 @@ package computenode
 import (
 	"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
 	corev1 "k8s.io/api/core/v1"
-	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
 
 // NewService returns a new Service
-func NewService(cn *v1alpha1.ComputeNode) *v1.Service {
+func NewService(cn *v1alpha1.ComputeNode) *corev1.Service {
 	builder := NewServiceBuilder(cn.GetObjectMeta(), cn.GetObjectKind().GroupVersionKind())
 	builder.SetName(cn.Name).SetNamespace(cn.Namespace).SetLabelsAndSelectors(cn.Labels, cn.Spec.Selector).SetAnnotations(cn.Annotations).SetType(cn.Spec.ServiceType)
 
-	ports := []v1.ServicePort{}
+	ports := []corev1.ServicePort{}
 	for _, pb := range cn.Spec.PortBindings {
 		ports = append(ports, corev1.ServicePort{
 			Name:       pb.Name,
@@ -100,7 +99,7 @@ func (s *serviceBuilder) SetType(t corev1.ServiceType) ServiceBuilder {
 // SetPorts sets ports of Service
 func (s *serviceBuilder) SetPorts(ports []corev1.ServicePort) ServiceBuilder {
 	if s.service.Spec.Ports == nil {
-		s.service.Spec.Ports = []v1.ServicePort{}
+		s.service.Spec.Ports = []corev1.ServicePort{}
 	}
 	s.service.Spec.Ports = ports
 	return s
@@ -112,8 +111,8 @@ func (s *serviceBuilder) Build() *corev1.Service {
 }
 
 // DefaultService returns the default Service
-func DefaultService(meta metav1.Object, gvk schema.GroupVersionKind) *v1.Service {
-	return &v1.Service{
+func DefaultService(meta metav1.Object, gvk schema.GroupVersionKind) *corev1.Service {
+	return &corev1.Service{
 		ObjectMeta: metav1.ObjectMeta{
 			Name:      "shardingsphere-proxy",
 			Namespace: "default",
@@ -122,16 +121,16 @@ func DefaultService(meta metav1.Object, gvk schema.GroupVersionKind) *v1.Service
 				*metav1.NewControllerRef(meta, gvk),
 			},
 		},
-		Spec: v1.ServiceSpec{
+		Spec: corev1.ServiceSpec{
 			Selector: map[string]string{},
-			Type:     v1.ServiceTypeClusterIP,
+			Type:     corev1.ServiceTypeClusterIP,
 		},
 	}
 }
 
 // UpdateService update Service
-func UpdateService(cn *v1alpha1.ComputeNode, cur *v1.Service) *v1.Service {
-	exp := &v1.Service{}
+func UpdateService(cn *v1alpha1.ComputeNode, cur *corev1.Service) *corev1.Service {
+	exp := &corev1.Service{}
 	exp.ObjectMeta = cur.ObjectMeta
 	exp.Labels = cur.Labels
 	exp.Annotations = cur.Annotations
diff --git a/shardingsphere-operator/pkg/reconcile/computenode/service_test.go b/shardingsphere-operator/pkg/reconcile/computenode/service_test.go
index 84db296..924b808 100644
--- a/shardingsphere-operator/pkg/reconcile/computenode/service_test.go
+++ b/shardingsphere-operator/pkg/reconcile/computenode/service_test.go
@@ -25,7 +25,6 @@ import (
 	"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
 	"github.com/stretchr/testify/assert"
 	corev1 "k8s.io/api/core/v1"
-	v1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 )
@@ -239,7 +238,7 @@ func TestUpdateService(t *testing.T) {
 	cur.ObjectMeta = metav1.ObjectMeta{Name: "test-service", Namespace: "test-ns"}
 	cur.Labels = map[string]string{"key": "val"}
 	cur.Annotations = map[string]string{"anno": "val"}
-	cur.Spec = corev1.ServiceSpec{ClusterIP: "10.96.0.1", Ports: []v1.ServicePort{{Name: "test-port", Port: 80}}}
+	cur.Spec = corev1.ServiceSpec{ClusterIP: "10.96.0.1", Ports: []corev1.ServicePort{{Name: "test-port", Port: 80}}}
 
 	exp := &corev1.Service{}
 	// Setting up some expected data for exp instance
diff --git a/shardingsphere-operator/pkg/reconcile/proxy/deployment.go b/shardingsphere-operator/pkg/reconcile/proxy/deployment.go
index 604a52d..22027e8 100644
--- a/shardingsphere-operator/pkg/reconcile/proxy/deployment.go
+++ b/shardingsphere-operator/pkg/reconcile/proxy/deployment.go
@@ -259,7 +259,7 @@ func updatePodTemplateSpec(proxy *v1alpha1.ShardingSphereProxy, act *v1.Deployme
 	exp := act.Spec.Template.DeepCopy()
 
 	SSProxyContainer := updateSSProxyContainer(proxy, act)
-	for i, _ := range exp.Spec.Containers {
+	for i := range exp.Spec.Containers {
 		if exp.Spec.Containers[i].Name == "proxy" {
 			exp.Spec.Containers[i] = *SSProxyContainer
 		}
@@ -267,7 +267,7 @@ func updatePodTemplateSpec(proxy *v1alpha1.ShardingSphereProxy, act *v1.Deployme
 
 	if proxy.Spec.MySQLDriver != nil {
 		initContainer := updateInitContainer(proxy, act)
-		for i, _ := range exp.Spec.InitContainers {
+		for i := range exp.Spec.InitContainers {
 			if exp.Spec.InitContainers[i].Name == "download-mysql-connect" {
 				exp.Spec.InitContainers[i] = *initContainer
 			}
@@ -292,7 +292,7 @@ func updateInitContainer(proxy *v1alpha1.ShardingSphereProxy, act *v1.Deployment
 
 	for _, c := range act.Spec.Template.Spec.InitContainers {
 		if c.Name == "download-mysql-connect" {
-			for i, _ := range c.Env {
+			for i := range c.Env {
 				if c.Env[i].Name == "VERSION" {
 					if c.Env[i].Value != proxy.Spec.MySQLDriver.Version {
 						c.Env[i].Value = proxy.Spec.MySQLDriver.Version
@@ -332,7 +332,7 @@ func updateSSProxyContainer(proxy *v1alpha1.ShardingSphereProxy, act *v1.Deploym
 				exp.StartupProbe = proxy.Spec.StartupProbe
 			}
 
-			for i, _ := range c.Env {
+			for i := range c.Env {
 				if c.Env[i].Name == "PORT" {
 					proxyPort := strconv.FormatInt(int64(proxy.Spec.Port), 10)
 					if c.Env[i].Value != proxyPort {
@@ -403,7 +403,7 @@ func newConditions(conditions []v1alpha1.Condition, cond v1alpha1.Condition) []v
 	}
 
 	found := false
-	for idx, _ := range conditions {
+	for idx := range conditions {
 		if conditions[idx].Type == cond.Type {
 			conditions[idx].LastUpdateTime = cond.LastUpdateTime
 			conditions[idx].Status = cond.Status
@@ -426,7 +426,7 @@ func updateReadyConditions(conditions []v1alpha1.Condition, cond v1alpha1.Condit
 func updateNotReadyConditions(conditions []v1alpha1.Condition, cond v1alpha1.Condition) []v1alpha1.Condition {
 	cur := newConditions(conditions, cond)
 
-	for idx, _ := range cur {
+	for idx := range cur {
 		if cur[idx].Type == v1alpha1.ConditionReady {
 			cur[idx].LastUpdateTime = metav1.Now()
 			cur[idx].Status = metav1.ConditionFalse
diff --git a/shardingsphere-operator/pkg/reconcile/proxy/deployment_test.go b/shardingsphere-operator/pkg/reconcile/proxy/deployment_test.go
index 0c8b6d8..78dc4b3 100644
--- a/shardingsphere-operator/pkg/reconcile/proxy/deployment_test.go
+++ b/shardingsphere-operator/pkg/reconcile/proxy/deployment_test.go
@@ -760,7 +760,7 @@ func assertConditions(t *testing.T, exp, act []v1alpha1.Condition, message strin
 	if !assert.Equal(t, len(exp), len(act), message) {
 		return false
 	}
-	for idx, _ := range exp {
+	for idx := range exp {
 		if !assert.Equal(t, exp[idx].Type, act[idx].Type, message) {
 			return false
 		}
diff --git a/shardingsphere-operator/pkg/reconcile/proxy/service.go b/shardingsphere-operator/pkg/reconcile/proxy/service.go
index 4a3c852..33157da 100644
--- a/shardingsphere-operator/pkg/reconcile/proxy/service.go
+++ b/shardingsphere-operator/pkg/reconcile/proxy/service.go
@@ -66,7 +66,7 @@ func ConstructCascadingService(proxy *v1alpha1.ShardingSphereProxy) *v1.Service
 
 // UpdateService updates the specified service with ShardingSphereProxy
 func UpdateService(proxy *v1alpha1.ShardingSphereProxy, runtimeService *v1.Service) *v1.Service {
-	exp := &v1.Service{}
+	var exp *v1.Service
 	runtimeService.Spec.Type = proxy.Spec.ServiceType.Type
 	runtimeService.Spec.Ports[0].Port = proxy.Spec.Port
 	runtimeService.Spec.Ports[0].TargetPort = fromInt32(proxy.Spec.Port)
diff --git a/shardingsphere-operator/pkg/webhook/webhook.go b/shardingsphere-operator/pkg/webhook/webhook.go
index 64df338..4144677 100644
--- a/shardingsphere-operator/pkg/webhook/webhook.go
+++ b/shardingsphere-operator/pkg/webhook/webhook.go
@@ -19,17 +19,18 @@ package webhook
 
 import (
 	"errors"
+	"net/http"
+	"net/url"
+	"strings"
+
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/client-go/rest"
-	"net/http"
-	"net/url"
 	"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
 	logf "sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/conversion"
-	"strings"
 )
 
 var log = logf.Log.WithName("builder")
@@ -205,10 +206,10 @@ func (blder *WebhookBuilder) isAlreadyHandled(path string) bool {
 }
 
 func (blder *WebhookBuilder) registerApiservice() {
-	blder.mgr.GetWebhookServer().Register(apiPath, getApiService())
+	blder.mgr.GetWebhookServer().Register(apiPath, getAPIService())
 }
 
-func getApiService() http.HandlerFunc {
+func getAPIService() http.HandlerFunc {
 	return func(w http.ResponseWriter, r *http.Request) {
 		w.Header().Set("Content-Type", "application/json")
 		_, _ = w.Write([]byte("{}"))