diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index 972bf51..7cb20b1 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -22,6 +22,10 @@
     branches:
       - master
 
+concurrency:
+  group: swck-${{ github.event.pull_request.number || github.ref }}
+  cancel-in-progress: true
+
 jobs:
   check:
     name: Check
diff --git a/docs/operator.md b/docs/operator.md
index 2ae7413..c9ba27b 100644
--- a/docs/operator.md
+++ b/docs/operator.md
@@ -59,7 +59,6 @@
 
 If you want to custom the manifests templates to generate dedicated Kubernetes resources,
 please edit YAMLs in `pkg/operator/manifests`.
-After saving your changes, issue `make update-templates` to transfer them to binary assets.
 The last step is to rebuild `operator` by `make -C operator docker-build`.
 
 
@@ -110,4 +109,4 @@
 - [Fetch metrics from the Istio control plane(istiod)](./examples/istio-controlplane.md)
 - [Inject the java agent to pods](./examples/java-agent-injector-usage.md)
 - [Deploy a storage](./examples/storage.md)
-- [Deploy a Satellite](./examples/satellite.md)
\ No newline at end of file
+- [Deploy a Satellite](./examples/satellite.md)
diff --git a/hack/run_update_templates.sh b/hack/run_update_templates.sh
deleted file mode 100755
index fd94cd0..0000000
--- a/hack/run_update_templates.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/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 -ue
-
-
-OUT_DIR=$(mktemp -d -t swck-templates.XXXXXXXXXX) || { echo "Failed to create temp file"; exit 1; }
-
-SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-
-GOBINDATA="${SCRIPTPATH}"/../bin/go-bindata
-
-ROOTDIR="${SCRIPTPATH}/../operator"
-OPERATOR_DIR="${ROOTDIR}"/pkg/operator
-INSTALLER_DIR="${OPERATOR_DIR}"/manifests
-GEN_PATH="${OPERATOR_DIR}"/repo/assets.gen.go
-
-rm -f "${GEN_PATH}"
-mkdir -p "${OUT_DIR}"
-
-for comp in $(ls ${INSTALLER_DIR});
-do
-    cp -Rf "${INSTALLER_DIR}"/"${comp}" "${OUT_DIR}"
-done
-
-set +u
-
-cd "${OUT_DIR}"
-set +e
-rm -f *.bak
-set -e
-"${GOBINDATA}" --nocompress --nometadata --pkg repo -o "${GEN_PATH}" ./...
-
-rm -Rf "${OUT_DIR}"
-
-bash ${SCRIPTPATH}/build-header.sh "${OPERATOR_DIR}"/pkg/operator/repo/assets.gen.go
diff --git a/operator/Makefile b/operator/Makefile
index d18fc45..592bac2 100644
--- a/operator/Makefile
+++ b/operator/Makefile
@@ -40,7 +40,7 @@
 
 ##@ Development
 
-generate: generate-deep manifests update-templates ## Generate codes and manifests
+generate: generate-deep manifests ## Generate codes and manifests
 	$(MAKE) format
 
 .PHONY: manifests
@@ -56,17 +56,6 @@
 test: generate format envtest ## Run tests.
 	KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test ./... -coverprofile cover.out
 
-
-GO_BINDATA := $(tool_bin)/go-bindata
-$(GO_BINDATA):
-	curl --location --output $(GO_BINDATA) https://github.com/kevinburke/go-bindata/releases/download/v3.21.0/go-bindata-$(OSNAME)-amd64 \
-		&& chmod +x $(GO_BINDATA)
-
-update-templates: $(GO_BINDATA) ## Update templates
-	@echo updating charts
-	-$(root_dir)/hack/run_update_templates.sh
-	-$(root_dir)/hack/build-header.sh pkg/operator/repo/assets.gen.go
-
 ##@ Build
 
 .PHONY: build
diff --git a/operator/config/crd/bases/operator.skywalking.apache.org_fetchers.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_fetchers.yaml
index 596e7d5..beebdf9 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_fetchers.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_fetchers.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
diff --git a/operator/config/crd/bases/operator.skywalking.apache.org_javaagents.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_javaagents.yaml
index 8cab91a..848f70b 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_javaagents.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_javaagents.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
diff --git a/operator/config/crd/bases/operator.skywalking.apache.org_oapservers.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_oapservers.yaml
index 4d4670e..a03720f 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_oapservers.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_oapservers.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
diff --git a/operator/config/crd/bases/operator.skywalking.apache.org_satellites.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_satellites.yaml
index a1e6318..1483b6e 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_satellites.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_satellites.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
diff --git a/operator/config/crd/bases/operator.skywalking.apache.org_storages.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_storages.yaml
index a9caa6c..fcf89ab 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_storages.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_storages.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
diff --git a/operator/config/crd/bases/operator.skywalking.apache.org_uis.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_uis.yaml
index ed4a3b8..d9af6db 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_uis.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_uis.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
diff --git a/operator/config/rbac/role.yaml b/operator/config/rbac/role.yaml
index 5b870ff..bb18d8a 100644
--- a/operator/config/rbac/role.yaml
+++ b/operator/config/rbac/role.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
diff --git a/operator/config/webhook/manifests.yaml b/operator/config/webhook/manifests.yaml
index fb8d197..1d301d3 100644
--- a/operator/config/webhook/manifests.yaml
+++ b/operator/config/webhook/manifests.yaml
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
+
 ---
 apiVersion: admissionregistration.k8s.io/v1
 kind: MutatingWebhookConfiguration
diff --git a/operator/main.go b/operator/main.go
index c012a6e..4806dad 100644
--- a/operator/main.go
+++ b/operator/main.go
@@ -37,7 +37,7 @@
 	operatorcontroller "github.com/apache/skywalking-swck/operator/controllers/operator"
 	operatorcontrollers "github.com/apache/skywalking-swck/operator/controllers/operator"
 	"github.com/apache/skywalking-swck/operator/pkg/operator/injector"
-	"github.com/apache/skywalking-swck/operator/pkg/operator/repo"
+	"github.com/apache/skywalking-swck/operator/pkg/operator/manifests"
 	//+kubebuilder:scaffold:imports
 )
 
@@ -84,7 +84,7 @@
 	if err = (&operatorcontroller.OAPServerReconciler{
 		Client:   mgr.GetClient(),
 		Scheme:   mgr.GetScheme(),
-		FileRepo: repo.NewRepo("oapserver"),
+		FileRepo: manifests.NewRepo("oapserver"),
 		Recorder: mgr.GetEventRecorderFor("oapserver-controller"),
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "OAPServer")
@@ -93,7 +93,7 @@
 	if err = (&operatorcontroller.UIReconciler{
 		Client:   mgr.GetClient(),
 		Scheme:   mgr.GetScheme(),
-		FileRepo: repo.NewRepo("ui"),
+		FileRepo: manifests.NewRepo("ui"),
 		Recorder: mgr.GetEventRecorderFor("oapserver-controller"),
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "UI")
@@ -102,7 +102,7 @@
 	if err = (&operatorcontroller.FetcherReconciler{
 		Client:   mgr.GetClient(),
 		Scheme:   mgr.GetScheme(),
-		FileRepo: repo.NewRepo("fetcher"),
+		FileRepo: manifests.NewRepo("fetcher"),
 		Recorder: mgr.GetEventRecorderFor("fetcher-controller"),
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "Fetcher")
@@ -111,7 +111,7 @@
 	if err = (&operatorcontroller.StorageReconciler{
 		Client:     mgr.GetClient(),
 		Scheme:     mgr.GetScheme(),
-		FileRepo:   repo.NewRepo("storage"),
+		FileRepo:   manifests.NewRepo("storage"),
 		RestConfig: mgr.GetConfig(),
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "Storage")
@@ -120,7 +120,7 @@
 	if err = (&operatorcontroller.ConfigMapReconciler{
 		Client:   mgr.GetClient(),
 		Scheme:   mgr.GetScheme(),
-		FileRepo: repo.NewRepo("injector"),
+		FileRepo: manifests.NewRepo("injector"),
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "ConfigMap")
 		os.Exit(1)
@@ -128,7 +128,7 @@
 	if err = (&operatorcontroller.JavaAgentReconciler{
 		Client:   mgr.GetClient(),
 		Scheme:   mgr.GetScheme(),
-		FileRepo: repo.NewRepo("injector"),
+		FileRepo: manifests.NewRepo("injector"),
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "JavaAgent")
 		os.Exit(1)
@@ -137,7 +137,7 @@
 	if err = (&operatorcontrollers.SatelliteReconciler{
 		Client:   mgr.GetClient(),
 		Scheme:   mgr.GetScheme(),
-		FileRepo: repo.NewRepo("satellite"),
+		FileRepo: manifests.NewRepo("satellite"),
 		Recorder: mgr.GetEventRecorderFor("satellite-controller"),
 	}).SetupWithManager(mgr); err != nil {
 		setupLog.Error(err, "unable to create controller", "controller", "Satellite")
diff --git a/operator/pkg/operator/injector/annotation.go b/operator/pkg/operator/injector/annotation.go
index 1fe9ffe..4a97760 100644
--- a/operator/pkg/operator/injector/annotation.go
+++ b/operator/pkg/operator/injector/annotation.go
@@ -23,7 +23,7 @@
 
 	"github.com/ghodss/yaml"
 
-	"github.com/apache/skywalking-swck/operator/pkg/operator/repo"
+	"github.com/apache/skywalking-swck/operator/pkg/operator/manifests"
 )
 
 // Annotation defines configuration that user can overlay, including
@@ -47,12 +47,12 @@
 	Annotations []Annotation
 }
 
-//AnnotationOverlay is used to set overlaied value
+// AnnotationOverlay is used to set overlaied value
 type AnnotationOverlay map[Annotation]string
 
 // NewAnnotations will create a new AnnotationOverlay
 func NewAnnotations() (*Annotations, error) {
-	fileRepo := repo.NewRepo("injector")
+	fileRepo := manifests.NewRepo("injector")
 	data, err := fileRepo.ReadFile("injector/templates/annotations.yaml")
 	if err != nil {
 		return nil, err
@@ -76,13 +76,13 @@
 	return anno
 }
 
-//NewAnnotationOverlay will create a new AnnotationOverlay
+// NewAnnotationOverlay will create a new AnnotationOverlay
 func NewAnnotationOverlay() *AnnotationOverlay {
 	a := make(AnnotationOverlay)
 	return &a
 }
 
-//GetFinalValue will get overlaied value first , then default
+// GetFinalValue will get overlaied value first , then default
 func (as *AnnotationOverlay) GetFinalValue(a Annotation) string {
 	ov := a.DefaultValue
 	if v, ok := (*as)[a]; ok {
@@ -91,25 +91,25 @@
 	return ov
 }
 
-//SetOverlay will set overlaied value
+// SetOverlay will set overlaied value
 func (as *AnnotationOverlay) SetOverlay(AnnotationOverlay *map[string]string, a Annotation) error {
 	if v, ok := (*AnnotationOverlay)[a.Name]; ok {
-		//if annotation has validate func then validate
+		// if annotation has validate func then validate
 		f := FindValidateFunc(a.ValidateFunc)
 		if f != nil {
 			err := f(a.Name, v)
-			//validate error
+			// validate error
 			if err != nil {
 				return err
 			}
 		}
-		//if no validate func then set Overlay directly
+		// if no validate func then set Overlay directly
 		(*as)[a] = v
 	}
 	return nil
 }
 
-//GetOverlayValue will get overlaied value, if not then return ""
+// GetOverlayValue will get overlaied value, if not then return ""
 func (as *AnnotationOverlay) GetOverlayValue(a Annotation) string {
 	if v, ok := (*as)[a]; ok {
 		return v
diff --git a/operator/pkg/operator/repo/repo.go b/operator/pkg/operator/manifests/repo.go
similarity index 67%
rename from operator/pkg/operator/repo/repo.go
rename to operator/pkg/operator/manifests/repo.go
index 9aa0be6..a263b6f 100644
--- a/operator/pkg/operator/repo/repo.go
+++ b/operator/pkg/operator/manifests/repo.go
@@ -15,19 +15,22 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package repo
+package manifests
 
 import (
+	"embed"
 	"fmt"
 	"os"
 	"path/filepath"
-	"time"
 
 	"github.com/apache/skywalking-swck/operator/pkg/kubernetes"
 )
 
 var _ kubernetes.Repo = &AssetsRepo{}
 
+//go:embed fetcher injector oapserver satellite storage ui
+var manifests embed.FS
+
 // AssetsRepo provides templates through assets
 type AssetsRepo struct {
 	Root string
@@ -39,16 +42,18 @@
 
 // ReadFile reads the content of compiled in files at path and returns a buffer with the data.
 func (a *AssetsRepo) ReadFile(path string) ([]byte, error) {
-	return Asset(path)
+	return manifests.ReadFile(path)
 }
 
 func (a *AssetsRepo) GetFilesRecursive(path string) ([]string, error) {
-	ap := fmt.Sprintf("%s/%s", a.Root, path)
-	rootFI, err := Stat(ap)
+	absolutePath := fmt.Sprintf("%s/%s", a.Root, path)
+
+	rootFI, err := Stat(absolutePath)
 	if err != nil {
 		return nil, err
 	}
-	return getFilesRecursive(filepath.Dir(ap), rootFI)
+
+	return getFilesRecursive(filepath.Dir(absolutePath), rootFI)
 }
 
 func getFilesRecursive(prefix string, root os.FileInfo) ([]string, error) {
@@ -56,15 +61,15 @@
 		return nil, fmt.Errorf("not a dir: %s", root.Name())
 	}
 	prefix = filepath.Join(prefix, root.Name())
-	fs, _ := AssetDir(prefix)
+	fs, _ := manifests.ReadDir(prefix)
 	out := make([]string, 0)
 	for _, f := range fs {
-		info, err := Stat(filepath.Join(prefix, f))
+		info, err := Stat(filepath.Join(prefix, f.Name()))
 		if err != nil {
 			return nil, err
 		}
-		if !info.IsDir() {
-			out = append(out, filepath.Join(prefix, filepath.Base(info.Name())))
+		if !f.IsDir() {
+			out = append(out, filepath.Join(prefix, f.Name()))
 			continue
 		}
 		nfs, err := getFilesRecursive(prefix, info)
@@ -78,40 +83,10 @@
 
 // Stat returns a FileInfo object for the given path.
 func Stat(path string) (os.FileInfo, error) {
-	info, err := AssetInfo(path)
+	f, err := manifests.Open(path)
 	if err != nil {
-		// try it as a directory instead
-		_, err = AssetDir(path)
-		if err == nil {
-			info = &dirInfo{name: filepath.Base(path)}
-		}
-	} else {
-		fi := info.(bindataFileInfo)
-		fi.name = filepath.Base(fi.name)
+		return nil, err
 	}
 
-	return info, err
-}
-
-type dirInfo struct {
-	name string
-}
-
-func (di dirInfo) Name() string {
-	return di.name
-}
-func (di dirInfo) Size() int64 {
-	return 0
-}
-func (di dirInfo) Mode() os.FileMode {
-	return os.FileMode(0)
-}
-func (di dirInfo) ModTime() time.Time {
-	return time.Unix(0, 0)
-}
-func (di dirInfo) IsDir() bool {
-	return true
-}
-func (di dirInfo) Sys() interface{} {
-	return nil
+	return f.Stat()
 }
diff --git a/operator/pkg/operator/manifests/repo_test.go b/operator/pkg/operator/manifests/repo_test.go
new file mode 100644
index 0000000..e0fb510
--- /dev/null
+++ b/operator/pkg/operator/manifests/repo_test.go
@@ -0,0 +1,147 @@
+// Licensed to 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. Apache Software Foundation (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 manifests
+
+import (
+	"testing"
+)
+
+func TestStat(t *testing.T) {
+	tests := []struct {
+		name      string
+		path      string
+		wantName  string
+		wantIsDir bool
+		wantErr   bool
+	}{
+		{
+			name:    "empty path",
+			path:    "",
+			wantErr: true,
+		},
+		{
+			name:      "current directory",
+			path:      ".",
+			wantName:  ".",
+			wantIsDir: true,
+			wantErr:   false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := Stat(tt.path)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("Stat() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if err == nil {
+				if got.Name() != tt.wantName {
+					t.Errorf("Stat() got.Name() = %v, want %v", got, tt.wantName)
+				}
+				if got.IsDir() != tt.wantIsDir {
+					t.Errorf("Stat() got.IsDir() = %v, want %v", got, tt.wantIsDir)
+				}
+			}
+		})
+	}
+}
+
+func TestAssetsRepo_ReadFile(t *testing.T) {
+	tests := []struct {
+		name    string
+		path    string
+		wantErr bool
+	}{
+		{
+			name:    "read a template file",
+			path:    "oapserver/templates/deployment.yaml",
+			wantErr: false,
+		},
+		{
+			name:    "read a non-existent file",
+			path:    "non-existent/foo.yaml",
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			a := &AssetsRepo{
+				Root: "",
+			}
+			_, err := a.ReadFile(tt.path)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("ReadFile() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+		})
+	}
+}
+
+func TestAssetsRepo_GetFilesRecursive(t *testing.T) {
+	tests := []struct {
+		name      string
+		root      string
+		path      string
+		wantFiles bool // Since filenames may be changed, only check if the number of files is greater than 0.
+		wantErr   bool
+	}{
+		{
+			name:      "get oap template files",
+			root:      "oapserver",
+			path:      "templates",
+			wantFiles: true,
+			wantErr:   false,
+		},
+		{
+			name:      "get ui template files",
+			root:      "ui",
+			path:      "templates",
+			wantFiles: true,
+			wantErr:   false,
+		},
+		{
+			name:      "get files from ui directory without path",
+			root:      "ui",
+			path:      "",
+			wantFiles: false,
+			wantErr:   true,
+		},
+		{
+			name:      "get files in a non-existent directory",
+			root:      "non-existent",
+			path:      "templates",
+			wantFiles: false,
+			wantErr:   true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			a := &AssetsRepo{
+				Root: tt.root,
+			}
+			got, err := a.GetFilesRecursive(tt.path)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("GetFilesRecursive() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			if tt.wantFiles && len(got) <= 0 {
+				t.Errorf("GetFilesRecursive() should return more than one filenames")
+			}
+		})
+	}
+}
diff --git a/operator/pkg/operator/repo/assets.gen.go b/operator/pkg/operator/repo/assets.gen.go
deleted file mode 100644
index e8da2fb..0000000
--- a/operator/pkg/operator/repo/assets.gen.go
+++ /dev/null
@@ -1,2193 +0,0 @@
-// Licensed to 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. Apache Software Foundation (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.
-// Code generated by go-bindata. DO NOT EDIT.
-// sources:
-// fetcher/templates/cluster_role.yaml (1.218kB)
-// fetcher/templates/cluster_role_binding.yaml (1.205kB)
-// fetcher/templates/configmap.yaml (3.082kB)
-// fetcher/templates/deployment.yaml (2.084kB)
-// fetcher/templates/service_account.yaml (1.088kB)
-// injector/templates/annotations.yaml (3.689kB)
-// injector/templates/configmap.yaml (1.2kB)
-// injector/templates/javaagent.yaml (1.462kB)
-// oapserver/templates/cluster_role.yaml (1.241kB)
-// oapserver/templates/cluster_role_binding.yaml (1.207kB)
-// oapserver/templates/deployment.yaml (3.937kB)
-// oapserver/templates/ingress.yaml (1.672kB)
-// oapserver/templates/service.yaml (1.782kB)
-// oapserver/templates/service_account.yaml (1.09kB)
-// satellite/templates/cluster_role.yaml (1.104kB)
-// satellite/templates/cluster_role_binding.yaml (1.213kB)
-// satellite/templates/deployment.yaml (3.089kB)
-// satellite/templates/service.yaml (1.78kB)
-// satellite/templates/service_account.yaml (1.101kB)
-// storage/elasticsearch/templates/configmap.yaml (1.822kB)
-// storage/elasticsearch/templates/service.yaml (1.322kB)
-// storage/elasticsearch/templates/service_account.yaml (1.095kB)
-// storage/elasticsearch/templates/statefulset.yaml (6.624kB)
-// ui/templates/deployment.yaml (2.604kB)
-// ui/templates/ingress.yaml (1.716kB)
-// ui/templates/service.yaml (1.681kB)
-
-package repo
-
-import (
-	"crypto/sha256"
-	"fmt"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"strings"
-	"time"
-)
-
-type asset struct {
-	bytes  []byte
-	info   os.FileInfo
-	digest [sha256.Size]byte
-}
-
-type bindataFileInfo struct {
-	name    string
-	size    int64
-	mode    os.FileMode
-	modTime time.Time
-}
-
-func (fi bindataFileInfo) Name() string {
-	return fi.name
-}
-func (fi bindataFileInfo) Size() int64 {
-	return fi.size
-}
-func (fi bindataFileInfo) Mode() os.FileMode {
-	return fi.mode
-}
-func (fi bindataFileInfo) ModTime() time.Time {
-	return fi.modTime
-}
-func (fi bindataFileInfo) IsDir() bool {
-	return false
-}
-func (fi bindataFileInfo) Sys() interface{} {
-	return nil
-}
-
-var _fetcherTemplatesCluster_roleYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-kind: ClusterRole
-apiVersion: rbac.authorization.k8s.io/v1
-metadata:
-  name: swck:fetcher
-  labels:
-    operator.skywalking.apache.org/application: fetcher
-    operator.skywalking.apache.org/component: rbac
-rules:
-  - apiGroups: [""]
-    resources: ["nodes", "nodes/proxy", "endpoints", "services", "pods"]
-    verbs: ["get", "watch", "list"]
-  - apiGroups: [""]
-    resources: ["configmaps"]
-    verbs: ["get"]
-`)
-
-func fetcherTemplatesCluster_roleYamlBytes() ([]byte, error) {
-	return _fetcherTemplatesCluster_roleYaml, nil
-}
-
-func fetcherTemplatesCluster_roleYaml() (*asset, error) {
-	bytes, err := fetcherTemplatesCluster_roleYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "fetcher/templates/cluster_role.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0xe2, 0x96, 0xd7, 0x97, 0x52, 0x31, 0x75, 0x66, 0x9b, 0x3, 0x64, 0xd6, 0x68, 0x4f, 0x7, 0xc9, 0x9a, 0xe, 0x86, 0x6c, 0x15, 0x42, 0x64, 0x53, 0x34, 0x3e, 0xe1, 0xdc, 0x62, 0x5f, 0x3e}}
-	return a, nil
-}
-
-var _fetcherTemplatesCluster_role_bindingYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: swck:fetcher
-  labels:
-    operator.skywalking.apache.org/application: fetcher
-    operator.skywalking.apache.org/component: rbac
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: swck:fetcher
-subjects:
-  - kind: ServiceAccount
-    name: {{ .Name }}-fetcher
-    namespace: {{ .Namespace }}
-`)
-
-func fetcherTemplatesCluster_role_bindingYamlBytes() ([]byte, error) {
-	return _fetcherTemplatesCluster_role_bindingYaml, nil
-}
-
-func fetcherTemplatesCluster_role_bindingYaml() (*asset, error) {
-	bytes, err := fetcherTemplatesCluster_role_bindingYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "fetcher/templates/cluster_role_binding.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x94, 0xd1, 0x52, 0x1b, 0x44, 0x28, 0xb4, 0x81, 0x6e, 0xdc, 0x93, 0xc8, 0x8, 0xa1, 0x7e, 0x63, 0x23, 0x78, 0xed, 0x66, 0x14, 0x33, 0xc4, 0x21, 0xea, 0x5e, 0x94, 0x3a, 0xed, 0x4a, 0x38, 0x81}}
-	return a, nil
-}
-
-var _fetcherTemplatesConfigmapYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-{{ $types := .Spec.GetType }}
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: {{ .Name }}-fetcher
-  namespace: {{ .Namespace }}
-  labels:
-    app: fetcher
-    operator.skywalking.apache.org/fetcher-name: {{ .Name }}
-    operator.skywalking.apache.org/application: fetcher
-    operator.skywalking.apache.org/component: configmap
-data:
-  collector.yaml: |-
-    service:
-      extensions: [zpages, health_check]
-      pipelines:
-        metrics:
-          receivers: [prometheus]
-          exporters: [logging, opencensus, prometheus]
-    extensions:
-      zpages:
-        endpoint: "localhost:56888"
-      health_check: {}
-    exporters:
-      logging:
-      prometheus:
-        endpoint: "0.0.0.0:9090"
-      opencensus:
-        endpoint: {{ .Spec.OAPServerAddress | quote }}
-        insecure: true
-    receivers:
-      {{- if has "prometheus" $types }}
-      prometheus:
-        config:
-          global:
-            scrape_interval: 15s
-            scrape_timeout: 10s
-          scrape_configs:
-          - job_name: kubernetes-pods
-            kubernetes_sd_configs:
-            - role: pod
-            relabel_configs:
-            - source_labels: []
-              target_label: cluster
-              replacement: {{ .Spec.ClusterName | quote }}
-            - action: keep
-              regex: true
-              source_labels:
-              - __meta_kubernetes_pod_annotation_prometheus_io_scrape
-            - action: replace
-              regex: (.+)
-              source_labels:
-              - __meta_kubernetes_pod_annotation_prometheus_io_path
-              target_label: __metrics_path__
-            - action: replace
-              regex: ([^:]+)(?::\d+)?;(\d+)
-              replacement: $$1:$$2
-              source_labels:
-              - __address__
-              - __meta_kubernetes_pod_annotation_prometheus_io_port
-              target_label: __address__
-            - action: labelmap
-              regex: __meta_kubernetes_pod_label_(.+)
-            - action: replace
-              source_labels:
-              - __meta_kubernetes_namespace
-              target_label: kubernetes_namespace
-            - action: replace
-              source_labels:
-              - __meta_kubernetes_pod_name
-              target_label: kubernetes_pod_name
-      {{- end }}`)
-
-func fetcherTemplatesConfigmapYamlBytes() ([]byte, error) {
-	return _fetcherTemplatesConfigmapYaml, nil
-}
-
-func fetcherTemplatesConfigmapYaml() (*asset, error) {
-	bytes, err := fetcherTemplatesConfigmapYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "fetcher/templates/configmap.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x78, 0x5c, 0x20, 0x2e, 0x4a, 0xd1, 0xc, 0xe0, 0xc3, 0x13, 0xec, 0x8e, 0x70, 0x6d, 0x50, 0x62, 0x8f, 0x8f, 0x1, 0x3c, 0xc3, 0xcc, 0x91, 0xf2, 0x40, 0xf9, 0x1, 0x21, 0x10, 0xae, 0x76, 0x85}}
-	return a, nil
-}
-
-var _fetcherTemplatesDeploymentYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: {{ .Name }}-fetcher
-  namespace: {{ .Namespace }}
-  labels:
-    app: fetcher
-    operator.skywalking.apache.org/fetcher-name: {{ .Name }}
-    operator.skywalking.apache.org/application: fetcher
-    operator.skywalking.apache.org/component: deployment
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: fetcher
-      operator.skywalking.apache.org/fetcher-name: {{ .Name }}
-  template:
-    metadata:
-      labels:
-        app: fetcher
-        operator.skywalking.apache.org/fetcher-name: {{ .Name }}
-        operator.skywalking.apache.org/application: fetcher
-        operator.skywalking.apache.org/component: pod
-    spec:
-      serviceAccountName: {{ .Name }}-fetcher
-      containers:
-        - args:
-            - --log-level=DEBUG
-            - --config=/conf/collector.yaml
-          image: otel/opentelemetry-collector:0.18.0
-          imagePullPolicy: IfNotPresent
-          name: otc-container
-          volumeMounts:
-            - mountPath: /conf
-              name: otc-internal
-      volumes:
-        - configMap:
-            defaultMode: 420
-            items:
-              - key: collector.yaml
-                path: collector.yaml
-            name: {{ .Name }}-fetcher
-          name: otc-internal
-`)
-
-func fetcherTemplatesDeploymentYamlBytes() ([]byte, error) {
-	return _fetcherTemplatesDeploymentYaml, nil
-}
-
-func fetcherTemplatesDeploymentYaml() (*asset, error) {
-	bytes, err := fetcherTemplatesDeploymentYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "fetcher/templates/deployment.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5d, 0xe2, 0x26, 0x9b, 0x90, 0xa9, 0x58, 0x5b, 0xce, 0xda, 0x61, 0x85, 0x4c, 0x9a, 0xfc, 0x29, 0xab, 0x6f, 0xd6, 0x48, 0x92, 0x24, 0xa5, 0x5a, 0xc6, 0xf6, 0xe, 0x54, 0xe5, 0xaf, 0xca, 0x3a}}
-	return a, nil
-}
-
-var _fetcherTemplatesService_accountYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: {{ .Name }}-fetcher
-  namespace: {{ .Namespace }}
-  labels:
-    operator.skywalking.apache.org/fetcher-name: {{ .Name }}
-    operator.skywalking.apache.org/application: fetcher
-    operator.skywalking.apache.org/component: rbac
-`)
-
-func fetcherTemplatesService_accountYamlBytes() ([]byte, error) {
-	return _fetcherTemplatesService_accountYaml, nil
-}
-
-func fetcherTemplatesService_accountYaml() (*asset, error) {
-	bytes, err := fetcherTemplatesService_accountYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "fetcher/templates/service_account.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb, 0x75, 0x7a, 0xa, 0x7f, 0xf7, 0x92, 0x19, 0x6b, 0x9d, 0x83, 0x8f, 0xf3, 0x4, 0x78, 0xe, 0x5a, 0x50, 0xab, 0x85, 0xd7, 0xc8, 0x78, 0xc3, 0x68, 0x53, 0xd3, 0xc6, 0x66, 0x93, 0xf3, 0x5c}}
-	return a, nil
-}
-
-var _injectorTemplatesAnnotationsYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-# name means the reference to configuration used in pod's annotations.
-# defaultValue is the default value in agent.config
-# vaildateFunc means use which function to validate the value
-# Notice , the vaildateFunc must exist in validate.go , 
-# if don't have the vaildateFunc , please set nil
-# envName is the environment variable in agent.config
-
-annotations:
-  # Next is the annotation of the sidecar configuration
-  - name: sidecar.skywalking.apache.org/initcontainer.Name
-    defaultValue: inject-skywalking-agent
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/initcontainer.Image
-    defaultValue: apache/skywalking-java-agent:8.8.0-java8
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/initcontainer.Command
-    defaultValue: sh
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/initcontainer.args.Option
-    defaultValue: -c
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/initcontainer.args.Command
-    defaultValue: "mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent"
-    validateFunc: nil
-    envName: nil
-  
-  - name: sidecar.skywalking.apache.org/initcontainer.resources.limits
-    defaultValue: nil
-    validateFunc: ValidateResourceRequirements
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/initcontainer.resources.requests
-    defaultValue: nil
-    validateFunc: ValidateResourceRequirements
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/sidecarVolume.Name
-    defaultValue: sky-agent
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/sidecarVolumeMount.MountPath
-    defaultValue: /sky/agent
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/configmapVolume.ConfigMap.Name
-    defaultValue: skywalking-swck-java-agent-configmap
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/configmapVolume.Name
-    defaultValue: java-agent-configmap-volume
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/configmapVolumeMount.MountPath
-    defaultValue: /sky/agent/config
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/env.Name
-    defaultValue: JAVA_TOOL_OPTIONS
-    validateFunc: nil
-    envName: nil
-
-  - name: sidecar.skywalking.apache.org/env.Value
-    defaultValue: -javaagent:/sky/agent/skywalking-agent.jar
-    validateFunc: nil
-    envName: nil
-
-  # Next is the annotation of the java agent configuration
-  - name: agent.skywalking.apache.org/agent.service_name
-    defaultValue: Your_ApplicationName
-    validateFunc: ValidateServiceName
-    envName: SW_AGENT_NAME
-
-  - name: agent.skywalking.apache.org/collector.backend_service
-    defaultValue: 127.0.0.1:11800
-    validateFunc: ValidateBackendServices
-    envName: SW_AGENT_COLLECTOR_BACKEND_SERVICES`)
-
-func injectorTemplatesAnnotationsYamlBytes() ([]byte, error) {
-	return _injectorTemplatesAnnotationsYaml, nil
-}
-
-func injectorTemplatesAnnotationsYaml() (*asset, error) {
-	bytes, err := injectorTemplatesAnnotationsYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "injector/templates/annotations.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0xbb, 0xd0, 0x87, 0x78, 0x4, 0xac, 0x18, 0x3a, 0xf7, 0xff, 0xcc, 0x99, 0x72, 0x42, 0xd, 0xa4, 0xcb, 0xfa, 0x78, 0x6a, 0x39, 0xbd, 0xb8, 0xfd, 0x8b, 0x25, 0x26, 0x8f, 0xa, 0x9e, 0x1f}}
-	return a, nil
-}
-
-var _injectorTemplatesConfigmapYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: skywalking-swck-java-agent-configmap 
-  namespace: skywalking-swck-system
-data:
-  agent.config: |
-    {{- $anno := getAgentAnnotations }}
-    {{- range $anno -}}
-    {{- if ne .DefaultValue "nil" }}
-    {{parse .Name}}=${ {{- .EnvName}}:{{.DefaultValue -}} }
-    {{- else}}
-    {{parse .Name}}=${ {{- .EnvName}}:}
-    {{- end -}}
-    {{- end -}}`)
-
-func injectorTemplatesConfigmapYamlBytes() ([]byte, error) {
-	return _injectorTemplatesConfigmapYaml, nil
-}
-
-func injectorTemplatesConfigmapYaml() (*asset, error) {
-	bytes, err := injectorTemplatesConfigmapYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "injector/templates/configmap.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc6, 0xee, 0xc8, 0x3f, 0x93, 0x98, 0x46, 0x72, 0x7e, 0x19, 0xa, 0x17, 0xc3, 0x8a, 0x76, 0x3f, 0xf5, 0x5f, 0x15, 0x53, 0x27, 0x92, 0xdc, 0xcc, 0x6c, 0x99, 0x70, 0x38, 0x7c, 0x75, 0x4e, 0x25}}
-	return a, nil
-}
-
-var _injectorTemplatesJavaagentYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-{{- $configuration := config }}
-apiVersion: operator.skywalking.apache.org/v1alpha1
-kind: JavaAgent
-metadata:
-  name: {{SelectorName}}-javaagent
-  namespace: {{Namespace}}
-  ownerReferences:
-  - apiVersion: {{ownerReference.APIVersion}}
-    blockOwnerDeletion: {{ownerReference.BlockOwnerDeletion}}
-    controller: {{ownerReference.Controller}}
-    kind: {{ownerReference.Kind}}
-    name: {{ownerReference.Name}}
-    uid: {{ownerReference.UID}}
-spec:
-  podSelector: {{PodSelector}}
-  serviceName: {{ServiceName}}
-  backendService: {{BackendService}}
-  agentConfiguration: 
-  {{ range $key, $value := $configuration }}
-    {{$key}}: {{$value}}
-  {{- end -}}`)
-
-func injectorTemplatesJavaagentYamlBytes() ([]byte, error) {
-	return _injectorTemplatesJavaagentYaml, nil
-}
-
-func injectorTemplatesJavaagentYaml() (*asset, error) {
-	bytes, err := injectorTemplatesJavaagentYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "injector/templates/javaagent.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x97, 0x6d, 0x88, 0xd3, 0x8d, 0xaa, 0x80, 0x98, 0xd0, 0x29, 0x76, 0x5e, 0x57, 0x90, 0xdf, 0x8a, 0x29, 0xb5, 0x7d, 0x71, 0x5e, 0xc2, 0xb4, 0xcb, 0xfa, 0x46, 0x29, 0x3c, 0x71, 0xd2, 0x74, 0x32}}
-	return a, nil
-}
-
-var _oapserverTemplatesCluster_roleYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-kind: ClusterRole
-apiVersion: rbac.authorization.k8s.io/v1
-metadata:
-  name: swck:oapserver
-  labels:
-    operator.skywalking.apache.org/application: oapserver
-    operator.skywalking.apache.org/component: rbac
-rules:
-  - apiGroups: [""]
-    resources: ["pods", "endpoints", "services"]
-    verbs: ["get", "watch", "list"]
-  - apiGroups: ["extensions"]
-    resources: ["deployments", "replicasets"]
-    verbs: ["get", "watch", "list"]
-`)
-
-func oapserverTemplatesCluster_roleYamlBytes() ([]byte, error) {
-	return _oapserverTemplatesCluster_roleYaml, nil
-}
-
-func oapserverTemplatesCluster_roleYaml() (*asset, error) {
-	bytes, err := oapserverTemplatesCluster_roleYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "oapserver/templates/cluster_role.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb5, 0xde, 0x59, 0x47, 0x2c, 0x69, 0xe9, 0xcd, 0x7e, 0xa7, 0x4, 0xf7, 0xf2, 0xa0, 0x1a, 0x1b, 0xb6, 0xa3, 0x42, 0xb3, 0x20, 0x49, 0x9b, 0x2f, 0x81, 0x87, 0xa0, 0x95, 0x73, 0x49, 0x6a, 0xdb}}
-	return a, nil
-}
-
-var _oapserverTemplatesCluster_role_bindingYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: swck:oapserver
-  labels:
-    operator.skywalking.apache.org/application: oapserver
-    operator.skywalking.apache.org/component: rbac
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: swck:oapserver
-subjects:
-  - kind: ServiceAccount
-    name: {{ .Name }}-oap
-    namespace: {{ .Namespace }}
-`)
-
-func oapserverTemplatesCluster_role_bindingYamlBytes() ([]byte, error) {
-	return _oapserverTemplatesCluster_role_bindingYaml, nil
-}
-
-func oapserverTemplatesCluster_role_bindingYaml() (*asset, error) {
-	bytes, err := oapserverTemplatesCluster_role_bindingYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "oapserver/templates/cluster_role_binding.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0x15, 0xc5, 0xe0, 0xe7, 0x4e, 0xeb, 0xed, 0x61, 0xda, 0xad, 0x6c, 0x43, 0xf, 0x80, 0x5, 0x4c, 0x47, 0xbc, 0x20, 0xe7, 0xc6, 0xdf, 0x63, 0xcf, 0x9b, 0x54, 0x56, 0x1f, 0x4, 0xbf, 0x1c}}
-	return a, nil
-}
-
-var _oapserverTemplatesDeploymentYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: {{ .Name }}-oap
-  namespace: {{ .Namespace }}
-  labels:
-    app: oap
-    operator.skywalking.apache.org/oap-server-name: {{ .Name }}
-    operator.skywalking.apache.org/application: oapserver
-    operator.skywalking.apache.org/component: deployment
-
-spec:
-  replicas: {{ .Spec.Instances }}
-  minReadySeconds: 5
-  selector:
-    matchLabels:
-      app: oap
-      operator.skywalking.apache.org/oap-server-name: {{ .Name }}
-  template:
-    metadata:
-      labels:
-        app: oap
-        operator.skywalking.apache.org/oap-server-name: {{ .Name }}
-        operator.skywalking.apache.org/application: oapserver
-        operator.skywalking.apache.org/component: pod
-    spec:
-      serviceAccountName: {{ .Name }}-oap
-      affinity:
-        podAntiAffinity:
-          preferredDuringSchedulingIgnoredDuringExecution:
-            - weight: 1
-              podAffinityTerm:
-                topologyKey: kubernetes.io/hostname
-                labelSelector:
-                  matchLabels:
-                    app: oap
-                    operator.skywalking.apache.org/oap-server-name: {{ .Name }}
-      containers:
-        - name: oap
-          image: {{ .Spec.Image }}
-          imagePullPolicy: IfNotPresent
-          ports:
-            - containerPort: 11800
-              name: grpc
-            - containerPort: 12800
-              name: rest
-            - containerPort: 1234
-              name: http-monitoring
-          livenessProbe:
-            initialDelaySeconds: 10
-            timeoutSeconds: 10
-            periodSeconds: 30
-            failureThreshold: 10
-            successThreshold: 1
-            exec:
-              command:
-                - /skywalking/bin/swctl
-                - ch
-          readinessProbe:
-            initialDelaySeconds: 10
-            timeoutSeconds: 10
-            periodSeconds: 30
-            failureThreshold: 10
-            successThreshold: 1
-            exec:
-              command:
-                - /skywalking/bin/swctl
-                - ch
-          {{if .Spec.StorageConfig.Storage.Spec.Security.TLS}}
-          volumeMounts:
-            - name: cert
-              mountPath: /skywalking/p12
-          {{end}}
-          env:
-            - name: JAVA_OPTS
-              value: -Xmx2048M
-            - name: SW_CLUSTER
-              value: kubernetes
-            - name: SW_CLUSTER_K8S_NAMESPACE
-              value: "{{ .Namespace }}"
-            - name: SW_CLUSTER_K8S_LABEL
-              value: "app=oap,operator.skywalking.apache.org/oap-server-name={{ .Name }}"
-            - name: SKYWALKING_COLLECTOR_UID
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.uid
-            - name: SW_TELEMETRY
-              value: prometheus
-            - name: SW_HEALTH_CHECKER
-              value: default
-          {{range .Spec.Config}}
-            - name: {{ .Name }}
-              value: {{ .Value }}
-          {{end}}
-      {{if .Spec.StorageConfig.Storage.Spec.Security.TLS}}
-      volumes:
-        - name: cert
-          secret:
-            secretName:  "skywalking-storage"
-      {{end}}
-`)
-
-func oapserverTemplatesDeploymentYamlBytes() ([]byte, error) {
-	return _oapserverTemplatesDeploymentYaml, nil
-}
-
-func oapserverTemplatesDeploymentYaml() (*asset, error) {
-	bytes, err := oapserverTemplatesDeploymentYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "oapserver/templates/deployment.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcf, 0x8a, 0xdc, 0x5b, 0xc4, 0x54, 0x0, 0xa7, 0xe0, 0x7d, 0xb1, 0x27, 0x71, 0x22, 0xf5, 0xfd, 0x8a, 0x64, 0x6b, 0xa, 0x70, 0x4b, 0x37, 0x3d, 0x9a, 0x14, 0xa8, 0x3d, 0x29, 0x59, 0xe2, 0xc2}}
-	return a, nil
-}
-
-var _oapserverTemplatesIngressYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
- 
-{{- $ingress := .Spec.Service.Ingress }}
-{{ if $ingress.Host }}
-apiVersion: networking.k8s.io/v1beta1
-kind: Ingress
-metadata:
-  name: {{ .Name }}-ui
-  namespace: {{ .Namespace }}
-  labels:
-    app: ui
-    operator.skywalking.apache.org/ui-name: {{ .Name }}
-    operator.skywalking.apache.org/application: ui
-    operator.skywalking.apache.org/component: deployment
-  annotations:
-    {{- range $key, $value := $ingress.Annotations }}
-    {{ $key }}: {{ $value | quote }}
-    {{- end }}
-spec:
-  rules:
-    - host: {{ $ingress.Host }}
-      http:
-        paths:
-          - path: /*
-            backend:
-              serviceName: {{ .Name }}-oap
-              servicePort: 12800
-  {{- if $ingress.IngressClassName }}
-  ingressClassName: {{ $ingress.IngressClassName }}
-  {{end}}
-  {{- if $ingress.TLS }}
-  tls:
-{{ toYAML $ingress.TLS | indent 4 }}
-  {{end}}
-{{end}}
-`)
-
-func oapserverTemplatesIngressYamlBytes() ([]byte, error) {
-	return _oapserverTemplatesIngressYaml, nil
-}
-
-func oapserverTemplatesIngressYaml() (*asset, error) {
-	bytes, err := oapserverTemplatesIngressYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "oapserver/templates/ingress.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9a, 0x2, 0xeb, 0x33, 0x6f, 0x15, 0x7c, 0x82, 0x23, 0x94, 0xe1, 0x20, 0x4f, 0x3, 0xd7, 0x23, 0xc6, 0xd0, 0x3a, 0xc6, 0x44, 0x3a, 0xc0, 0x8f, 0xeb, 0x47, 0x57, 0x9a, 0x2d, 0x49, 0xea, 0x5a}}
-	return a, nil
-}
-
-var _oapserverTemplatesServiceYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-{{- $svc := .Spec.Service.Template }}
-apiVersion: v1
-kind: Service
-metadata:
-  name: {{ .Name }}-oap
-  namespace: {{ .Namespace }}
-  labels:
-    app: oap
-    operator.skywalking.apache.org/oap-server-name: {{ .Name }}
-    operator.skywalking.apache.org/application: oapserver
-    operator.skywalking.apache.org/component: service
-spec:
-  type: {{ $svc.Type }}
-  ports:
-  - port: 12800
-    name: rest
-  - port: 11800
-    name: grpc
-  - port: 1234
-    name: http-monitoring
-  {{- if $svc.ExternalIPs }}
-  externalIPs:
-    {{- range $value := $svc.ExternalIPs }}
-    - {{ $value | quote }}
-    {{- end }}
-  {{- end }}
-  {{- if $svc.LoadBalancerIP }}
-  loadBalancerIP: {{ $svc.LoadBalancerIP }}
-  {{- end }}
-  {{- if $svc.LoadBalancerSourceRanges }}
-  loadBalancerSourceRanges:
-    {{- range $value := $svc.LoadBalancerSourceRanges }}
-    - {{ $value | quote }}
-    {{- end }}
-  {{- end }}
-  selector:
-    app: oap
-    operator.skywalking.apache.org/oap-server-name: {{ .Name }}
-
-`)
-
-func oapserverTemplatesServiceYamlBytes() ([]byte, error) {
-	return _oapserverTemplatesServiceYaml, nil
-}
-
-func oapserverTemplatesServiceYaml() (*asset, error) {
-	bytes, err := oapserverTemplatesServiceYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "oapserver/templates/service.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x76, 0x46, 0xaa, 0x13, 0x1b, 0x93, 0x29, 0x97, 0xcd, 0xa3, 0x61, 0xf2, 0x8f, 0x2d, 0xf, 0xcd, 0x88, 0xf6, 0xd, 0x32, 0xae, 0x16, 0x3e, 0x55, 0x33, 0x43, 0xe9, 0x16, 0xd0, 0xe2, 0xe0}}
-	return a, nil
-}
-
-var _oapserverTemplatesService_accountYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: {{ .Name }}-oap
-  namespace: {{ .Namespace }}
-  labels:
-    operator.skywalking.apache.org/oap-server-name: {{ .Name }}
-    operator.skywalking.apache.org/application: oapserver
-    operator.skywalking.apache.org/component: rbac
-
-`)
-
-func oapserverTemplatesService_accountYamlBytes() ([]byte, error) {
-	return _oapserverTemplatesService_accountYaml, nil
-}
-
-func oapserverTemplatesService_accountYaml() (*asset, error) {
-	bytes, err := oapserverTemplatesService_accountYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "oapserver/templates/service_account.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0x3b, 0x36, 0x6, 0xcc, 0x9, 0x84, 0x7d, 0x62, 0x48, 0x31, 0xcf, 0x17, 0xec, 0xd1, 0xdd, 0x83, 0x0, 0x86, 0x6a, 0x50, 0xd5, 0xb6, 0x4a, 0x23, 0xdc, 0xea, 0xd, 0x80, 0x87, 0x2, 0x24}}
-	return a, nil
-}
-
-var _satelliteTemplatesCluster_roleYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-kind: ClusterRole
-apiVersion: rbac.authorization.k8s.io/v1
-metadata:
-  name: swck:satellite
-  labels:
-    operator.skywalking.apache.org/application: satellite
-    operator.skywalking.apache.org/component: rbac
-rules:
-  - apiGroups: [""]
-    resources: ["pods"]
-    verbs: ["get", "watch", "list"]
-`)
-
-func satelliteTemplatesCluster_roleYamlBytes() ([]byte, error) {
-	return _satelliteTemplatesCluster_roleYaml, nil
-}
-
-func satelliteTemplatesCluster_roleYaml() (*asset, error) {
-	bytes, err := satelliteTemplatesCluster_roleYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "satellite/templates/cluster_role.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0xac, 0x31, 0xd6, 0xa9, 0x74, 0x27, 0xd4, 0x72, 0xae, 0x44, 0x61, 0x28, 0x6c, 0x78, 0xdc, 0x7e, 0x33, 0x46, 0x89, 0xab, 0x7b, 0x33, 0x14, 0x6, 0x36, 0xc, 0x2, 0x5b, 0xe9, 0x4a, 0x33}}
-	return a, nil
-}
-
-var _satelliteTemplatesCluster_role_bindingYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: swck:satellite
-  labels:
-    operator.skywalking.apache.org/application: satellite
-    operator.skywalking.apache.org/component: rbac
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: swck:satellite
-subjects:
-  - kind: ServiceAccount
-    name: {{ .Name }}-satellite
-    namespace: {{ .Namespace }}
-`)
-
-func satelliteTemplatesCluster_role_bindingYamlBytes() ([]byte, error) {
-	return _satelliteTemplatesCluster_role_bindingYaml, nil
-}
-
-func satelliteTemplatesCluster_role_bindingYaml() (*asset, error) {
-	bytes, err := satelliteTemplatesCluster_role_bindingYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "satellite/templates/cluster_role_binding.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6, 0x26, 0xd9, 0xd1, 0xb, 0x1c, 0xce, 0x45, 0x3c, 0xc6, 0xbe, 0xe7, 0xd2, 0x79, 0x7, 0xdc, 0x3c, 0x8a, 0xd5, 0xb8, 0x50, 0x37, 0x39, 0xd4, 0xc8, 0xc7, 0x7a, 0x4c, 0x54, 0x4d, 0x9f, 0xfe}}
-	return a, nil
-}
-
-var _satelliteTemplatesDeploymentYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: {{ .Name }}-satellite
-  namespace: {{ .Namespace }}
-  labels:
-    app: satellite
-    operator.skywalking.apache.org/satellite-server-name: {{ .Name }}
-    operator.skywalking.apache.org/application: satellite
-    operator.skywalking.apache.org/component: deployment
-
-spec:
-  replicas: {{ .Spec.Instances }}
-  minReadySeconds: 5
-  selector:
-    matchLabels:
-      app: satellite
-      operator.skywalking.apache.org/satellite-server-name: {{ .Name }}
-  template:
-    metadata:
-      labels:
-        app: satellite
-        operator.skywalking.apache.org/satellite-server-name: {{ .Name }}
-        operator.skywalking.apache.org/application: satellite
-        operator.skywalking.apache.org/component: pod
-    spec:
-      serviceAccountName: {{ .Name }}-satellite
-      affinity:
-        podAntiAffinity:
-          preferredDuringSchedulingIgnoredDuringExecution:
-            - weight: 1
-              podAffinityTerm:
-                topologyKey: kubernetes.io/hostname
-                labelSelector:
-                  matchLabels:
-                    app: satellite
-                    operator.skywalking.apache.org/satellite-server-name: {{ .Name }}
-      containers:
-        - name: satellite
-          image: {{ .Spec.Image }}
-          imagePullPolicy: IfNotPresent
-          ports:
-            - containerPort: 11800
-              name: grpc
-            - containerPort: 1234
-              name: http-monitoring
-          readinessProbe:
-            tcpSocket:
-              port: 11800
-            initialDelaySeconds: 15
-            periodSeconds: 20
-          env:
-            - name: SATELLITE_GRPC_CLIENT_FINDER
-              value: kubernetes
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_NAMESPACE
-              value: "{{ .Namespace }}"
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_KIND
-              value: pod
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_SELECTOR_LABEL
-              value: "app=oap,operator.skywalking.apache.org/oap-server-name={{ .Spec.OAPServerName }}"
-            - name: SATELLITE_GRPC_CLIENT_KUBERNETES_EXTRA_PORT
-              value: "11800"
-            {{range .Spec.Config}}
-            - name: {{ .Name }}
-              value: "{{ .Value }}"
-            {{end}}
-`)
-
-func satelliteTemplatesDeploymentYamlBytes() ([]byte, error) {
-	return _satelliteTemplatesDeploymentYaml, nil
-}
-
-func satelliteTemplatesDeploymentYaml() (*asset, error) {
-	bytes, err := satelliteTemplatesDeploymentYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "satellite/templates/deployment.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd4, 0x11, 0x1b, 0x8f, 0x75, 0x86, 0x9c, 0x13, 0xaf, 0x30, 0xea, 0xfa, 0xd3, 0x53, 0x15, 0x3c, 0xc5, 0x36, 0xf0, 0x21, 0x57, 0x4f, 0xb3, 0x47, 0xa1, 0xbc, 0xb3, 0x33, 0xda, 0x12, 0x9c, 0x34}}
-	return a, nil
-}
-
-var _satelliteTemplatesServiceYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-{{- $svc := .Spec.Service.Template }}
-apiVersion: v1
-kind: Service
-metadata:
-  name: {{ .Name }}-satellite
-  namespace: {{ .Namespace }}
-  labels:
-    app: satellite
-    operator.skywalking.apache.org/satellite-server-name: {{ .Name }}
-    operator.skywalking.apache.org/application: satellite
-    operator.skywalking.apache.org/component: service
-spec:
-  type: {{ $svc.Type }}
-  ports:
-  - port: 11800
-    name: grpc
-  - port: 1234
-    name: http-monitoring
-  {{- if $svc.ExternalIPs }}
-  externalIPs:
-    {{- range $value := $svc.ExternalIPs }}
-    - {{ $value | quote }}
-    {{- end }}
-  {{- end }}
-  {{- if $svc.LoadBalancerIP }}
-  loadBalancerIP: {{ $svc.LoadBalancerIP }}
-  {{- end }}
-  {{- if $svc.LoadBalancerSourceRanges }}
-  loadBalancerSourceRanges:
-    {{- range $value := $svc.LoadBalancerSourceRanges }}
-    - {{ $value | quote }}
-    {{- end }}
-  {{- end }}
-  selector:
-    app: satellite
-    operator.skywalking.apache.org/satellite-server-name: {{ .Name }}
-`)
-
-func satelliteTemplatesServiceYamlBytes() ([]byte, error) {
-	return _satelliteTemplatesServiceYaml, nil
-}
-
-func satelliteTemplatesServiceYaml() (*asset, error) {
-	bytes, err := satelliteTemplatesServiceYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "satellite/templates/service.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe5, 0x52, 0xf7, 0xe, 0x18, 0x89, 0xda, 0x3a, 0x6d, 0x98, 0x3a, 0x3a, 0x15, 0xd8, 0x8b, 0x30, 0x1c, 0xfe, 0x6f, 0x52, 0x4a, 0x2d, 0x96, 0x1d, 0x49, 0x18, 0xb1, 0xf, 0x97, 0xa4, 0xac, 0x28}}
-	return a, nil
-}
-
-var _satelliteTemplatesService_accountYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: {{ .Name }}-satellite
-  namespace: {{ .Namespace }}
-  labels:
-    operator.skywalking.apache.org/satellite-server-name: {{ .Name }}
-    operator.skywalking.apache.org/application: satellite
-    operator.skywalking.apache.org/component: rbac
-`)
-
-func satelliteTemplatesService_accountYamlBytes() ([]byte, error) {
-	return _satelliteTemplatesService_accountYaml, nil
-}
-
-func satelliteTemplatesService_accountYaml() (*asset, error) {
-	bytes, err := satelliteTemplatesService_accountYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "satellite/templates/service_account.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0x7c, 0xee, 0xa4, 0xdb, 0xf1, 0x4b, 0x6b, 0x79, 0x1a, 0x30, 0x7f, 0x16, 0xa5, 0xf1, 0x4b, 0x58, 0xae, 0xbf, 0xc1, 0xad, 0xfb, 0xd6, 0xed, 0x48, 0x97, 0xda, 0xb0, 0xed, 0x90, 0xab, 0x7d}}
-	return a, nil
-}
-
-var _storageElasticsearchTemplatesConfigmapYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: {{ .Name }}-config
-  namespace: {{ .Namespace }}
-data:
-  elasticsearch.yml: |
-      network.host: 0.0.0.0
-      {{ if .Spec.Security.User.SecretName }}
-      xpack.security.enabled: true
-      xpack.security.transport.ssl.enabled: true
-      xpack.security.transport.ssl.verification_mode: certificate
-      xpack.security.transport.ssl.keystore.path: storage.p12
-      xpack.security.transport.ssl.keystore.password: skywalking
-      xpack.security.transport.ssl.truststore.path: storage.p12
-      xpack.security.transport.ssl.truststore.password: skywalking
-      {{end}}
-      {{ if .Spec.Security.TLS }}
-      xpack.security.http.ssl.enabled: true
-      xpack.security.http.ssl.verification_mode: certificate
-      xpack.security.http.ssl.keystore.path: storage.p12
-      xpack.security.http.ssl.keystore.password: skywalking
-      xpack.security.http.ssl.truststore.path: storage.p12
-      xpack.security.http.ssl.truststore.password: skywalking
-      {{end}}
-
-
-`)
-
-func storageElasticsearchTemplatesConfigmapYamlBytes() ([]byte, error) {
-	return _storageElasticsearchTemplatesConfigmapYaml, nil
-}
-
-func storageElasticsearchTemplatesConfigmapYaml() (*asset, error) {
-	bytes, err := storageElasticsearchTemplatesConfigmapYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "storage/elasticsearch/templates/configmap.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x23, 0x88, 0x69, 0x87, 0xef, 0x9a, 0xcc, 0xe6, 0x9b, 0x4e, 0x2b, 0xcc, 0x55, 0x75, 0x78, 0x9d, 0x59, 0x5f, 0x6b, 0xc0, 0x27, 0xa0, 0x8, 0x10, 0xff, 0xb8, 0x38, 0xba, 0xcf, 0xed, 0x1d, 0x9d}}
-	return a, nil
-}
-
-var _storageElasticsearchTemplatesServiceYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-kind: Service
-apiVersion: v1
-metadata:
-  name:  {{ .Spec.ServiceName }}
-  namespace: {{ .Namespace }}
-  labels:
-    app: es
-    operator.skywalking.apache.org/es-name: {{ .Name }}
-    operator.skywalking.apache.org/application: elasticsearch
-    operator.skywalking.apache.org/component: service
-spec:
-  clusterIP: None
-  selector:
-    app: es
-    operator.skywalking.apache.org/es-name: {{ .Name }}
-  publishNotReadyAddresses: true
-  ports:
-    - name: http
-      port: 9200
-    - name: transport
-      port: 9300
-
-`)
-
-func storageElasticsearchTemplatesServiceYamlBytes() ([]byte, error) {
-	return _storageElasticsearchTemplatesServiceYaml, nil
-}
-
-func storageElasticsearchTemplatesServiceYaml() (*asset, error) {
-	bytes, err := storageElasticsearchTemplatesServiceYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "storage/elasticsearch/templates/service.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0xfc, 0xe1, 0x33, 0x2e, 0xc2, 0x4, 0x23, 0x44, 0x26, 0xe5, 0x85, 0x9d, 0x58, 0xe7, 0xe5, 0x2a, 0xee, 0x7e, 0x6c, 0x39, 0xbf, 0x31, 0x4a, 0x49, 0xb9, 0xf7, 0x6b, 0xa8, 0x38, 0x79, 0x82}}
-	return a, nil
-}
-
-var _storageElasticsearchTemplatesService_accountYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: {{ .Name }}-elasticsearch
-  namespace: {{ .Namespace }}
-  labels:
-    operator.skywalking.apache.org/es-name: {{ .Name }}
-    operator.skywalking.apache.org/application: elasticsearch
-    operator.skywalking.apache.org/component: rbac
-`)
-
-func storageElasticsearchTemplatesService_accountYamlBytes() ([]byte, error) {
-	return _storageElasticsearchTemplatesService_accountYaml, nil
-}
-
-func storageElasticsearchTemplatesService_accountYaml() (*asset, error) {
-	bytes, err := storageElasticsearchTemplatesService_accountYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "storage/elasticsearch/templates/service_account.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe6, 0xe2, 0x5d, 0x98, 0xe2, 0xbb, 0x1, 0xf0, 0x92, 0x2e, 0x76, 0x6f, 0xc2, 0x7d, 0x95, 0x7, 0xd4, 0x74, 0xa7, 0x40, 0x55, 0x1f, 0x9f, 0xf9, 0x25, 0x92, 0x9f, 0xea, 0x13, 0x49, 0xca, 0x43}}
-	return a, nil
-}
-
-var _storageElasticsearchTemplatesStatefulsetYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: apps/v1
-kind: StatefulSet
-metadata:
-  name: {{ .Name }}-elasticsearch
-  namespace: {{ .Namespace }}
-  labels:
-    app: es
-    operator.skywalking.apache.org/es-name: {{ .Name }}
-    operator.skywalking.apache.org/application: elasticsearch
-    operator.skywalking.apache.org/component: statefulset
-spec:
-  serviceName:  {{ .Spec.ServiceName }}
-  replicas: {{ .Spec.Instances }}
-  selector:
-    matchLabels:
-      app: es
-      operator.skywalking.apache.org/es-name: {{ .Name }}
-  podManagementPolicy: Parallel
-  updateStrategy:
-    type: RollingUpdate
-  template:
-    metadata:
-      labels:
-        app: es
-        operator.skywalking.apache.org/es-name: {{ .Name }}
-        operator.skywalking.apache.org/application: elasticsearch
-        operator.skywalking.apache.org/component: statefulset
-    spec:
-      serviceAccountName: {{ .Name }}-elasticsearch
-      affinity:
-        podAntiAffinity:
-          requiredDuringSchedulingIgnoredDuringExecution:
-              - labelSelector:
-                matchExpressions:
-                  - key: app
-                    operator: In
-                    values:
-                      - "es"
-                topologyKey: kubernetes.io/hostname
-      initContainers:
-        - name: configure-sysctl
-          securityContext:
-            runAsUser: 0
-            privileged: true
-          image: "{{ .Spec.Image }}"
-          imagePullPolicy: IfNotPresent
-          command: [ "sysctl", "-w", "vm.max_map_count=262144" ]
-      containers:
-        - name: elasticsearch
-          image: {{ .Spec.Image }}
-          resources:
-            limits:
-              cpu: {{ .Spec.ResourceCnfig.Limit }}
-            requests:
-              cpu: {{ .Spec.ResourceCnfig.Requests }}
-          imagePullPolicy: IfNotPresent
-          ports:
-            - containerPort: 9200
-              name: http
-              protocol: TCP
-            - containerPort: 9300
-              name: transport
-              protocol: TCP
-          volumeMounts:
-            - name: config
-              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
-              subPath: elasticsearch.yml
-            {{ if .Spec.Security.User.SecretName }}
-            - name: cert
-              mountPath: "/usr/share/elasticsearch/config/storage.p12"
-              subPath: storage.p12
-            {{end}}
-          env:
-            - name: cluster.name
-              value: "{{ .Name }}-skywalking-es"
-            - name: node.name
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.name
-            - name: thread_pool.write.queue_size
-              value: "1000"
-            {{ range .Spec.Config }}
-            - name: {{ .Name }}
-              value: {{ .Value }}
-            {{end}}
-          readinessProbe:
-            exec:
-              command:
-                - sh
-                - -c
-                - |
-                  #!/usr/bin/env bash -e
-                  # Exit if ELASTIC_PASSWORD in unset
-                  if [ -z "${ELASTIC_PASSWORD}" ]; then
-                    echo "ELASTIC_PASSWORD variable is missing, exiting"
-                    exit 1
-                  fi
-                  # If the node is starting up wait for the cluster to be ready (request params: "wait_for_status=green&timeout=1s" )
-                  # Once it has started only check that the node itself is responding
-                  START_FILE=/tmp/.es_start_file
-                  http () {
-                    local path="${1}"
-                    local args="${2}"
-                    set -- -XGET -s
-                    if [ "$args" != "" ]; then
-                      set -- "$@" $args
-                    fi
-                    set -- "$@" -u "elastic:${ELASTIC_PASSWORD}"
-                    curl --output /dev/null -k "$@" "{{ getProtocol .Spec.Security.TLS }}://127.0.0.1:9200${path}"
-                  }
-                  if [ -f "${START_FILE}" ]; then
-                    echo 'Elasticsearch is already running, lets check the node is healthy'
-                    HTTP_CODE=$(http "/" "-w %{http_code}")
-                    RC=$?
-                    if [[ ${RC} -ne 0 ]]; then
-                      echo "curl --output /dev/null -k -XGET -s -w '%{http_code}' \${BASIC_AUTH} {{ getProtocol .Spec.Security.TLS }}://127.0.0.1:9200/ failed with RC ${RC}"
-                      exit ${RC}
-                    fi
-                    # ready if HTTP code 200
-                    if [[ ${HTTP_CODE} == "200" ]]; then
-                      exit 0
-                    else
-                      echo "curl --output /dev/null -k -XGET -s -w '%{http_code}' \${BASIC_AUTH} {{ getProtocol .Spec.Security.TLS }}://127.0.0.1:9200/ failed with HTTP code ${HTTP_CODE}"
-                      exit 1
-                    fi
-                  else
-                    echo 'Waiting for elasticsearch cluster to become ready (request params: "wait_for_status=green&timeout=1s" )'
-                    if http "/_cluster/health?wait_for_status=green&timeout=1s" "--fail" ; then
-                      touch ${START_FILE}
-                      exit 0
-                    else
-                      echo 'Cluster is not yet ready (request params: "wait_for_status=green&timeout=1s" )'
-                      exit 1
-                    fi
-                  fi
-            failureThreshold: 10
-            initialDelaySeconds: 10
-            periodSeconds: 12
-            successThreshold: 1
-            timeoutSeconds: 12
-      volumes:
-        - name: config
-          configMap:
-            name: {{ .Name }}-config
-            items:
-                - key: elasticsearch.yml
-                  path: elasticsearch.yml
-        {{ if .Spec.Security.User.SecretName }}
-        - name: cert
-          secret:
-            secretName:  "skywalking-storage"
-        {{end}}`)
-
-func storageElasticsearchTemplatesStatefulsetYamlBytes() ([]byte, error) {
-	return _storageElasticsearchTemplatesStatefulsetYaml, nil
-}
-
-func storageElasticsearchTemplatesStatefulsetYaml() (*asset, error) {
-	bytes, err := storageElasticsearchTemplatesStatefulsetYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "storage/elasticsearch/templates/statefulset.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x54, 0x31, 0xb6, 0xbf, 0xaf, 0xb2, 0x47, 0xea, 0xb2, 0x4f, 0x5, 0x54, 0xd6, 0x55, 0xa2, 0x68, 0x47, 0xb2, 0x78, 0x3a, 0xf3, 0x9, 0xf4, 0x56, 0x12, 0xd4, 0x99, 0xcf, 0x23, 0x5e, 0xe7}}
-	return a, nil
-}
-
-var _uiTemplatesDeploymentYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: {{ .Name }}-ui
-  namespace: {{ .Namespace }}
-  labels:
-    app: ui
-    operator.skywalking.apache.org/ui-name: {{ .Name }}
-    operator.skywalking.apache.org/application: ui
-    operator.skywalking.apache.org/component: deployment
-spec:
-  replicas: {{ .Spec.Instances }}
-  minReadySeconds: 5
-  selector:
-    matchLabels:
-      app: ui
-      operator.skywalking.apache.org/ui-name: {{ .Name }}
-  template:
-    metadata:
-      labels:
-        app: ui
-        operator.skywalking.apache.org/ui-name: {{ .Name }}
-        operator.skywalking.apache.org/application: ui
-        operator.skywalking.apache.org/component: deployment
-    spec:
-      affinity:
-        podAntiAffinity:
-          preferredDuringSchedulingIgnoredDuringExecution:
-            - weight: 1
-              podAffinityTerm:
-                topologyKey: kubernetes.io/hostname
-                labelSelector:
-                  matchLabels:
-                    app: ui
-                    operator.skywalking.apache.org/ui-name: {{ .Name }}
-      containers:
-      - name: ui
-        image: {{ .Spec.Image }}
-        imagePullPolicy: IfNotPresent
-        ports:
-        - containerPort: 8080
-          name: page
-        livenessProbe:
-          initialDelaySeconds: 10
-          timeoutSeconds: 10
-          periodSeconds: 30
-          failureThreshold: 3
-          successThreshold: 1
-          httpGet:
-            path: /
-            port: 8080
-        readinessProbe:
-          initialDelaySeconds: 10
-          timeoutSeconds: 10
-          periodSeconds: 30
-          failureThreshold: 3
-          successThreshold: 1
-          httpGet:
-            path: /
-            port: 8080
-        env:
-          - name: SW_OAP_ADDRESS
-            value: {{ .Spec.OAPServerAddress }}
-`)
-
-func uiTemplatesDeploymentYamlBytes() ([]byte, error) {
-	return _uiTemplatesDeploymentYaml, nil
-}
-
-func uiTemplatesDeploymentYaml() (*asset, error) {
-	bytes, err := uiTemplatesDeploymentYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "ui/templates/deployment.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x19, 0x7d, 0xe7, 0x88, 0xad, 0x5b, 0x81, 0x96, 0xe0, 0xbd, 0x6c, 0xfe, 0x62, 0x8, 0x9f, 0x7b, 0xca, 0x2, 0x25, 0x75, 0x8c, 0x4, 0xee, 0xd4, 0xb9, 0xbf, 0xee, 0x8f, 0x2d, 0xa8, 0x5d, 0xb9}}
-	return a, nil
-}
-
-var _uiTemplatesIngressYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.
- 
-{{- $ingress := .Spec.Service.Ingress }}
-{{ if $ingress.Host }}
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: {{ .Name }}-ui
-  namespace: {{ .Namespace }}
-  labels:
-    app: ui
-    operator.skywalking.apache.org/ui-name: {{ .Name }}
-    operator.skywalking.apache.org/application: ui
-    operator.skywalking.apache.org/component: deployment
-  annotations:
-    {{- range $key, $value := $ingress.Annotations }}
-    {{ $key }}: {{ $value | quote }}
-    {{- end }}
-spec:
-  rules:
-    - host: {{ $ingress.Host }}
-      http:
-        paths:
-        - backend:
-            service:
-              name: {{ .Name }}-ui
-              port:
-                number: 80
-          path: /
-          pathType: Prefix
-  {{- if $ingress.IngressClassName }}
-  ingressClassName: {{ $ingress.IngressClassName }}
-  {{end}}
-  {{- if $ingress.TLS }}
-  tls:
-{{ toYAML $ingress.TLS | indent 4 }}
-  {{end}}
-{{end}}
-`)
-
-func uiTemplatesIngressYamlBytes() ([]byte, error) {
-	return _uiTemplatesIngressYaml, nil
-}
-
-func uiTemplatesIngressYaml() (*asset, error) {
-	bytes, err := uiTemplatesIngressYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "ui/templates/ingress.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa7, 0x22, 0xaf, 0xa7, 0x77, 0x36, 0x3a, 0x57, 0x1c, 0x52, 0x67, 0x42, 0xa0, 0x4a, 0xcf, 0xf7, 0xe9, 0x91, 0x75, 0x45, 0xdf, 0xdc, 0xa3, 0x68, 0x5c, 0x79, 0xc0, 0xbe, 0xf8, 0xb1, 0x61, 0x5e}}
-	return a, nil
-}
-
-var _uiTemplatesServiceYaml = []byte(`# 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.
-{{- $svc := .Spec.Service.Template }}
-apiVersion: v1
-kind: Service
-metadata:
-  name: {{ .Name }}-ui
-  namespace: {{ .Namespace }}
-  labels:
-    app: ui
-    operator.skywalking.apache.org/ui-name: {{ .Name }}
-    operator.skywalking.apache.org/application: ui
-    operator.skywalking.apache.org/component: service
-spec:
-  type: {{ $svc.Type }}
-  ports:
-    - port: 80
-      targetPort: 8080
-      name: page
-  {{- if $svc.ExternalIPs }}
-  externalIPs:
-    {{- range $value := $svc.ExternalIPs }}
-    - {{ $value | quote }}
-    {{- end }}
-  {{- end }}
-  {{- if $svc.LoadBalancerIP }}
-  loadBalancerIP: {{ $svc.LoadBalancerIP }}
-  {{- end }}
-  {{- if $svc.LoadBalancerSourceRanges }}
-  loadBalancerSourceRanges:
-    {{- range $value := $svc.LoadBalancerSourceRanges }}
-    - {{ $value | quote}}
-    {{- end }}
-  {{- end }}
-  selector:
-    app: ui
-    operator.skywalking.apache.org/ui-name: {{ .Name }}
-`)
-
-func uiTemplatesServiceYamlBytes() ([]byte, error) {
-	return _uiTemplatesServiceYaml, nil
-}
-
-func uiTemplatesServiceYaml() (*asset, error) {
-	bytes, err := uiTemplatesServiceYamlBytes()
-	if err != nil {
-		return nil, err
-	}
-
-	info := bindataFileInfo{name: "ui/templates/service.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
-	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x25, 0xdf, 0xf0, 0x9e, 0x39, 0xbe, 0x97, 0x7e, 0x89, 0xb8, 0xc7, 0xa8, 0xc7, 0x13, 0x20, 0x9c, 0x33, 0x24, 0xb7, 0xa7, 0x83, 0x42, 0xf3, 0xdc, 0xd6, 0x4a, 0x53, 0x16, 0x48, 0x83, 0x36, 0x9e}}
-	return a, nil
-}
-
-// Asset loads and returns the asset for the given name.
-// It returns an error if the asset could not be found or
-// could not be loaded.
-func Asset(name string) ([]byte, error) {
-	canonicalName := strings.Replace(name, "\\", "/", -1)
-	if f, ok := _bindata[canonicalName]; ok {
-		a, err := f()
-		if err != nil {
-			return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
-		}
-		return a.bytes, nil
-	}
-	return nil, fmt.Errorf("Asset %s not found", name)
-}
-
-// AssetString returns the asset contents as a string (instead of a []byte).
-func AssetString(name string) (string, error) {
-	data, err := Asset(name)
-	return string(data), err
-}
-
-// MustAsset is like Asset but panics when Asset would return an error.
-// It simplifies safe initialization of global variables.
-func MustAsset(name string) []byte {
-	a, err := Asset(name)
-	if err != nil {
-		panic("asset: Asset(" + name + "): " + err.Error())
-	}
-
-	return a
-}
-
-// MustAssetString is like AssetString but panics when Asset would return an
-// error. It simplifies safe initialization of global variables.
-func MustAssetString(name string) string {
-	return string(MustAsset(name))
-}
-
-// AssetInfo loads and returns the asset info for the given name.
-// It returns an error if the asset could not be found or
-// could not be loaded.
-func AssetInfo(name string) (os.FileInfo, error) {
-	canonicalName := strings.Replace(name, "\\", "/", -1)
-	if f, ok := _bindata[canonicalName]; ok {
-		a, err := f()
-		if err != nil {
-			return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
-		}
-		return a.info, nil
-	}
-	return nil, fmt.Errorf("AssetInfo %s not found", name)
-}
-
-// AssetDigest returns the digest of the file with the given name. It returns an
-// error if the asset could not be found or the digest could not be loaded.
-func AssetDigest(name string) ([sha256.Size]byte, error) {
-	canonicalName := strings.Replace(name, "\\", "/", -1)
-	if f, ok := _bindata[canonicalName]; ok {
-		a, err := f()
-		if err != nil {
-			return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err)
-		}
-		return a.digest, nil
-	}
-	return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name)
-}
-
-// Digests returns a map of all known files and their checksums.
-func Digests() (map[string][sha256.Size]byte, error) {
-	mp := make(map[string][sha256.Size]byte, len(_bindata))
-	for name := range _bindata {
-		a, err := _bindata[name]()
-		if err != nil {
-			return nil, err
-		}
-		mp[name] = a.digest
-	}
-	return mp, nil
-}
-
-// AssetNames returns the names of the assets.
-func AssetNames() []string {
-	names := make([]string, 0, len(_bindata))
-	for name := range _bindata {
-		names = append(names, name)
-	}
-	return names
-}
-
-// _bindata is a table, holding each asset generator, mapped to its name.
-var _bindata = map[string]func() (*asset, error){
-	"fetcher/templates/cluster_role.yaml":                  fetcherTemplatesCluster_roleYaml,
-	"fetcher/templates/cluster_role_binding.yaml":          fetcherTemplatesCluster_role_bindingYaml,
-	"fetcher/templates/configmap.yaml":                     fetcherTemplatesConfigmapYaml,
-	"fetcher/templates/deployment.yaml":                    fetcherTemplatesDeploymentYaml,
-	"fetcher/templates/service_account.yaml":               fetcherTemplatesService_accountYaml,
-	"injector/templates/annotations.yaml":                  injectorTemplatesAnnotationsYaml,
-	"injector/templates/configmap.yaml":                    injectorTemplatesConfigmapYaml,
-	"injector/templates/javaagent.yaml":                    injectorTemplatesJavaagentYaml,
-	"oapserver/templates/cluster_role.yaml":                oapserverTemplatesCluster_roleYaml,
-	"oapserver/templates/cluster_role_binding.yaml":        oapserverTemplatesCluster_role_bindingYaml,
-	"oapserver/templates/deployment.yaml":                  oapserverTemplatesDeploymentYaml,
-	"oapserver/templates/ingress.yaml":                     oapserverTemplatesIngressYaml,
-	"oapserver/templates/service.yaml":                     oapserverTemplatesServiceYaml,
-	"oapserver/templates/service_account.yaml":             oapserverTemplatesService_accountYaml,
-	"satellite/templates/cluster_role.yaml":                satelliteTemplatesCluster_roleYaml,
-	"satellite/templates/cluster_role_binding.yaml":        satelliteTemplatesCluster_role_bindingYaml,
-	"satellite/templates/deployment.yaml":                  satelliteTemplatesDeploymentYaml,
-	"satellite/templates/service.yaml":                     satelliteTemplatesServiceYaml,
-	"satellite/templates/service_account.yaml":             satelliteTemplatesService_accountYaml,
-	"storage/elasticsearch/templates/configmap.yaml":       storageElasticsearchTemplatesConfigmapYaml,
-	"storage/elasticsearch/templates/service.yaml":         storageElasticsearchTemplatesServiceYaml,
-	"storage/elasticsearch/templates/service_account.yaml": storageElasticsearchTemplatesService_accountYaml,
-	"storage/elasticsearch/templates/statefulset.yaml":     storageElasticsearchTemplatesStatefulsetYaml,
-	"ui/templates/deployment.yaml":                         uiTemplatesDeploymentYaml,
-	"ui/templates/ingress.yaml":                            uiTemplatesIngressYaml,
-	"ui/templates/service.yaml":                            uiTemplatesServiceYaml,
-}
-
-// AssetDebug is true if the assets were built with the debug flag enabled.
-const AssetDebug = false
-
-// AssetDir returns the file names below a certain
-// directory embedded in the file by go-bindata.
-// For example if you run go-bindata on data/... and data contains the
-// following hierarchy:
-//     data/
-//       foo.txt
-//       img/
-//         a.png
-//         b.png
-// then AssetDir("data") would return []string{"foo.txt", "img"},
-// AssetDir("data/img") would return []string{"a.png", "b.png"},
-// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and
-// AssetDir("") will return []string{"data"}.
-func AssetDir(name string) ([]string, error) {
-	node := _bintree
-	if len(name) != 0 {
-		canonicalName := strings.Replace(name, "\\", "/", -1)
-		pathList := strings.Split(canonicalName, "/")
-		for _, p := range pathList {
-			node = node.Children[p]
-			if node == nil {
-				return nil, fmt.Errorf("Asset %s not found", name)
-			}
-		}
-	}
-	if node.Func != nil {
-		return nil, fmt.Errorf("Asset %s not found", name)
-	}
-	rv := make([]string, 0, len(node.Children))
-	for childName := range node.Children {
-		rv = append(rv, childName)
-	}
-	return rv, nil
-}
-
-type bintree struct {
-	Func     func() (*asset, error)
-	Children map[string]*bintree
-}
-
-var _bintree = &bintree{nil, map[string]*bintree{
-	"fetcher": &bintree{nil, map[string]*bintree{
-		"templates": &bintree{nil, map[string]*bintree{
-			"cluster_role.yaml":         &bintree{fetcherTemplatesCluster_roleYaml, map[string]*bintree{}},
-			"cluster_role_binding.yaml": &bintree{fetcherTemplatesCluster_role_bindingYaml, map[string]*bintree{}},
-			"configmap.yaml":            &bintree{fetcherTemplatesConfigmapYaml, map[string]*bintree{}},
-			"deployment.yaml":           &bintree{fetcherTemplatesDeploymentYaml, map[string]*bintree{}},
-			"service_account.yaml":      &bintree{fetcherTemplatesService_accountYaml, map[string]*bintree{}},
-		}},
-	}},
-	"injector": &bintree{nil, map[string]*bintree{
-		"templates": &bintree{nil, map[string]*bintree{
-			"annotations.yaml": &bintree{injectorTemplatesAnnotationsYaml, map[string]*bintree{}},
-			"configmap.yaml":   &bintree{injectorTemplatesConfigmapYaml, map[string]*bintree{}},
-			"javaagent.yaml":   &bintree{injectorTemplatesJavaagentYaml, map[string]*bintree{}},
-		}},
-	}},
-	"oapserver": &bintree{nil, map[string]*bintree{
-		"templates": &bintree{nil, map[string]*bintree{
-			"cluster_role.yaml":         &bintree{oapserverTemplatesCluster_roleYaml, map[string]*bintree{}},
-			"cluster_role_binding.yaml": &bintree{oapserverTemplatesCluster_role_bindingYaml, map[string]*bintree{}},
-			"deployment.yaml":           &bintree{oapserverTemplatesDeploymentYaml, map[string]*bintree{}},
-			"ingress.yaml":              &bintree{oapserverTemplatesIngressYaml, map[string]*bintree{}},
-			"service.yaml":              &bintree{oapserverTemplatesServiceYaml, map[string]*bintree{}},
-			"service_account.yaml":      &bintree{oapserverTemplatesService_accountYaml, map[string]*bintree{}},
-		}},
-	}},
-	"satellite": &bintree{nil, map[string]*bintree{
-		"templates": &bintree{nil, map[string]*bintree{
-			"cluster_role.yaml":         &bintree{satelliteTemplatesCluster_roleYaml, map[string]*bintree{}},
-			"cluster_role_binding.yaml": &bintree{satelliteTemplatesCluster_role_bindingYaml, map[string]*bintree{}},
-			"deployment.yaml":           &bintree{satelliteTemplatesDeploymentYaml, map[string]*bintree{}},
-			"service.yaml":              &bintree{satelliteTemplatesServiceYaml, map[string]*bintree{}},
-			"service_account.yaml":      &bintree{satelliteTemplatesService_accountYaml, map[string]*bintree{}},
-		}},
-	}},
-	"storage": &bintree{nil, map[string]*bintree{
-		"elasticsearch": &bintree{nil, map[string]*bintree{
-			"templates": &bintree{nil, map[string]*bintree{
-				"configmap.yaml":       &bintree{storageElasticsearchTemplatesConfigmapYaml, map[string]*bintree{}},
-				"service.yaml":         &bintree{storageElasticsearchTemplatesServiceYaml, map[string]*bintree{}},
-				"service_account.yaml": &bintree{storageElasticsearchTemplatesService_accountYaml, map[string]*bintree{}},
-				"statefulset.yaml":     &bintree{storageElasticsearchTemplatesStatefulsetYaml, map[string]*bintree{}},
-			}},
-		}},
-	}},
-	"ui": &bintree{nil, map[string]*bintree{
-		"templates": &bintree{nil, map[string]*bintree{
-			"deployment.yaml": &bintree{uiTemplatesDeploymentYaml, map[string]*bintree{}},
-			"ingress.yaml":    &bintree{uiTemplatesIngressYaml, map[string]*bintree{}},
-			"service.yaml":    &bintree{uiTemplatesServiceYaml, map[string]*bintree{}},
-		}},
-	}},
-}}
-
-// RestoreAsset restores an asset under the given directory.
-func RestoreAsset(dir, name string) error {
-	data, err := Asset(name)
-	if err != nil {
-		return err
-	}
-	info, err := AssetInfo(name)
-	if err != nil {
-		return err
-	}
-	err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
-	if err != nil {
-		return err
-	}
-	err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
-	if err != nil {
-		return err
-	}
-	return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
-}
-
-// RestoreAssets restores an asset under the given directory recursively.
-func RestoreAssets(dir, name string) error {
-	children, err := AssetDir(name)
-	// File
-	if err != nil {
-		return RestoreAsset(dir, name)
-	}
-	// Dir
-	for _, child := range children {
-		err = RestoreAssets(dir, filepath.Join(name, child))
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func _filePath(dir, name string) string {
-	canonicalName := strings.Replace(name, "\\", "/", -1)
-	return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
-}
