You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ha...@apache.org on 2022/08/31 00:41:13 UTC

[skywalking-swck] branch master updated: [Feature] [SWCK] Add Instrument CRD to config and operate instruments. (#66)

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

hanahmily pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-swck.git


The following commit(s) were added to refs/heads/master by this push:
     new 7bdb235  [Feature] [SWCK] Add Instrument CRD to config and operate instruments. (#66)
7bdb235 is described below

commit 7bdb235ed6516f53d6e566236596ebf7744b0be5
Author: Duncan Zhou <57...@users.noreply.github.com>
AuthorDate: Wed Aug 31 08:41:07 2022 +0800

    [Feature] [SWCK] Add Instrument CRD to config and operate instruments. (#66)
    
    * add agent crd
    
    * default remove configmap
    
    * add optional plugin e2e case
    
    * remove agent overlay annotation
    
    * update docs
    
    Co-authored-by: 吴晟 Wu Sheng <wu...@foxmail.com>
---
 .github/workflows/go.yml                           |  34 +-
 Makefile                                           |   7 +-
 docs/examples/java-agent-injector-usage.md         | 398 ++++++++++-----------
 docs/java-agent-injector.md                        |  75 +++-
 golangci.yml                                       |   3 +-
 hack/build/module.mk                               |   2 +-
 operator/PROJECT                                   |  13 +
 .../apis/operator/v1alpha1/javaagent_webhook.go    |  28 +-
 operator/apis/operator/v1alpha1/swagent_types.go   | 127 +++++++
 operator/apis/operator/v1alpha1/swagent_webhook.go | 138 +++++++
 .../operator/v1alpha1/zz_generated.deepcopy.go     | 177 +++++++++
 .../operator.skywalking.apache.org_fetchers.yaml   |   2 +-
 .../operator.skywalking.apache.org_javaagents.yaml |   2 +-
 ...tor.skywalking.apache.org_oapserverconfigs.yaml |   2 +-
 ...walking.apache.org_oapserverdynamicconfigs.yaml |   2 +-
 .../operator.skywalking.apache.org_oapservers.yaml |   2 +-
 .../operator.skywalking.apache.org_satellites.yaml |   2 +-
 .../operator.skywalking.apache.org_storages.yaml   |   2 +-
 .../operator.skywalking.apache.org_swagents.yaml   | 276 ++++++++++++++
 .../bases/operator.skywalking.apache.org_uis.yaml  |   2 +-
 operator/config/crd/kustomization.yaml             |   3 +
 .../crd/patches/cainjection_in_swagents.yaml       |  24 ++
 .../config/crd/patches/webhook_in_swagents.yaml    |  33 ++
 operator/config/manager/manager.yaml               |   4 +-
 operator/config/rbac/role.yaml                     |  28 +-
 operator/config/rbac/swagent_editor_role.yaml      |  41 +++
 operator/config/rbac/swagent_viewer_role.yaml      |  37 ++
 .../config/samples/operator_v1alpha1_swagent.yaml  |  23 ++
 operator/config/webhook/manifests.yaml             |  82 +++--
 .../controllers/operator/configmap_controller.go   |   2 +-
 .../controllers/operator/fetcher_controller.go     |   2 +-
 .../controllers/operator/javaagent_controller.go   |  68 +++-
 .../controllers/operator/oapserver_controller.go   |   2 +-
 .../operator/oapserverconfig_controller.go         |   2 +-
 .../operator/oapserverdynamicconfig_controller.go  |   2 +-
 .../controllers/operator/satellite_controller.go   |   2 +-
 .../controllers/operator/storage_controller.go     |   4 +-
 .../controllers/operator/swagent_controller.go     |  52 +++
 operator/controllers/operator/ui_controller.go     |   2 +-
 operator/dist/LICENSE                              | 147 ++++----
 ...se-github.com-antlr-antlr4-runtime-Go-antlr.txt |  26 ++
 .../license-github.com-armon-go-socks5.txt         |  20 ++
 .../license-github.com-blang-semver-v4.txt         |  22 ++
 .../licenses/license-github.com-cncf-xds-go.txt    | 201 +++++++++++
 .../license-github.com-getkin-kin-openapi.txt      |  21 ++
 .../licenses/license-github.com-google-cel-go.txt  | 233 ++++++++++++
 .../license-github.com-google-cel-spec.txt         | 202 +++++++++++
 .../licenses/license-github.com-google-gnostic.txt | 203 +++++++++++
 .../license-github.com-google-martian-v3.txt       | 202 +++++++++++
 .../licenses/license-github.com-gorilla-mux.txt    |  27 ++
 .../dist/licenses/license-github.com-kr-fs.txt     |  27 ++
 .../dist/licenses/license-github.com-pkg-sftp.txt  |   9 +
 .../dist/licenses/license-sigs.k8s.io-json.txt     | 238 ++++++++++++
 operator/go.mod                                    |  74 ++--
 operator/go.sum                                    | 334 +++++++++++++----
 operator/main.go                                   |  11 +
 operator/pkg/kubernetes/apply.go                   |   6 +-
 operator/pkg/operator/injector/configmap.go        |   6 +-
 operator/pkg/operator/injector/injection.go        |  48 ++-
 operator/pkg/operator/injector/injector.go         | 273 ++++++++------
 operator/pkg/operator/injector/webhook.go          |  36 +-
 .../manifests/injector/templates/annotations.yaml  |   6 +-
 test/e2e/{demo.yaml => demo-swagent.yaml}          |   5 -
 test/e2e/demo.yaml                                 |   1 -
 test/e2e/oap-ui-swagent-configmap/e2e.yaml         | 117 ++++++
 test/e2e/oap-ui-swagent/e2e.yaml                   | 117 ++++++
 test/e2e/resource.yaml                             |   1 -
 ...ywalking-components-with-swagent-configmap.yaml |  93 +++++
 test/e2e/skywalking-components-with-swagent.yaml   |  90 +++++
 test/e2e/verify/optional-plugin.yaml               |  19 +
 .../verify/swagent-configmap-initcontainer.yaml    |  24 ++
 .../verify/swagent-configmap-target-container.yaml |  25 ++
 .../e2e/verify/swagent-configmap-volumemounts.yaml |  20 ++
 test/e2e/verify/swagent-initcontainer.yaml         |  22 ++
 test/e2e/verify/swagent-target-container.yaml      |  25 ++
 test/e2e/verify/swagent-volumemount.yaml           |  19 +
 76 files changed, 4085 insertions(+), 572 deletions(-)

diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index bd51eea..73aaa8d 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -86,6 +86,36 @@ jobs:
         uses: apache/skywalking-infra-e2e@996ed8902e941e2883fcf0ac5b3090364942d205      # always prefer to use a revision instead of `main`.
         with:
           e2e-file: test/e2e/oap-ui-agent/e2e.yaml               # need to run E2E file path
+  swagent-e2e-tests:
+    name: e2e tests(oap+ui+swagent)
+    runs-on: ubuntu-latest
+    steps:
+      - name: Install Go
+        uses: actions/setup-go@v2
+        with:
+          go-version: 1.17
+        id: go
+      - name: Check out code into the Go module directory
+        uses: actions/checkout@v2
+      - name: Run E2E Test(oap+ui+agent)
+        uses: apache/skywalking-infra-e2e@996ed8902e941e2883fcf0ac5b3090364942d205
+        with:
+          e2e-file: test/e2e/oap-ui-swagent/e2e.yaml
+  swagent-configmap-e2e-tests:
+    name: e2e tests(oap+ui+swagent+configmap)
+    runs-on: ubuntu-latest
+    steps:
+      - name: Install Go
+        uses: actions/setup-go@v2
+        with:
+          go-version: 1.17
+        id: go
+      - name: Check out code into the Go module directory
+        uses: actions/checkout@v2
+      - name: Run E2E Test(oap+ui+agent+configmap)
+        uses: apache/skywalking-infra-e2e@996ed8902e941e2883fcf0ac5b3090364942d205
+        with:
+          e2e-file: test/e2e/oap-ui-swagent-configmap/e2e.yaml
   internel-storage-e2e-tests:
     name: e2e tests(oap+ui+agent+internel-storage)
     runs-on: ubuntu-latest
@@ -173,12 +203,12 @@ jobs:
       - name: Check out code into the Go module directory
         uses: actions/checkout@v2
       - name: Run E2E Test
-        uses: apache/skywalking-infra-e2e@996ed8902e941e2883fcf0ac5b3090364942d205     
+        uses: apache/skywalking-infra-e2e@996ed8902e941e2883fcf0ac5b3090364942d205
         with:
           e2e-file: test/e2e/oap-ui-agent-oapserverconfig-oapserverdynamicconfig/e2e.yaml
   checks:
     name: build
     runs-on: ubuntu-20.04
-    needs: [check, build, unit-tests, e2e-tests, internel-storage-e2e-tests, external-storage-e2e-tests, adapter-hpa-e2e-tests, e2e-tests-with-satellite, adapter-satellite-hpa-e2e-tests, oapserver-configuration-e2e-tests]
+    needs: [check, build, unit-tests, e2e-tests, swagent-e2e-tests, swagent-configmap-e2e-tests, internel-storage-e2e-tests, external-storage-e2e-tests, adapter-hpa-e2e-tests, e2e-tests-with-satellite, adapter-satellite-hpa-e2e-tests, oapserver-configuration-e2e-tests]
     steps:
       - run: echo 'success'
diff --git a/Makefile b/Makefile
index f85251e..2ffd9b2 100644
--- a/Makefile
+++ b/Makefile
@@ -54,13 +54,18 @@ clean: ## Clean project
 ##@ End to End Test
 
 .PHONY:e2e-test
-e2e-test: e2e-oap-ui-agent e2e-oap-ui-agent-storage-internal e2e-oap-agent-adapter-hpa e2e-oap-ui-agent-satellite e2e-oap-agent-satellite-adapter-hpa e2e-oap-ui-agent-oapserverconfig-oapserverdynamicconfig ## Run End to End tests.
+e2e-test: e2e-oap-ui-agent e2e-oap-ui-swagent e2e-oap-ui-agent-storage-internal e2e-oap-agent-adapter-hpa e2e-oap-ui-agent-satellite e2e-oap-agent-satellite-adapter-hpa e2e-oap-ui-agent-oapserverconfig-oapserverdynamicconfig ## Run End to End tests.
 
 .PHONY:e2e-oap-ui-agent
 e2e-oap-ui-agent: e2e ## Run oap+ui+agent test
 	@echo "Run oap+ui+agent e2e..."
 	$(E2E) run -c test/e2e/oap-ui-agent/e2e.yaml
 
+.PHONY:e2e-oap-ui-swagent
+e2e-oap-ui-swagent: e2e ## Run oap+ui+swagent test
+	@echo "Run oap+ui+swagent e2e..."
+	$(E2E) run -c test/e2e/oap-ui-swagent/e2e.yaml
+
 .PHONY:e2e-oap-ui-agent-storage-internal
 e2e-oap-ui-agent-internal-storage: e2e ## Run oap+ui+agent test
 	@echo "Run oap+ui+agent e2e..."
diff --git a/docs/examples/java-agent-injector-usage.md b/docs/examples/java-agent-injector-usage.md
index e7b17ea..d85cebc 100644
--- a/docs/examples/java-agent-injector-usage.md
+++ b/docs/examples/java-agent-injector-usage.md
@@ -1,22 +1,18 @@
 # Java agent injector Usage
 
-In this example, you will learn how to use the java agent injector in three ways.
+In this example, you will learn how to use the java agent injector.
 
 ## Install injector
 
-The java agent injector is a component of the operator, so you need to follow [Operator installation instrument](../../README.md#operator) to install the operator firstly.
+The java agent injector is a component of the operator, so you need to
+follow [Operator installation instrument](../../README.md#operator) to install the operator firstly.
 
-## Use default configuration
+## Deployment Example
 
-At first, set the injection label in your namespace as below.
+Let's take a demo deployment for example.
 
-```shell
-kubectl label namespace default(your namespace) swck-injection=enabled
-```
-
-Then add `swck-java-agent-injected: "true"` in the labels of the yaml file as below.
-
-```
+```yaml
+# demo1.yaml
 apiVersion: apps/v1
 kind: Deployment
 metadata:
@@ -29,20 +25,54 @@ spec:
   template:
     metadata:
       labels:
-        swck-java-agent-injected: "true"
         app: demo1
     spec:
       containers:
-      - name: demo1
-        image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1
-        command: ["java"]
-        args: ["-jar","/app.jar"]
-   
+        - name: demo1
+          image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1
+          command: ["java"]
+          args: ["-jar","/app.jar"]
+          ports:
+            - containerPort: 8085
+          readinessProbe:
+            httpGet:
+              path: /hello
+              port: 8085
+            initialDelaySeconds: 3
+            periodSeconds: 3
+            failureThreshold: 10
+
 ```
 
-Get injected resources as below:
+## Enable Injection for Namespace and Deployments/StatefulSets.
 
+Firstly, set the injection label in your namespace as below.
+
+```shell
+kubectl label namespace default(your namespace) swck-injection=enabled
+```
+
+Secondly, set the injection label for your target Deployment/StatefulSet.
+
+```shell
+kubectl -n default patch deployment demo1 --patch '{
+    "spec": {
+        "template": {
+            "metadata": {
+                "labels": {
+                    "swck-java-agent-injected": "true"
+                }
+            }
+        }
+    }
+}'
 ```
+
+Then the pods create by the Deployments/StatefulSets would be recreated with agent injected.
+
+The injected pods would be like this:
+
+```yaml
 spec:
   containers:
   - args:
@@ -57,8 +87,6 @@ spec:
     name: demo1
     - mountPath: /sky/agent
       name: sky-agent
-    - mountPath: /sky/agent/config
-      name: java-agent-configmap-volume
   initContainers:
   - args:
     - -c
@@ -73,36 +101,27 @@ spec:
   volumes:
   - emptyDir: {}
     name: sky-agent
-  - configMap:
-      name: skywalking-swck-java-agent-configmap
-    name: java-agent-configmap-volume
-```
-
-```shell
-$ kubectl get configmap skywalking-swck-java-agent-configmap -n default(your namespace)
-NAME                                   DATA   AGE
-skywalking-swck-java-agent-configmap   1      61s
 ```
 
 Then you can get the final agent configuration and the pod as below.
 
 ```shell
 $ kubectl get javaagent
-NAME                  PODSELECTOR   SERVICENAME            BACKENDSERVICE
-app-demo1-javaagent   app=demo1     Your_ApplicationName   127.0.0.1:11800
+NAME                  PODSELECTOR   SERVICENAME   BACKENDSERVICE
+app-demo1-javaagent   app=demo1     demo1         127.0.0.1:11800
 $ kubectl get pod -l app=demo1(the podSelector)
 NAME                     READY   STATUS    RESTARTS   AGE
-demo1-8554b96b4c-6czv7   1/1     Running   0          85s
+demo1-5fbb6fcd98-cq5ws   1/1     Running   0          54s
 ```
 
 Get the javaagent's yaml for more datails.
 
 ```shell
-$ kubectl get javaagent app-demo1-javaagent -oyaml
+$ kubectl get javaagent app-demo1-javaagent -o yaml
 apiVersion: operator.skywalking.apache.org/v1alpha1
 kind: JavaAgent
 metadata:
-  creationTimestamp: "2021-10-15T04:52:46Z"
+  creationTimestamp: "2022-08-16T12:09:34Z"
   generation: 1
   name: app-demo1-javaagent
   namespace: default
@@ -111,71 +130,82 @@ metadata:
     blockOwnerDeletion: true
     controller: true
     kind: ReplicaSet
-    name: demo1-8554b96b4c
-    uid: f3d71b5c-1e26-401a-8d0d-055d1e89bc64
-  resourceVersion: "455104"
-  selfLink: /apis/operator.skywalking.apache.org/v1alpha1/namespaces/default/javaagents/app-demo1-javaagent
-  uid: 2bf828d6-4f83-4c7d-9356-83066ae334d3
+    name: demo1-7fdffc7b95
+    uid: 417c413f-0cc0-41f9-b6eb-0192eb8c8622
+  resourceVersion: "25067"
+  uid: 1cdab012-784c-4efb-b5d2-c032eb2fb22a
 spec:
-  agentConfiguration:
-    agent.service_name: Your_ApplicationName
-    collector.backend_service: 127.0.0.1:11800
   backendService: 127.0.0.1:11800
   podSelector: app=demo1
   serviceName: Your_ApplicationName
 status:
-  creationTime: "2021-10-15T04:52:46Z"
+  creationTime: "2022-08-16T12:09:34Z"
   expectedInjectiedNum: 1
-  lastUpdateTime: "2021-10-15T04:52:49Z"
+  lastUpdateTime: "2022-08-16T12:10:04Z"
   realInjectedNum: 1
-```
 
-## Use annotation to override sidecar configuration
+```
 
-At first, set the injection label in your namespace as below.
+## Use SwAgent CR to setup override default configuration
 
-```shell
-kubectl label namespace default(your namespace) swck-injection=enabled
-```
+Suppose that injection label had been set for Namespace and Deployments/StatefulSets as [previous said](java-agent-injector-usage.md#enable-injection-for-namespace-and-deploymentsstatefulsets).
 
-Then add `swck-java-agent-injected: "true"` in the labels of yaml file and add the [sidecar configuration](../java-agent-injector.md#configure-sidecar) to the annotations as below.
+Apply SwAgent CR with correct label selector and container matcher:
 
-```
-apiVersion: apps/v1
-kind: Deployment
+```yaml
+# SwAgent.yaml
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: SwAgent
 metadata:
-  name: demo2
+  name: swagent-demo
   namespace: default
 spec:
+  containerMatcher: ''
   selector:
-    matchLabels:
-      app: demo2
-  template:
-    metadata:
-      labels:
-        swck-java-agent-injected: "true"
-        app: demo2
-      annotations:
-        sidecar.skywalking.apache.org/initcontainer.Name: "test-inject-agent"
-        sidecar.skywalking.apache.org/initcontainer.Image: "apache/skywalking-java-agent:8.5.0-jdk8"
-        sidecar.skywalking.apache.org/initcontainer.Command: "sh"
-        sidecar.skywalking.apache.org/initcontainer.args.Option: "-c"
-        sidecar.skywalking.apache.org/initcontainer.args.Command: "mkdir -p /skytest/agent && cp -r /skywalking/agent/* /skytest/agent"
-        sidecar.skywalking.apache.org/sidecarVolumeMount.MountPath: "/skytest/agent"
-        sidecar.skywalking.apache.org/configmapVolumeMount.MountPath: "/skytest/agent/config"
-        sidecar.skywalking.apache.org/configmapVolume.ConfigMap.Name: "newconfigmap"
-        sidecar.skywalking.apache.org/env.Value: "-javaagent:/skytest/agent/skywalking-agent.jar"
-    spec:
-      containers:
-      - name: demo2
-        image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1
-        command: ["java"]
-        args: ["-jar","/app.jar"]
+  javaSidecar:
+    name: swagent-demo
+    image: apache/skywalking-java-agent:8.10.0-java8
+    env:
+      - name: "SW_LOGGING_LEVEL"
+        value: "DEBUG"
+      - name: "SW_AGENT_COLLECTOR_BACKEND_SERVICES"
+        value: "skywalking-system-oap:11800"
+  sharedVolumeName: "sky-agent-demo"
+  optionalPlugins:
+    - "webflux"
+    - "cloud-gateway-2.1.x"
 ```
 
-Get injected resources as below:
+```shell
+kubectl -n default apply swagent.yaml
+```
 
+You can also get SwAgent CR by:
+
+```shell
+kubectl -n default get SwAgent
+NAME           AGE
+swagent-demo   38s
 ```
+
+Now the pod is still the old one, because pod could not load the SwAgent config automatically.
+
+So you need to recreate pod to load SwAgent config. For the pods created by Deployment/StatefulSet, you can just simply delete the old pod.
+
+```shell
+# verify pods to be delete 
+kubectl -n default get pods -l app=demo1
+# delete pods
+kubectl -n default delete pods -l app=demo1
+```
+
+After the pods recreated, we can get injected pod as below.
+
+```shell
+kubectl -n default get pods -l app=demo1
+```
+
+```yaml
 spec:
   containers:
   - args:
@@ -184,116 +214,55 @@ spec:
     command:
     - java
     env:
-    - name: JAVA_TOOL_OPTIONS
-      value: -javaagent:/skytest/agent/skywalking-agent.jar
+      - name: JAVA_TOOL_OPTIONS
+        value: -javaagent:/sky/agent/skywalking-agent.jar=agent.service_name=demo1,collector.backend_service=skywalking-system-oap.skywalking-system:11800
+      - name: SW_LOGGING_LEVEL
+        value: DEBUG
+      - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
+        value: skywalking-system-oap.default.svc:11800
     image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1
-    name: demo2
-    - mountPath: /skytest/agent
-      name: sky-agent
-    - mountPath: /skytest/agent/config
-      name: java-agent-configmap-volume
+    name: demo1
+    - mountPath: /sky/agent
+      name: sky-agent-demo
   initContainers:
   - args:
     - -c
-    - mkdir -p /skytest/agent && cp -r /skywalking/agent/* /skytest/agent
+    - mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent && cd /sky/agent/optional-plugins/
+      && ls | grep -E "webflux|cloud-gateway-2.1.x"  | xargs -i cp {} /sky/agent/plugins/
     command:
     - sh
-    image: apache/skywalking-java-agent:8.5.0-jdk8
-    name: test-inject-agent
+    image: apache/skywalking-java-agent:8.10.0-java8
+    name: swagent-demo
     volumeMounts:
-    - mountPath: /skytest/agent
-      name: sky-agent
+    - mountPath: /sky/agent
+      name: sky-agent-demo
   volumes:
   - emptyDir: {}
-    name: sky-agent
-  - configMap:
-      name: newconfigmap
-    name: java-agent-configmap-volume
-```
-
-```shell
-$ kubectl get configmap newconfigmap -n default
-NAME           DATA   AGE
-newconfigmap   1      2m29s
-```
-
-Then you can get the final agent configuration and the pod as below.
-
-```shell
-$ kubectl get javaagent
-NAME                  PODSELECTOR   SERVICENAME            BACKENDSERVICE
-app-demo2-javaagent   app=demo2     Your_ApplicationName   127.0.0.1:11800
-$ kubectl get pod -l app=demo2(the podSelector)
-NAME                     READY   STATUS    RESTARTS   AGE
-demo2-74b65f98b9-k5wvd   1/1     Running   0          3m28s
-```
-
-Get the javaagent's yaml for more datails.
-
-```shell
-$ kubectl get javaagent app-demo2-javaagent -oyaml
-apiVersion: operator.skywalking.apache.org/v1alpha1
-kind: JavaAgent
-metadata:
-  creationTimestamp: "2021-10-15T05:10:16Z"
-  generation: 1
-  name: app-demo2-javaagent
-  namespace: default
-  ownerReferences:
-  - apiVersion: apps/v1
-    blockOwnerDeletion: true
-    controller: true
-    kind: ReplicaSet
-    name: demo2-74b65f98b9
-    uid: cbc2c680-4f84-469a-bb43-fc48161d6958
-  resourceVersion: "458626"
-  selfLink: /apis/operator.skywalking.apache.org/v1alpha1/namespaces/default/javaagents/app-demo2-javaagent
-  uid: 7c59aab7-30fc-4122-8b39-4cba2d1711b5
-spec:
-  agentConfiguration:
-    agent.service_name: Your_ApplicationName
-    collector.backend_service: 127.0.0.1:11800
-  backendService: 127.0.0.1:11800
-  podSelector: app=demo2
-  serviceName: Your_ApplicationName
-status:
-  creationTime: "2021-10-15T05:10:16Z"
-  expectedInjectiedNum: 1
-  lastUpdateTime: "2021-10-15T05:10:18Z"
-  realInjectedNum: 1
+    name: sky-agent-demo
 ```
 
-#### Use annotation to set the coverage strategy and override the agent configuration
-
-At first, set the injection label in your namespace as below.
-
-```shell
-kubectl label namespace default(your namespace) swck-injection=enabled
-```
+## Use annotation to override sidecar configuration
 
-Then add `swck-java-agent-injected: "true"` in the labels of yaml file and [agent configuration](../java-agent-injector.md#use-annotations-to-overlay-default-agent-configuration) and [sidecar configuration](../java-agent-injector.md#configure-sidecar) to annotations as below.
+Suppose that injection label had been set for Namespace and Deployments/StatefulSets as [previous said](java-agent-injector-usage.md#enable-injection-for-namespace-and-deploymentsstatefulsets).
 
+Then add [agent configuration](../java-agent-injector.md#use-annotations-to-overlay-default-agent-configuration)
+and [sidecar configuration](../java-agent-injector.md#configure-sidecar) to annotations as below.
 
-```
+```yaml
+# demo1_anno.yaml
 apiVersion: apps/v1
 kind: Deployment
 metadata:
-  name: demo3
+  name: demo1
   namespace: default
 spec:
-  replicas: 3
   selector:
     matchLabels:
-      app: demo3
+      app: demo1
   template:
     metadata:
-      name: inject-demo3
-      labels:
-        swck-java-agent-injected: "true"
-        app: demo3
       annotations:
-        strategy.skywalking.apache.org/inject.Container: "demo"
-        strategy.skywalking.apache.org/agent.Overlay: "true"
+        strategy.skywalking.apache.org/inject.Container: "demo1"
         agent.skywalking.apache.org/agent.service_name: "app"
         agent.skywalking.apache.org/agent.sample_n_per_3_secs: "6"
         agent.skywalking.apache.org/agent.class_cache_mode: "MEMORY"
@@ -303,18 +272,33 @@ spec:
         plugins.skywalking.apache.org/plugin.influxdb.trace_influxql: "false"
         optional.skywalking.apache.org: "trace|webflux|cloud-gateway-2.1.x"
         optional-reporter.skywalking.apache.org: "kafka"
-      namespace: default
+      labels:
+        swck-java-agent-injected: "true"
+        app: demo1
     spec:
       containers:
-      - name: demo3
-        image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1
-        command: ["java"]
-        args: ["-jar","/app.jar"]
+        - name: demo1
+          image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1
+          command: ["java"]
+          args: ["-jar","/app.jar"]
+          ports:
+            - containerPort: 8085
+          readinessProbe:
+            httpGet:
+              path: /hello
+              port: 8085
+            initialDelaySeconds: 3
+            periodSeconds: 3
+            failureThreshold: 10
 ```
 
-Get injected resources as below:
+Then we can get injected pod as below:
 
+```shell
+kubectl -n default get pods -l app=demo1
 ```
+
+```yaml
 spec:
   containers:
   - image: nginx:1.16.1
@@ -327,19 +311,31 @@ spec:
     - java
     env:
     - name: JAVA_TOOL_OPTIONS
-      value: -javaagent:/sky/agent/skywalking-agent.jar=agent.ignore_suffix='jpg,.jpeg',agent.class_cache_mode=MEMORY,agent.sample_n_per_3_secs=6,agent.service_name=app,plugin.mount='plugins,activations',plugin.influxdb.trace_influxql=false,plugin.mongodb.trace_param=true
+      value: -javaagent:/sky/agent/skywalking-agent.jar=agent.ignore_suffix='jpg,.jpeg',agent.service_name=app,agent.class_cache_mode=MEMORY,agent.sample_n_per_3_secs=6,plugin.mongodb.trace_param=true,plugin.influxdb.trace_influxql=false,plugin.mount='plugins,activations'
     image: ghcr.io/apache/skywalking-swck-spring-demo:v0.0.1
-    name: demo3
+    name: demo1
+    ports:
+    - containerPort: 8085
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 10
+      httpGet:
+        path: /hello
+        port: 8085
+        scheme: HTTP
+      initialDelaySeconds: 3
+      periodSeconds: 3
+      successThreshold: 1
+      timeoutSeconds: 1
+    volumeMounts: 
     - mountPath: /sky/agent
       name: sky-agent
-    - mountPath: /sky/agent/config
-      name: java-agent-configmap-volume
   initContainers:
   - args:
     - -c
-    - mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent && cd /sky/agent/optional-plugins/&&
-      ls | grep -E "trace|webflux|cloud-gateway-2.1.x"  | xargs -i cp {} /sky/agent/plugins/
-      && cd /sky/agent/optional-reporter-plugins/&& ls | grep -E "kafka"  | xargs
+    - mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent && cd /sky/agent/optional-plugins/
+      && ls | grep -E "trace|webflux|cloud-gateway-2.1.x"  | xargs -i cp {} /sky/agent/plugins/
+      && cd /sky/agent/optional-reporter-plugins/ && ls | grep -E "kafka"  | xargs
       -i cp {} /sky/agent/plugins/
     command:
     - sh
@@ -351,15 +347,7 @@ spec:
   volumes:
   - emptyDir: {}
     name: sky-agent
-  - configMap:
-      name: skywalking-swck-java-agent-configmap
-    name: java-agent-configmap-volume
-```
 
-```shell
-$ kubectl get configmap skywalking-swck-java-agent-configmap -n default
-NAME                                   DATA   AGE
-skywalking-swck-java-agent-configmap   1      17s
 ```
 
 Then you can get the final agent configuration and the pod as below.
@@ -367,53 +355,51 @@ Then you can get the final agent configuration and the pod as below.
 ```shell
 $ kubectl get javaagent
 NAME                  PODSELECTOR   SERVICENAME   BACKENDSERVICE
-app-demo3-javaagent   app=demo3     app           127.0.0.1:11800
-$ kubectl get pod -l app=demo3(the podSelector)
-NAME                     READY   STATUS    RESTARTS   AGE
-demo3-69bff546df-55w8c   1/1     Running   0          57s
-demo3-69bff546df-mn5fq   1/1     Running   0          57s
-demo3-69bff546df-skklk   1/1     Running   0          57s
+app-demo1-javaagent   app=demo1     app           127.0.0.1:11800
+
+$ kubectl get pod -l app=demo1(the podSelector)
+NAME                    READY   STATUS    RESTARTS   AGE
+demo1-d48b96467-p7zrv   1/1     Running   0          5m25s
 ```
 
 Get the javaagent's yaml for more datails.
 
 ```shell
-$ kubectl get javaagent app-demo3-javaagent -oyaml
+$ kubectl get javaagent app-demo1-javaagent -o yaml
 apiVersion: operator.skywalking.apache.org/v1alpha1
 kind: JavaAgent
 metadata:
-  creationTimestamp: "2021-10-15T05:21:06Z"
+  creationTimestamp: "2022-08-16T12:18:53Z"
   generation: 1
-  name: app-demo3-javaagent
+  name: app-demo1-javaagent
   namespace: default
   ownerReferences:
   - apiVersion: apps/v1
     blockOwnerDeletion: true
     controller: true
     kind: ReplicaSet
-    name: demo3-69bff546df
-    uid: 1f04a239-0247-4f5c-967a-64009adae42c
-  resourceVersion: "461000"
-  selfLink: /apis/operator.skywalking.apache.org/v1alpha1/namespaces/default/javaagents/app-demo3-javaagent
-  uid: be35588e-9b2d-4528-90df-c1a630616632
+    name: demo1-d48b96467
+    uid: 2b7f1ac4-b459-41cd-8568-ecd4578ca457
+  resourceVersion: "26187"
+  uid: c2b2f3e2-9442-4465-9423-d24249b2c53b
 spec:
   agentConfiguration:
     agent.class_cache_mode: MEMORY
     agent.ignore_suffix: '''jpg,.jpeg'''
     agent.sample_n_per_3_secs: "6"
     agent.service_name: app
-    collector.backend_service: 127.0.0.1:11800
     optional-plugin: trace|webflux|cloud-gateway-2.1.x
     optional-reporter-plugin: kafka
     plugin.influxdb.trace_influxql: "false"
     plugin.mongodb.trace_param: "true"
     plugin.mount: '''plugins,activations'''
   backendService: 127.0.0.1:11800
-  podSelector: app=demo3
+  podSelector: app=demo1
   serviceName: app
 status:
-  creationTime: "2021-10-15T05:21:06Z"
-  expectedInjectiedNum: 3
-  lastUpdateTime: "2021-10-15T05:21:10Z"
-  realInjectedNum: 3
+  creationTime: "2022-08-16T12:18:53Z"
+  expectedInjectiedNum: 1
+  lastUpdateTime: "2022-08-16T12:19:18Z"
+  realInjectedNum: 1
+
 ```
\ No newline at end of file
diff --git a/docs/java-agent-injector.md b/docs/java-agent-injector.md
index 1d368e1..86ea9f3 100644
--- a/docs/java-agent-injector.md
+++ b/docs/java-agent-injector.md
@@ -44,7 +44,7 @@ inject-demo   1/1     Running   0          2d2h
 
 The java agent injector supports a precedence order to configure the agent:
 
-``` Annotations > Configmap > Default configmap```
+``` Annotations > SwAgent > Configmap (Deprecated) > Default Configmap (Deprecated)```
 
 ### Annotations
 
@@ -52,7 +52,13 @@ Annotations are described in [kubernetes annotations doc](https://kubernetes.io/
 
 We support annotations in [agent annotations](#Use-annotations-to-overlay-default-agent-configuration) and [sidecar annotations](#configure-sidecar).
 
-### Configmap
+### SwAgent
+
+SwAgent is a [Customer Resource](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) defined by SWCK.
+
+We support SwAgent in [SwAgent usage guide](#use-swagent-to-overlay-default-agent-configuration)
+
+### Configmap (Deprecated)
 
 Configmap is described in [kubernetes configmap doc](https://kubernetes.io/docs/concepts/configuration/configmap/).
 
@@ -60,7 +66,7 @@ We need to use configmap to set [agent.config](https://skywalking.apache.org/doc
 
 If there are different configmap in the namepsace, you can choose a configmap by setting [sidecar annotations](#configure-sidecar); If there is no configmap, the injector will create a default configmap. 
 
-### Default configmap
+### Default configmap (Deprecated)
 
 The injector will create the default configmap to overlay the `agent.config` in the agent container. 
 
@@ -111,6 +117,68 @@ volumes:
     name: java-agent-configmap-volume
 ```
 
+### Use SwAgent to overlay default agent configuration
+
+The injector will read the SwAgent CR when pods creating.
+
+SwAgent CRD basic structure is like:
+
+```yaml
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: SwAgent
+metadata:
+  name: swagent
+  namespace: skywalking-system
+spec:
+  containerMatcher: ''
+  selector:
+    app: demo
+  javaSidecar:
+    name: swagent
+    image: apache/skywalking-java-agent:8.8.0-java8
+    env:
+      - name: SW_LOGGING_LEVEL
+        value: "DEBUG"
+  sharedVolume:
+    name: "sky-agent"
+    mountPath: "/sky/agent"
+```
+
+There are three kind of configs in SwAgent CR.
+
+#### 1. label selector and container matcher
+
+label selector and container matcher decides which pod and container should be injected.
+
+| key path              | description                                                                                                                                                            | default value    |
+|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------|
+| spec.selector         | label selector for pods which should be effected during injection. if no label selector was set, SwAgent CR config will affect every pod during injection.             | no default value |
+| spec.containerMatcher | container matcher is used to decide which container to be inject during injection. regular expression is supported. default value '.*' would match any container name. | .*               |
+
+
+#### 2. injection configuration
+
+injection configuration will affect on agent injection behaviour
+
+| key path               | description                                                                                                       | default value                            |
+|------------------------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------|
+| javaSidecar            | javaSidecar is the configs for init container, which holds agent sdk and take agent sdk to the target containers. |                                          |
+| javaSidecar.name       | the name of the init container.                                                                                   | inject-skywalking-agent                  |
+| javaSidecar.image      | the image of the init container.                                                                                  | apache/skywalking-java-agent:8.8.0-java8 |
+| sharedVolume           | shareVolume is the configs for shared volume between init container and target container.                         |                                          |
+| sharedVolume.name      | the name of the shared volume.                                                                                    | sky-agent                                |
+| sharedVolume.mountPath | the mount path of the shared volume.                                                                              | /sky/agent                               |
+
+
+#### 3. skywalking agent configuration
+
+skywalking agent configuration is for agent SDK.
+
+| key path          | description                                                                                                                                                                                                                             | default value     |
+|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|
+| javaSidecar.env   | the env list to be appended to target containers. usually we can use it to setup [agent configuration](https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/configurations/) at container level. | no default value. |
+
+
 ### Use annotations to overlay default agent configuration
 
 The injector can recognize five kinds of annotations to configure the agent as below.
@@ -122,7 +190,6 @@ The strategy configuration is the annotation as below.
 | Annotation key                                    | Description                                                  | Annotation Default value |
 | ------------------------------------------------- | ------------------------------------------------------------ | ------------------------ |
 | `strategy.skywalking.apache.org/inject.Container` | Select the injected container, if not set, inject all containers. | not set                  |
-| `strategy.skywalking.apache.org/agent.Overlay`    | Whether to overlay the agent configuration. If set true, then you can see the next details to configure the agent. If set false, then you can skip [Configure agent](#configure-agent). | `false`                  |
 
 #### 2. agent configuration
 
diff --git a/golangci.yml b/golangci.yml
index 619f3a2..b6d89b1 100644
--- a/golangci.yml
+++ b/golangci.yml
@@ -18,10 +18,9 @@ linters:
     - deadcode
     - errcheck
     - goconst
-    - golint
+    - revive
     - ineffassign
     - lll
-    - maligned
     - misspell
     - structcheck
     - unconvert
diff --git a/hack/build/module.mk b/hack/build/module.mk
index 7cf3898..a844375 100644
--- a/hack/build/module.mk
+++ b/hack/build/module.mk
@@ -74,7 +74,7 @@ goimports: ## Download goimports locally if necessary.
 GOLANGCILINT= $(tool_bin)/golangci-lint
 .PHONY: golangci-lint
 golangci-lint: ## Download golangci-lint locally if necessary.
-	$(call go-install-tool,$(GOLANGCILINT),github.com/golangci/golangci-lint/cmd/golangci-lint@v1.43.0)
+	$(call go-install-tool,$(GOLANGCILINT),github.com/golangci/golangci-lint/cmd/golangci-lint@v1.46.2)
 	
 
 .PHONY: dependency-check
diff --git a/operator/PROJECT b/operator/PROJECT
index d8e71ea..12e05a3 100644
--- a/operator/PROJECT
+++ b/operator/PROJECT
@@ -83,6 +83,19 @@ resources:
     defaulting: true
     validation: true
     webhookVersion: v1
+- api:
+    crdVersion: v1
+    namespaced: true
+  controller: true
+  domain: skywalking.apache.org
+  group: operator
+  kind: SwAgent
+  path: github.com/apache/skywalking-swck/operator/apis/operator/v1alpha1
+  version: v1alpha1
+  webhooks:
+    defaulting: true
+    validation: true
+    webhookVersion: v1
 - api:
     crdVersion: v1
     namespaced: true
diff --git a/operator/apis/operator/v1alpha1/javaagent_webhook.go b/operator/apis/operator/v1alpha1/javaagent_webhook.go
index 2d80268..f5de779 100644
--- a/operator/apis/operator/v1alpha1/javaagent_webhook.go
+++ b/operator/apis/operator/v1alpha1/javaagent_webhook.go
@@ -24,13 +24,17 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	logf "sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/controller-runtime/pkg/webhook"
-
-	"github.com/apache/skywalking-swck/operator/pkg/operator/injector"
 )
 
 // log is for logging in this package.
 var javaagentlog = logf.Log.WithName("javaagent-resource")
 
+const (
+	// the ServiceName and BackendService are important information that need to be printed
+	ServiceName    = "agent.service_name"
+	BackendService = "collector.backend_service"
+)
+
 func (r *JavaAgent) SetupWebhookWithManager(mgr ctrl.Manager) error {
 	return ctrl.NewWebhookManagedBy(mgr).
 		For(r).
@@ -51,8 +55,8 @@ func (r *JavaAgent) Default() {
 		return
 	}
 
-	service := injector.GetServiceName(&config)
-	backend := injector.GetBackendService(&config)
+	service := GetServiceName(&config)
+	backend := GetBackendService(&config)
 
 	if r.Spec.ServiceName == "" && service != "" {
 		r.Spec.ServiceName = service
@@ -94,3 +98,19 @@ func (r *JavaAgent) validate() error {
 	}
 	return nil
 }
+
+func GetServiceName(configuration *map[string]string) string {
+	v, ok := (*configuration)[ServiceName]
+	if !ok {
+		return "Your_ApplicationName"
+	}
+	return v
+}
+
+func GetBackendService(configuration *map[string]string) string {
+	v, ok := (*configuration)[BackendService]
+	if !ok {
+		return "127.0.0.1:11800"
+	}
+	return v
+}
diff --git a/operator/apis/operator/v1alpha1/swagent_types.go b/operator/apis/operator/v1alpha1/swagent_types.go
new file mode 100644
index 0000000..f2e24cc
--- /dev/null
+++ b/operator/apis/operator/v1alpha1/swagent_types.go
@@ -0,0 +1,127 @@
+// 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 v1alpha1
+
+import (
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
+// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.
+
+// SwAgentSpec defines the desired state of SwAgent
+type SwAgentSpec struct {
+	// Selector is the selector label of injected Object
+	// +kubebuilder:validation:Optional
+	Selector map[string]string `json:"selector,omitempty"`
+
+	// ContainerMatcher is the regular expression to match pods which is to be injected.
+	// +kubebuilder:validation:Optional
+	ContainerMatcher string `json:"containerMatcher,omitempty"`
+
+	// Java defines Java agent special configs.
+	// +kubebuilder:validation:Optional
+	JavaSidecar JavaSidecar `json:"javaSidecar,omitempty"`
+
+	// SharedVolume is the name of an empty volume which shared by initContainer and target containers.
+	SharedVolumeName string `json:"sharedVolumeName,omitempty"`
+
+	// SwConfigMapVolume defines the configmap which contains agent.config
+	SwConfigMapVolume *SwConfigMap `json:"swConfigMapVolume,omitempty"`
+
+	// Select the optional plugin which needs to be moved to the directory(/plugins). Such as`trace`,`webflux`,`cloud-gateway-2.1.x`.
+	OptionalPlugins []string `json:"optionalPlugins,omitempty"`
+
+	// Select the optional reporter plugin which needs to be moved to the directory(/plugins). such as `kafka`.
+	OptionalReporterPlugins []string `json:"optionalReporterPlugins,omitempty"`
+}
+
+// Java defines Java agent special configs.
+type JavaSidecar struct {
+	// Name is the name for initContainer.
+	// +optional
+	Name string `json:"name,omitempty" default:"inject-skywalking-agent"`
+
+	// Image is the image for initContainer, which commonly contains SkyWalking java agent SDK.
+	// +optional
+	Image string `json:"image,omitempty" default:"apache/skywalking-java-agent:8.8.0-java8"`
+
+	// Command is the command for initContainer.
+	// +optional
+	Command []string `json:"command,omitempty" default:"mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent"`
+
+	// Args is the args for initContainer.
+	Args []string `json:"args,omitempty"`
+
+	// Resources is the resources for initContainer pod resources
+	Resources corev1.ResourceRequirements `json:"resources,omitempty"`
+
+	// Env defines java specific env vars.
+	// +optional
+	Env []corev1.EnvVar `json:"env,omitempty"`
+}
+
+// SwAgentStatus defines the observed state of SwAgent
+type SwAgentStatus struct {
+	// The time the SwAgent was created.
+	CreationTime metav1.Time `json:"creationTime,omitempty"`
+	// The last time this condition was updated.
+	LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"`
+}
+
+type SharedVolume struct {
+	// The name of shared volume
+	Name string `json:"name,omitempty" default:"sky-agent"`
+	// The mountPath of shared volume
+	MountPath string `json:"mountPath,omitempty" default:"/sky/agent"`
+}
+
+type SwConfigMap struct {
+	// The name pf configmap used in the injected container as agent.config
+	Name string `json:"name,omitempty" default:"java-agent-configmap-volume"`
+	// The name of configmap volume.
+	ConfigMapName string `json:"configMapName,omitempty" default:"skywalking-swck-java-agent-configmap"`
+	// Mount path of the configmap in the injected container
+	ConfigMapMountFile string `json:"configMapMountFile,omitempty" default:"agent.config"`
+}
+
+//+kubebuilder:object:root=true
+//+kubebuilder:subresource:status
+
+// SwAgent is the Schema for the swagents API
+type SwAgent struct {
+	metav1.TypeMeta   `json:",inline"`
+	metav1.ObjectMeta `json:"metadata,omitempty"`
+
+	Spec   SwAgentSpec   `json:"spec,omitempty"`
+	Status SwAgentStatus `json:"status,omitempty"`
+}
+
+//+kubebuilder:object:root=true
+
+// SwAgentList contains a list of SwAgent
+type SwAgentList struct {
+	metav1.TypeMeta `json:",inline"`
+	metav1.ListMeta `json:"metadata,omitempty"`
+	Items           []SwAgent `json:"items"`
+}
+
+func init() {
+	SchemeBuilder.Register(&SwAgent{}, &SwAgentList{})
+}
diff --git a/operator/apis/operator/v1alpha1/swagent_webhook.go b/operator/apis/operator/v1alpha1/swagent_webhook.go
new file mode 100644
index 0000000..aedb4fc
--- /dev/null
+++ b/operator/apis/operator/v1alpha1/swagent_webhook.go
@@ -0,0 +1,138 @@
+// 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 v1alpha1
+
+import (
+	"strings"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	ctrl "sigs.k8s.io/controller-runtime"
+	logf "sigs.k8s.io/controller-runtime/pkg/log"
+	"sigs.k8s.io/controller-runtime/pkg/webhook"
+)
+
+// log is for logging in this package.
+var swagentlog = logf.Log.WithName("swagent-resource")
+
+func (r *SwAgent) SetupWebhookWithManager(mgr ctrl.Manager) error {
+	return ctrl.NewWebhookManagedBy(mgr).
+		For(r).
+		Complete()
+}
+
+// nolint: lll
+//+kubebuilder:webhook:path=/mutate-operator-skywalking-apache-org-v1alpha1-swagent,mutating=true,failurePolicy=fail,sideEffects=None,groups=operator.skywalking.apache.org,resources=swagents,verbs=create;update,versions=v1alpha1,name=mswagent.kb.io,admissionReviewVersions=v1
+
+var _ webhook.Defaulter = &SwAgent{}
+
+// Default implements webhook.Defaulter so a webhook will be registered for the type
+func (r *SwAgent) Default() {
+	swagentlog.Info("default", "name", r.Name)
+	r.setDefault()
+}
+
+// nolint: lll
+//+kubebuilder:webhook:path=/validate-operator-skywalking-apache-org-v1alpha1-swagent,mutating=false,failurePolicy=fail,sideEffects=None,groups=operator.skywalking.apache.org,resources=swagents,verbs=create;update,versions=v1alpha1,name=vswagent.kb.io,admissionReviewVersions=v1
+
+var _ webhook.Validator = &SwAgent{}
+
+// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
+func (r *SwAgent) ValidateCreate() error {
+	swagentlog.Info("validate create", "name", r.Name)
+	r.setDefault()
+	return nil
+}
+
+// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
+func (r *SwAgent) ValidateUpdate(old runtime.Object) error {
+	swagentlog.Info("validate update", "name", r.Name)
+	return nil
+}
+
+// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
+func (r *SwAgent) ValidateDelete() error {
+	swagentlog.Info("validate delete", "name", r.Name)
+	return nil
+}
+
+const (
+	LabelJavaAgent = "swck-java-agent-injected"
+)
+
+func (r *SwAgent) setDefault() {
+	if nil != r {
+		if len(r.Spec.Selector) == 0 {
+			if r.Spec.Selector == nil {
+				r.Spec.Selector = make(map[string]string)
+			}
+			r.Spec.Selector[LabelJavaAgent] = "true"
+		}
+		if len(r.Spec.ContainerMatcher) == 0 {
+			r.Spec.ContainerMatcher = ".*"
+		}
+
+		// default values for java sidecar
+		if len(r.Spec.JavaSidecar.Name) == 0 {
+			r.Spec.JavaSidecar.Name = "inject-skywalking-agent"
+		}
+		if len(r.Spec.JavaSidecar.Image) == 0 {
+			r.Spec.JavaSidecar.Image = "apache/skywalking-java-agent:8.8.0-java8"
+		}
+		if len(r.Spec.JavaSidecar.Command) == 0 {
+			if r.Spec.JavaSidecar.Command == nil {
+				r.Spec.JavaSidecar.Command = []string{}
+			}
+			r.Spec.JavaSidecar.Command = append(r.Spec.JavaSidecar.Command, "sh")
+		}
+		if len(r.Spec.JavaSidecar.Args) == 0 {
+			if r.Spec.JavaSidecar.Args == nil {
+				r.Spec.JavaSidecar.Args = []string{}
+			}
+			r.Spec.JavaSidecar.Args = append(r.Spec.JavaSidecar.Args, "-c")
+			r.Spec.JavaSidecar.Args = append(r.Spec.JavaSidecar.Args, "mkdir -p /sky/agent && cp -r /skywalking/agent/* /sky/agent")
+		}
+		r.setOrAddEnv("JAVA_TOOL_OPTIONS", " -javaagent:/sky/agent/skywalking-agent.jar")
+
+		// default values for shared volume
+		if len(r.Spec.SharedVolumeName) == 0 {
+			r.Spec.SharedVolumeName = "sky-agent"
+		}
+
+	}
+}
+
+func (r *SwAgent) setOrAddEnv(envKey string, envValue string) {
+	if !r.setEnvIfExists(&r.Spec.JavaSidecar.Env, envKey, envValue) {
+		javaToolOptionsEnv := corev1.EnvVar{
+			Name:  envKey,
+			Value: envValue,
+		}
+		r.Spec.JavaSidecar.Env = append(r.Spec.JavaSidecar.Env, javaToolOptionsEnv)
+	}
+}
+
+func (r *SwAgent) setEnvIfExists(envs *[]corev1.EnvVar, envKey string, envValue string) bool {
+	for _, env := range *envs {
+		if strings.EqualFold(env.Name, envKey) {
+			env.Value = envValue
+			return true
+		}
+	}
+	return false
+}
diff --git a/operator/apis/operator/v1alpha1/zz_generated.deepcopy.go b/operator/apis/operator/v1alpha1/zz_generated.deepcopy.go
index 5dd8aa5..0a32237 100644
--- a/operator/apis/operator/v1alpha1/zz_generated.deepcopy.go
+++ b/operator/apis/operator/v1alpha1/zz_generated.deepcopy.go
@@ -309,6 +309,39 @@ func (in *JavaAgentStatus) DeepCopy() *JavaAgentStatus {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *JavaSidecar) DeepCopyInto(out *JavaSidecar) {
+	*out = *in
+	if in.Command != nil {
+		in, out := &in.Command, &out.Command
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Args != nil {
+		in, out := &in.Args, &out.Args
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	in.Resources.DeepCopyInto(&out.Resources)
+	if in.Env != nil {
+		in, out := &in.Env, &out.Env
+		*out = make([]corev1.EnvVar, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JavaSidecar.
+func (in *JavaSidecar) DeepCopy() *JavaSidecar {
+	if in == nil {
+		return nil
+	}
+	out := new(JavaSidecar)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *OAPServer) DeepCopyInto(out *OAPServer) {
 	*out = *in
@@ -806,6 +839,21 @@ func (in *ServiceTemplate) DeepCopy() *ServiceTemplate {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SharedVolume) DeepCopyInto(out *SharedVolume) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SharedVolume.
+func (in *SharedVolume) DeepCopy() *SharedVolume {
+	if in == nil {
+		return nil
+	}
+	out := new(SharedVolume)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Storage) DeepCopyInto(out *Storage) {
 	*out = *in
@@ -911,6 +959,135 @@ func (in *StorageStatus) DeepCopy() *StorageStatus {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SwAgent) DeepCopyInto(out *SwAgent) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SwAgent.
+func (in *SwAgent) DeepCopy() *SwAgent {
+	if in == nil {
+		return nil
+	}
+	out := new(SwAgent)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *SwAgent) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SwAgentList) DeepCopyInto(out *SwAgentList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ListMeta.DeepCopyInto(&out.ListMeta)
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]SwAgent, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SwAgentList.
+func (in *SwAgentList) DeepCopy() *SwAgentList {
+	if in == nil {
+		return nil
+	}
+	out := new(SwAgentList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *SwAgentList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SwAgentSpec) DeepCopyInto(out *SwAgentSpec) {
+	*out = *in
+	if in.Selector != nil {
+		in, out := &in.Selector, &out.Selector
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	in.JavaSidecar.DeepCopyInto(&out.JavaSidecar)
+	if in.SwConfigMapVolume != nil {
+		in, out := &in.SwConfigMapVolume, &out.SwConfigMapVolume
+		*out = new(SwConfigMap)
+		**out = **in
+	}
+	if in.OptionalPlugins != nil {
+		in, out := &in.OptionalPlugins, &out.OptionalPlugins
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.OptionalReporterPlugins != nil {
+		in, out := &in.OptionalReporterPlugins, &out.OptionalReporterPlugins
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SwAgentSpec.
+func (in *SwAgentSpec) DeepCopy() *SwAgentSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(SwAgentSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SwAgentStatus) DeepCopyInto(out *SwAgentStatus) {
+	*out = *in
+	in.CreationTime.DeepCopyInto(&out.CreationTime)
+	in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime)
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SwAgentStatus.
+func (in *SwAgentStatus) DeepCopy() *SwAgentStatus {
+	if in == nil {
+		return nil
+	}
+	out := new(SwAgentStatus)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SwConfigMap) DeepCopyInto(out *SwConfigMap) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SwConfigMap.
+func (in *SwConfigMap) DeepCopy() *SwConfigMap {
+	if in == nil {
+		return nil
+	}
+	out := new(SwConfigMap)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *UI) DeepCopyInto(out *UI) {
 	*out = *in
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_oapserverconfigs.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_oapserverconfigs.yaml
index a16f87f..1d1211c 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_oapserverconfigs.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_oapserverconfigs.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_oapserverdynamicconfigs.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_oapserverdynamicconfigs.yaml
index ed3d4ae..ffbe467 100644
--- a/operator/config/crd/bases/operator.skywalking.apache.org_oapserverdynamicconfigs.yaml
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_oapserverdynamicconfigs.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_swagents.yaml b/operator/config/crd/bases/operator.skywalking.apache.org_swagents.yaml
new file mode 100644
index 0000000..0be60ff
--- /dev/null
+++ b/operator/config/crd/bases/operator.skywalking.apache.org_swagents.yaml
@@ -0,0 +1,276 @@
+# 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: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.7.0
+  creationTimestamp: null
+  name: swagents.operator.skywalking.apache.org
+spec:
+  group: operator.skywalking.apache.org
+  names:
+    kind: SwAgent
+    listKind: SwAgentList
+    plural: swagents
+    singular: swagent
+  scope: Namespaced
+  versions:
+  - name: v1alpha1
+    schema:
+      openAPIV3Schema:
+        description: SwAgent is the Schema for the swagents API
+        properties:
+          apiVersion:
+            description: 'APIVersion defines the versioned schema of this representation
+              of an object. Servers should convert recognized schemas to the latest
+              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+            type: string
+          kind:
+            description: 'Kind is a string value representing the REST resource this
+              object represents. Servers may infer this from the endpoint the client
+              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+            type: string
+          metadata:
+            type: object
+          spec:
+            description: SwAgentSpec defines the desired state of SwAgent
+            properties:
+              containerMatcher:
+                description: ContainerMatcher is the regular expression to match pods
+                  which is to be injected.
+                type: string
+              javaSidecar:
+                description: Java defines Java agent special configs.
+                properties:
+                  args:
+                    description: Args is the args for initContainer.
+                    items:
+                      type: string
+                    type: array
+                  command:
+                    description: Command is the command for initContainer.
+                    items:
+                      type: string
+                    type: array
+                  env:
+                    description: Env defines java specific env vars.
+                    items:
+                      description: EnvVar represents an environment variable present
+                        in a Container.
+                      properties:
+                        name:
+                          description: Name of the environment variable. Must be a
+                            C_IDENTIFIER.
+                          type: string
+                        value:
+                          description: 'Variable references $(VAR_NAME) are expanded
+                            using the previously defined environment variables in
+                            the container and any service environment variables. If
+                            a variable cannot be resolved, the reference in the input
+                            string will be unchanged. Double $$ are reduced to a single
+                            $, which allows for escaping the $(VAR_NAME) syntax: i.e.
+                            "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)".
+                            Escaped references will never be expanded, regardless
+                            of whether the variable exists or not. Defaults to "".'
+                          type: string
+                        valueFrom:
+                          description: Source for the environment variable's value.
+                            Cannot be used if value is not empty.
+                          properties:
+                            configMapKeyRef:
+                              description: Selects a key of a ConfigMap.
+                              properties:
+                                key:
+                                  description: The key to select.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the ConfigMap or its
+                                    key must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                            fieldRef:
+                              description: 'Selects a field of the pod: supports metadata.name,
+                                metadata.namespace, `metadata.labels[''<KEY>'']`,
+                                `metadata.annotations[''<KEY>'']`, spec.nodeName,
+                                spec.serviceAccountName, status.hostIP, status.podIP,
+                                status.podIPs.'
+                              properties:
+                                apiVersion:
+                                  description: Version of the schema the FieldPath
+                                    is written in terms of, defaults to "v1".
+                                  type: string
+                                fieldPath:
+                                  description: Path of the field to select in the
+                                    specified API version.
+                                  type: string
+                              required:
+                              - fieldPath
+                              type: object
+                            resourceFieldRef:
+                              description: 'Selects a resource of the container: only
+                                resources limits and requests (limits.cpu, limits.memory,
+                                limits.ephemeral-storage, requests.cpu, requests.memory
+                                and requests.ephemeral-storage) are currently supported.'
+                              properties:
+                                containerName:
+                                  description: 'Container name: required for volumes,
+                                    optional for env vars'
+                                  type: string
+                                divisor:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  description: Specifies the output format of the
+                                    exposed resources, defaults to "1"
+                                  pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                  x-kubernetes-int-or-string: true
+                                resource:
+                                  description: 'Required: resource to select'
+                                  type: string
+                              required:
+                              - resource
+                              type: object
+                            secretKeyRef:
+                              description: Selects a key of a secret in the pod's
+                                namespace
+                              properties:
+                                key:
+                                  description: The key of the secret to select from.  Must
+                                    be a valid secret key.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the Secret or its key
+                                    must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                          type: object
+                      required:
+                      - name
+                      type: object
+                    type: array
+                  image:
+                    description: Image is the image for initContainer, which commonly
+                      contains SkyWalking java agent SDK.
+                    type: string
+                  name:
+                    description: Name is the name for initContainer.
+                    type: string
+                  resources:
+                    description: Resources is the resources for initContainer pod
+                      resources
+                    properties:
+                      limits:
+                        additionalProperties:
+                          anyOf:
+                          - type: integer
+                          - type: string
+                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                          x-kubernetes-int-or-string: true
+                        description: 'Limits describes the maximum amount of compute
+                          resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+                        type: object
+                      requests:
+                        additionalProperties:
+                          anyOf:
+                          - type: integer
+                          - type: string
+                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                          x-kubernetes-int-or-string: true
+                        description: 'Requests describes the minimum amount of compute
+                          resources required. If Requests is omitted for a container,
+                          it defaults to Limits if that is explicitly specified, otherwise
+                          to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+                        type: object
+                    type: object
+                type: object
+              optionalPlugins:
+                description: Select the optional plugin which needs to be moved to
+                  the directory(/plugins). Such as`trace`,`webflux`,`cloud-gateway-2.1.x`.
+                items:
+                  type: string
+                type: array
+              optionalReporterPlugins:
+                description: Select the optional reporter plugin which needs to be
+                  moved to the directory(/plugins). such as `kafka`.
+                items:
+                  type: string
+                type: array
+              selector:
+                additionalProperties:
+                  type: string
+                description: Selector is the selector label of injected Object
+                type: object
+              sharedVolumeName:
+                description: SharedVolume is the name of an empty volume which shared
+                  by initContainer and target containers.
+                type: string
+              swConfigMapVolume:
+                description: SwConfigMapVolume defines the configmap which contains
+                  agent.config
+                properties:
+                  configMapMountFile:
+                    description: Mount path of the configmap in the injected container
+                    type: string
+                  configMapName:
+                    description: The name of configmap volume.
+                    type: string
+                  name:
+                    description: The name pf configmap used in the injected container
+                      as agent.config
+                    type: string
+                type: object
+            type: object
+          status:
+            description: SwAgentStatus defines the observed state of SwAgent
+            properties:
+              creationTime:
+                description: The time the SwAgent was created.
+                format: date-time
+                type: string
+              lastUpdateTime:
+                description: The last time this condition was updated.
+                format: date-time
+                type: string
+            type: object
+        type: object
+    served: true
+    storage: true
+    subresources:
+      status: {}
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
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/crd/kustomization.yaml b/operator/config/crd/kustomization.yaml
index aac1aa2..578d342 100644
--- a/operator/config/crd/kustomization.yaml
+++ b/operator/config/crd/kustomization.yaml
@@ -25,6 +25,7 @@ resources:
 - bases/operator.skywalking.apache.org_storages.yaml
 - bases/operator.skywalking.apache.org_javaagents.yaml
 - bases/operator.skywalking.apache.org_satellites.yaml
+- bases/operator.skywalking.apache.org_swagents.yaml
 - bases/operator.skywalking.apache.org_oapserverconfigs.yaml
 - bases/operator.skywalking.apache.org_oapserverdynamicconfigs.yaml
 #+kubebuilder:scaffold:crdkustomizeresource
@@ -40,6 +41,7 @@ patchesStrategicMerge:
 - patches/webhook_in_satellites.yaml
 - patches/webhook_in_oapserverconfigs.yaml
 #- patches/webhook_in_oapserverdynamicconfigs.yaml
+#- patches/webhook_in_swagents.yaml
 #+kubebuilder:scaffold:crdkustomizewebhookpatch
 
 # [CERTMANAGER] To enable cert-manager, uncomment all the sections with [CERTMANAGER] prefix.
@@ -52,6 +54,7 @@ patchesStrategicMerge:
 - patches/cainjection_in_satellites.yaml
 - patches/cainjection_in_oapserverconfigs.yaml
 #- patches/cainjection_in_oapserverdynamicconfigs.yaml
+#- patches/cainjection_in_swagents.yaml
 #+kubebuilder:scaffold:crdkustomizecainjectionpatch
 
 # the following config is for teaching kustomize how to do kustomization for CRDs.
diff --git a/operator/config/crd/patches/cainjection_in_swagents.yaml b/operator/config/crd/patches/cainjection_in_swagents.yaml
new file mode 100644
index 0000000..9ffe494
--- /dev/null
+++ b/operator/config/crd/patches/cainjection_in_swagents.yaml
@@ -0,0 +1,24 @@
+# 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.
+
+# The following patch adds a directive for certmanager to inject CA into the CRD
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME)
+  name: swagents.operator.skywalking.apache.org
diff --git a/operator/config/crd/patches/webhook_in_swagents.yaml b/operator/config/crd/patches/webhook_in_swagents.yaml
new file mode 100644
index 0000000..757ffc6
--- /dev/null
+++ b/operator/config/crd/patches/webhook_in_swagents.yaml
@@ -0,0 +1,33 @@
+# 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.
+
+# The following patch enables a conversion webhook for the CRD
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+  name: swagents.operator.skywalking.apache.org
+spec:
+  conversion:
+    strategy: Webhook
+    webhook:
+      clientConfig:
+        service:
+          namespace: system
+          name: webhook-service
+          path: /convert
+      conversionReviewVersions:
+      - v1
diff --git a/operator/config/manager/manager.yaml b/operator/config/manager/manager.yaml
index 9a035c4..8cd96a9 100644
--- a/operator/config/manager/manager.yaml
+++ b/operator/config/manager/manager.yaml
@@ -70,9 +70,9 @@ spec:
         resources:
           limits:
             cpu: 500m
-            memory: 128Mi
+            memory: 256Mi
           requests:
             cpu: 10m
-            memory: 64Mi
+            memory: 128Mi
       serviceAccountName: controller-manager
       terminationGracePeriodSeconds: 10
diff --git a/operator/config/rbac/role.yaml b/operator/config/rbac/role.yaml
index 04986d3..7b6d617 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
@@ -294,6 +294,32 @@ rules:
   - get
   - patch
   - update
+- apiGroups:
+  - operator.skywalking.apache.org
+  resources:
+  - swagents
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - operator.skywalking.apache.org
+  resources:
+  - swagents/finalizers
+  verbs:
+  - update
+- apiGroups:
+  - operator.skywalking.apache.org
+  resources:
+  - swagents/status
+  verbs:
+  - get
+  - patch
+  - update
 - apiGroups:
   - operator.skywalking.apache.org
   resources:
diff --git a/operator/config/rbac/swagent_editor_role.yaml b/operator/config/rbac/swagent_editor_role.yaml
new file mode 100644
index 0000000..941ffb0
--- /dev/null
+++ b/operator/config/rbac/swagent_editor_role.yaml
@@ -0,0 +1,41 @@
+# 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.
+
+# permissions for end users to edit swagents.
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: swagent-editor-role
+rules:
+- apiGroups:
+  - operator.skywalking.apache.org
+  resources:
+  - swagents
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - operator.skywalking.apache.org
+  resources:
+  - swagents/status
+  verbs:
+  - get
diff --git a/operator/config/rbac/swagent_viewer_role.yaml b/operator/config/rbac/swagent_viewer_role.yaml
new file mode 100644
index 0000000..ded01ac
--- /dev/null
+++ b/operator/config/rbac/swagent_viewer_role.yaml
@@ -0,0 +1,37 @@
+# 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.
+
+# permissions for end users to view swagents.
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: swagent-viewer-role
+rules:
+- apiGroups:
+  - operator.skywalking.apache.org
+  resources:
+  - swagents
+  verbs:
+  - get
+  - list
+  - watch
+- apiGroups:
+  - operator.skywalking.apache.org
+  resources:
+  - swagents/status
+  verbs:
+  - get
diff --git a/operator/config/samples/operator_v1alpha1_swagent.yaml b/operator/config/samples/operator_v1alpha1_swagent.yaml
new file mode 100644
index 0000000..c59dfe2
--- /dev/null
+++ b/operator/config/samples/operator_v1alpha1_swagent.yaml
@@ -0,0 +1,23 @@
+# 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: operator.skywalking.apache.org/v1alpha1
+kind: SwAgent
+metadata:
+  name: swagent-sample
+spec:
+  # TODO(user): Add fields here
diff --git a/operator/config/webhook/manifests.yaml b/operator/config/webhook/manifests.yaml
index 945d86d..f69f2fa 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
@@ -22,26 +22,6 @@ metadata:
   creationTimestamp: null
   name: mutating-webhook-configuration
 webhooks:
-- admissionReviewVersions:
-  - v1
-  clientConfig:
-    service:
-      name: webhook-service
-      namespace: system
-      path: /mutate-v1-pod
-  failurePolicy: Fail
-  name: mpod.kb.io
-  rules:
-  - apiGroups:
-    - ""
-    apiVersions:
-    - v1
-    operations:
-    - CREATE
-    - UPDATE
-    resources:
-    - pods
-  sideEffects: None
 - admissionReviewVersions:
   - v1
   clientConfig:
@@ -182,6 +162,26 @@ webhooks:
     resources:
     - storages
   sideEffects: None
+- admissionReviewVersions:
+  - v1
+  clientConfig:
+    service:
+      name: webhook-service
+      namespace: system
+      path: /mutate-operator-skywalking-apache-org-v1alpha1-swagent
+  failurePolicy: Fail
+  name: mswagent.kb.io
+  rules:
+  - apiGroups:
+    - operator.skywalking.apache.org
+    apiVersions:
+    - v1alpha1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - swagents
+  sideEffects: None
 - admissionReviewVersions:
   - v1
   clientConfig:
@@ -202,6 +202,26 @@ webhooks:
     resources:
     - uis
   sideEffects: None
+- admissionReviewVersions:
+  - v1
+  clientConfig:
+    service:
+      name: webhook-service
+      namespace: system
+      path: /mutate-v1-pod
+  failurePolicy: Fail
+  name: mpod.kb.io
+  rules:
+  - apiGroups:
+    - ""
+    apiVersions:
+    - v1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - pods
+  sideEffects: None
 
 ---
 apiVersion: admissionregistration.k8s.io/v1
@@ -350,6 +370,26 @@ webhooks:
     resources:
     - storages
   sideEffects: None
+- admissionReviewVersions:
+  - v1
+  clientConfig:
+    service:
+      name: webhook-service
+      namespace: system
+      path: /validate-operator-skywalking-apache-org-v1alpha1-swagent
+  failurePolicy: Fail
+  name: vswagent.kb.io
+  rules:
+  - apiGroups:
+    - operator.skywalking.apache.org
+    apiVersions:
+    - v1alpha1
+    operations:
+    - CREATE
+    - UPDATE
+    resources:
+    - swagents
+  sideEffects: None
 - admissionReviewVersions:
   - v1
   clientConfig:
diff --git a/operator/controllers/operator/configmap_controller.go b/operator/controllers/operator/configmap_controller.go
index b6721d7..3c3efe0 100644
--- a/operator/controllers/operator/configmap_controller.go
+++ b/operator/controllers/operator/configmap_controller.go
@@ -45,7 +45,7 @@ type ConfigMapReconciler struct {
 
 func (r *ConfigMapReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================configmap reconcile started================================")
 
 	configmap := &core.ConfigMap{}
 	err := r.Client.Get(ctx, client.ObjectKey{Namespace: injector.DefaultConfigmapNamespace, Name: injector.DefaultConfigmapName}, configmap)
diff --git a/operator/controllers/operator/fetcher_controller.go b/operator/controllers/operator/fetcher_controller.go
index 3be7718..3b00e8d 100644
--- a/operator/controllers/operator/fetcher_controller.go
+++ b/operator/controllers/operator/fetcher_controller.go
@@ -50,7 +50,7 @@ type FetcherReconciler struct {
 
 func (r *FetcherReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================fetcher reconcile started================================")
 
 	fetcher := &operatorv1alpha1.Fetcher{}
 	if err := r.Client.Get(ctx, req.NamespacedName, fetcher); err != nil {
diff --git a/operator/controllers/operator/javaagent_controller.go b/operator/controllers/operator/javaagent_controller.go
index ebb8f16..5f6705d 100644
--- a/operator/controllers/operator/javaagent_controller.go
+++ b/operator/controllers/operator/javaagent_controller.go
@@ -55,7 +55,7 @@ type JavaAgentReconciler struct {
 
 func (r *JavaAgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================javaagent reconcile started================================")
 
 	pod := &core.Pod{}
 	err := r.Client.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: req.Name}, pod)
@@ -80,14 +80,14 @@ func (r *JavaAgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 	ownerReference := pod.OwnerReferences[0]
 
 	// get configmap from the volume of configmap
-	if configmapName == "" {
-		log.Error(err, "configmap is nil")
-		return ctrl.Result{}, err
-	}
-	err = r.Client.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: configmapName}, configmap)
-	if err != nil && !apierrors.IsNotFound(err) {
-		log.Error(err, "failed to get configmap")
-		return ctrl.Result{}, err
+	if len(configmapName) > 0 {
+		err = r.Client.Get(ctx, client.ObjectKey{Namespace: req.Namespace, Name: configmapName}, configmap)
+		if err != nil && !apierrors.IsNotFound(err) {
+			log.Error(err, "failed to get configmap")
+			return ctrl.Result{}, err
+		}
+	} else {
+		log.Info("No configmap mounted.")
 	}
 
 	// get configuration from configmap
@@ -98,6 +98,14 @@ func (r *JavaAgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 	}
 	injector.GetInjectedAgentConfig(&pod.Annotations, &config)
 
+	swAgentList := &operatorv1alpha1.SwAgentList{}
+	var lastMatchedSwAgent *operatorv1alpha1.SwAgent
+	if lastMatchedSwAgent, err = r.getSwAgent(ctx, req, swAgentList, pod); err != nil {
+		log.Error(err, "get SwAgent error")
+		return ctrl.Result{}, err
+	}
+	r.injectConfigBySwAgent(lastMatchedSwAgent, config)
+
 	// only get the first selector label from labels as podselector
 	labels := pod.Labels
 	keys := []string{}
@@ -136,10 +144,10 @@ func (r *JavaAgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 				return podselector
 			},
 			"ServiceName": func() string {
-				return injector.GetServiceName(&config)
+				return operatorv1alpha1.GetServiceName(&config)
 			},
 			"BackendService": func() string {
-				return injector.GetBackendService(&config)
+				return operatorv1alpha1.GetBackendService(&config)
 			},
 		},
 	}
@@ -159,6 +167,42 @@ func (r *JavaAgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 	return ctrl.Result{}, nil
 }
 
+func (r *JavaAgentReconciler) injectConfigBySwAgent(lastMatchedSwAgent *operatorv1alpha1.SwAgent, config map[string]string) {
+	if nil != lastMatchedSwAgent && len(lastMatchedSwAgent.Spec.JavaSidecar.Env) > 0 {
+		for _, env := range lastMatchedSwAgent.Spec.JavaSidecar.Env {
+			if strings.EqualFold(env.Name, "SW_AGENT_COLLECTOR_BACKEND_SERVICES") {
+				config[operatorv1alpha1.BackendService] = env.Value
+			} else if strings.EqualFold(env.Name, "SW_AGENT_NAME") {
+				config[operatorv1alpha1.ServiceName] = env.Value
+			}
+		}
+	}
+}
+
+func (r *JavaAgentReconciler) getSwAgent(ctx context.Context, req ctrl.Request,
+	swAgentList *operatorv1alpha1.SwAgentList, pod *core.Pod) (*operatorv1alpha1.SwAgent, error) {
+	if err := r.Client.List(ctx, swAgentList, client.InNamespace(req.Namespace)); err != nil {
+		return nil, err
+	}
+
+	// selector
+	var lastMatchedSwAgent *operatorv1alpha1.SwAgent
+	for _, swAgent := range swAgentList.Items {
+		isMatch := true
+		if len(swAgent.Spec.Selector) != 0 {
+			for k, v := range swAgent.Spec.Selector {
+				if !strings.EqualFold(v, pod.Labels[k]) {
+					isMatch = false
+				}
+			}
+		}
+		if isMatch {
+			lastMatchedSwAgent = &swAgent
+		}
+	}
+	return lastMatchedSwAgent, nil
+}
+
 func (r *JavaAgentReconciler) UpdateStatus(ctx context.Context, log logr.Logger, namespace, selectorname, podselector string) error {
 	errCol := new(kubernetes.ErrorCollector)
 
@@ -183,7 +227,7 @@ func (r *JavaAgentReconciler) UpdateStatus(ctx context.Context, log logr.Logger,
 		client.MatchingLabels{label[0]: label[1]},
 	}
 
-	if err := r.List(ctx, podList, opts...); err != nil && !apierrors.IsNotFound(err) {
+	if err := r.Client.List(ctx, podList, opts...); err != nil && !apierrors.IsNotFound(err) {
 		errCol.Collect(fmt.Errorf("failed to list pod: %w", err))
 	}
 
diff --git a/operator/controllers/operator/oapserver_controller.go b/operator/controllers/operator/oapserver_controller.go
index dbe1112..02fb940 100644
--- a/operator/controllers/operator/oapserver_controller.go
+++ b/operator/controllers/operator/oapserver_controller.go
@@ -62,7 +62,7 @@ type OAPServerReconciler struct {
 
 func (r *OAPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================oapserver reconcile started================================")
 
 	oapServer := operatorv1alpha1.OAPServer{}
 	if err := r.Client.Get(ctx, req.NamespacedName, &oapServer); err != nil {
diff --git a/operator/controllers/operator/oapserverconfig_controller.go b/operator/controllers/operator/oapserverconfig_controller.go
index 350b288..8984e07 100644
--- a/operator/controllers/operator/oapserverconfig_controller.go
+++ b/operator/controllers/operator/oapserverconfig_controller.go
@@ -77,7 +77,7 @@ func (a SortByEnvName) Less(i, j int) bool {
 
 func (r *OAPServerConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================oapserverconfig reconcile started================================")
 
 	oapServerConfig := operatorv1alpha1.OAPServerConfig{}
 	if err := r.Client.Get(ctx, req.NamespacedName, &oapServerConfig); err != nil {
diff --git a/operator/controllers/operator/oapserverdynamicconfig_controller.go b/operator/controllers/operator/oapserverdynamicconfig_controller.go
index 712199e..6c4d06c 100644
--- a/operator/controllers/operator/oapserverdynamicconfig_controller.go
+++ b/operator/controllers/operator/oapserverdynamicconfig_controller.go
@@ -70,7 +70,7 @@ func (r *OAPServerDynamicConfigReconciler) Reconcile(ctx context.Context, req ct
 	_ = log.FromContext(ctx)
 
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================oapserverdynamicconfig reconcile started================================")
 
 	config := operatorv1alpha1.OAPServerDynamicConfig{}
 	if err := r.Client.Get(ctx, req.NamespacedName, &config); err != nil {
diff --git a/operator/controllers/operator/satellite_controller.go b/operator/controllers/operator/satellite_controller.go
index b376041..46eafb7 100644
--- a/operator/controllers/operator/satellite_controller.go
+++ b/operator/controllers/operator/satellite_controller.go
@@ -50,7 +50,7 @@ type SatelliteReconciler struct {
 
 func (r *SatelliteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================satellite reconcile started================================")
 
 	satellite := operatorv1alpha1.Satellite{}
 	if err := r.Client.Get(ctx, req.NamespacedName, &satellite); err != nil {
diff --git a/operator/controllers/operator/storage_controller.go b/operator/controllers/operator/storage_controller.go
index 6d615f6..1458595 100644
--- a/operator/controllers/operator/storage_controller.go
+++ b/operator/controllers/operator/storage_controller.go
@@ -46,7 +46,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	runtimelog "sigs.k8s.io/controller-runtime/pkg/log"
-	"software.sslmate.com/src/go-pkcs12"
+	pkcs12 "software.sslmate.com/src/go-pkcs12"
 
 	operatorv1alpha1 "github.com/apache/skywalking-swck/operator/apis/operator/v1alpha1"
 	"github.com/apache/skywalking-swck/operator/pkg/kubernetes"
@@ -70,7 +70,7 @@ type StorageReconciler struct {
 
 func (r *StorageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================storage reconcile started================================")
 
 	storage := operatorv1alpha1.Storage{}
 	if err := r.Client.Get(ctx, req.NamespacedName, &storage); err != nil {
diff --git a/operator/controllers/operator/swagent_controller.go b/operator/controllers/operator/swagent_controller.go
new file mode 100644
index 0000000..bfac353
--- /dev/null
+++ b/operator/controllers/operator/swagent_controller.go
@@ -0,0 +1,52 @@
+// 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 operator
+
+import (
+	"context"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	runtimelog "sigs.k8s.io/controller-runtime/pkg/log"
+
+	operatorv1alpha1 "github.com/apache/skywalking-swck/operator/apis/operator/v1alpha1"
+)
+
+// SwAgentReconciler reconciles a SwAgent object
+type SwAgentReconciler struct {
+	client.Client
+	Scheme *runtime.Scheme
+}
+
+//+kubebuilder:rbac:groups=operator.skywalking.apache.org,resources=swagents,verbs=get;list;watch;create;update;patch;delete
+//+kubebuilder:rbac:groups=operator.skywalking.apache.org,resources=swagents/status,verbs=get;update;patch
+//+kubebuilder:rbac:groups=operator.skywalking.apache.org,resources=swagents/finalizers,verbs=update
+
+func (r *SwAgentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
+	log := runtimelog.FromContext(ctx)
+	log.Info("===================== SwAgent Reconcile (do nothing) ================================\n")
+	return ctrl.Result{}, nil
+}
+
+// SetupWithManager sets up the controller with the Manager.
+func (r *SwAgentReconciler) SetupWithManager(mgr ctrl.Manager) error {
+	return ctrl.NewControllerManagedBy(mgr).
+		For(&operatorv1alpha1.SwAgent{}).
+		Complete(r)
+}
diff --git a/operator/controllers/operator/ui_controller.go b/operator/controllers/operator/ui_controller.go
index 06a9d83..f03a20a 100644
--- a/operator/controllers/operator/ui_controller.go
+++ b/operator/controllers/operator/ui_controller.go
@@ -54,7 +54,7 @@ type UIReconciler struct {
 
 func (r *UIReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
 	log := runtimelog.FromContext(ctx)
-	log.Info("=====================reconcile started================================")
+	log.Info("=====================ui reconcile started================================")
 
 	ui := uiv1alpha1.UI{}
 	if err := r.Client.Get(ctx, req.NamespacedName, &ui); err != nil {
diff --git a/operator/dist/LICENSE b/operator/dist/LICENSE
index c0bef69..71c016c 100644
--- a/operator/dist/LICENSE
+++ b/operator/dist/LICENSE
@@ -178,12 +178,12 @@
 Apache-2.0 licenses
 ========================================================================
 
-    cloud.google.com/go v0.54.0 Apache-2.0
-    cloud.google.com/go/bigquery v1.4.0 Apache-2.0
+    cloud.google.com/go v0.81.0 Apache-2.0
+    cloud.google.com/go/bigquery v1.8.0 Apache-2.0
     cloud.google.com/go/datastore v1.1.0 Apache-2.0
     cloud.google.com/go/firestore v1.1.0 Apache-2.0
-    cloud.google.com/go/pubsub v1.2.0 Apache-2.0
-    cloud.google.com/go/storage v1.6.0 Apache-2.0
+    cloud.google.com/go/pubsub v1.3.1 Apache-2.0
+    cloud.google.com/go/storage v1.10.0 Apache-2.0
     github.com/Azure/go-autorest v14.2.0+incompatible Apache-2.0
     github.com/Azure/go-autorest/autorest v0.11.18 Apache-2.0
     github.com/Azure/go-autorest/autorest/adal v0.9.13 Apache-2.0
@@ -196,6 +196,7 @@ Apache-2.0 licenses
     github.com/OneOfOne/xxhash v1.2.2 Apache-2.0
     github.com/census-instrumentation/opencensus-proto v0.2.1 Apache-2.0
     github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 Apache-2.0
+    github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed Apache-2.0
     github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 Apache-2.0
     github.com/cockroachdb/errors v1.2.4 Apache-2.0
     github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f Apache-2.0
@@ -205,51 +206,53 @@ Apache-2.0 licenses
     github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e Apache-2.0
     github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
     github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f Apache-2.0
-    github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d Apache-2.0
+    github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0 Apache-2.0
     github.com/envoyproxy/protoc-gen-validate v0.1.0 Apache-2.0
-    github.com/go-logr/logr v0.4.0 Apache-2.0
-    github.com/go-logr/zapr v0.4.0 Apache-2.0
+    github.com/go-logr/logr v1.2.0 Apache-2.0
+    github.com/go-logr/zapr v1.2.0 Apache-2.0
     github.com/go-openapi/jsonpointer v0.19.5 Apache-2.0
     github.com/go-openapi/jsonreference v0.19.5 Apache-2.0
     github.com/go-openapi/swag v0.19.14 Apache-2.0
-    github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b Apache-2.0
+    github.com/golang/glog v1.0.0 Apache-2.0
     github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da Apache-2.0
-    github.com/golang/mock v1.4.1 Apache-2.0
+    github.com/golang/mock v1.5.0 Apache-2.0
     github.com/google/btree v1.0.1 Apache-2.0
+    github.com/google/cel-spec v0.6.0 Apache-2.0
+    github.com/google/gnostic v0.5.7-v3refs Apache-2.0
     github.com/google/gofuzz v1.1.0 Apache-2.0
     github.com/google/martian v2.1.0+incompatible Apache-2.0
-    github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3 Apache-2.0
+    github.com/google/martian/v3 v3.1.0 Apache-2.0
+    github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5 Apache-2.0
     github.com/google/renameio v0.1.0 Apache-2.0
-    github.com/googleapis/gnostic v0.5.5 Apache-2.0
     github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 Apache-2.0
     github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 Apache-2.0
     github.com/inconshreveable/mousetrap v1.0.0 Apache-2.0
     github.com/jonboulle/clockwork v0.2.2 Apache-2.0
     github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 Apache-2.0
     github.com/moby/spdystream v0.2.0 Apache-2.0
-    github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 Apache-2.0
+    github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 Apache-2.0
     github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd Apache-2.0
-    github.com/modern-go/reflect2 v1.0.1 Apache-2.0
+    github.com/modern-go/reflect2 v1.0.2 Apache-2.0
     github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f Apache-2.0
     github.com/oklog/ulid v1.3.1 Apache-2.0
     github.com/opentracing/opentracing-go v1.1.0 Apache-2.0
     github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 Apache-2.0
-    github.com/prometheus/client_golang v1.11.1 Apache-2.0
+    github.com/prometheus/client_golang v1.12.1 Apache-2.0
     github.com/prometheus/client_model v0.2.0 Apache-2.0
-    github.com/prometheus/common v0.26.0 Apache-2.0
-    github.com/prometheus/procfs v0.6.0 Apache-2.0
+    github.com/prometheus/common v0.32.1 Apache-2.0
+    github.com/prometheus/procfs v0.7.3 Apache-2.0
     github.com/prometheus/tsdb v0.7.1 Apache-2.0
     github.com/soheilhy/cmux v0.1.5 Apache-2.0
-    github.com/spf13/afero v1.2.2 Apache-2.0
-    github.com/spf13/cobra v1.1.3 Apache-2.0
-    go.etcd.io/etcd/api/v3 v3.5.0 Apache-2.0
-    go.etcd.io/etcd/client/pkg/v3 v3.5.0 Apache-2.0
+    github.com/spf13/afero v1.6.0 Apache-2.0
+    github.com/spf13/cobra v1.4.0 Apache-2.0
+    go.etcd.io/etcd/api/v3 v3.5.1 Apache-2.0
+    go.etcd.io/etcd/client/pkg/v3 v3.5.1 Apache-2.0
     go.etcd.io/etcd/client/v2 v2.305.0 Apache-2.0
-    go.etcd.io/etcd/client/v3 v3.5.0 Apache-2.0
+    go.etcd.io/etcd/client/v3 v3.5.1 Apache-2.0
     go.etcd.io/etcd/pkg/v3 v3.5.0 Apache-2.0
     go.etcd.io/etcd/raft/v3 v3.5.0 Apache-2.0
     go.etcd.io/etcd/server/v3 v3.5.0 Apache-2.0
-    go.opencensus.io v0.22.3 Apache-2.0
+    go.opencensus.io v0.23.0 Apache-2.0
     go.opentelemetry.io/contrib v0.20.0 Apache-2.0
     go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 Apache-2.0
     go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 Apache-2.0
@@ -264,26 +267,33 @@ Apache-2.0 licenses
     go.opentelemetry.io/proto/otlp v0.7.0 Apache-2.0
     gomodules.xyz/jsonpatch/v2 v2.2.0 Apache-2.0
     google.golang.org/appengine v1.6.7 Apache-2.0
-    google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c Apache-2.0
-    google.golang.org/grpc v1.38.0 Apache-2.0
+    google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 Apache-2.0
+    google.golang.org/grpc v1.40.0 Apache-2.0
     gopkg.in/ini.v1 v1.51.0 Apache-2.0
     gopkg.in/square/go-jose.v2 v2.2.2 Apache-2.0
     gopkg.in/yaml.v2 v2.4.0 Apache-2.0
     gotest.tools/v3 v3.0.3 Apache-2.0
-    k8s.io/api v0.22.1 Apache-2.0
-    k8s.io/apiextensions-apiserver v0.22.1 Apache-2.0
-    k8s.io/apimachinery v0.22.1 Apache-2.0
-    k8s.io/apiserver v0.22.1 Apache-2.0
-    k8s.io/client-go v0.22.1 Apache-2.0
-    k8s.io/code-generator v0.22.1 Apache-2.0
-    k8s.io/component-base v0.22.1 Apache-2.0
-    k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 Apache-2.0
-    k8s.io/klog/v2 v2.9.0 Apache-2.0
-    k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e Apache-2.0
-    k8s.io/utils v0.0.0-20210802155522-efc7438f0176 Apache-2.0
-    sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22 Apache-2.0
-    sigs.k8s.io/controller-runtime v0.10.0 Apache-2.0
-    sigs.k8s.io/structured-merge-diff/v4 v4.1.2 Apache-2.0
+    k8s.io/api v0.24.2 Apache-2.0
+    k8s.io/apiextensions-apiserver v0.24.2 Apache-2.0
+    k8s.io/apimachinery v0.24.2 Apache-2.0
+    k8s.io/apiserver v0.24.2 Apache-2.0
+    k8s.io/client-go v0.24.2 Apache-2.0
+    k8s.io/code-generator v0.24.2 Apache-2.0
+    k8s.io/component-base v0.24.2 Apache-2.0
+    k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 Apache-2.0
+    k8s.io/klog/v2 v2.60.1 Apache-2.0
+    k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 Apache-2.0
+    k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 Apache-2.0
+    sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 Apache-2.0
+    sigs.k8s.io/controller-runtime v0.12.3 Apache-2.0
+    sigs.k8s.io/structured-merge-diff/v4 v4.2.1 Apache-2.0
+
+========================================================================
+Apache-2.0 and BSD-3-Clause licenses
+========================================================================
+
+    github.com/google/cel-go v0.10.1 Apache-2.0 and BSD-3-Clause
+    sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 Apache-2.0 and BSD-3-Clause
 
 ========================================================================
 BSD-2-Clause licenses
@@ -294,7 +304,8 @@ BSD-2-Clause licenses
     github.com/gorilla/websocket v1.4.2 BSD-2-Clause
     github.com/magiconair/properties v1.8.1 BSD-2-Clause
     github.com/pkg/errors v0.9.1 BSD-2-Clause
-    github.com/russross/blackfriday/v2 v2.0.1 BSD-2-Clause
+    github.com/pkg/sftp v1.10.1 BSD-2-Clause
+    github.com/russross/blackfriday/v2 v2.1.0 BSD-2-Clause
     gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f BSD-2-Clause
 
 ========================================================================
@@ -305,9 +316,10 @@ BSD-3-Clause licenses
     github.com/PuerkitoBio/purell v1.1.1 BSD-3-Clause
     github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 BSD-3-Clause
     github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 BSD-3-Clause
+    github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e BSD-3-Clause
     github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 BSD-3-Clause
-    github.com/evanphx/json-patch v4.11.0+incompatible BSD-3-Clause
-    github.com/fsnotify/fsnotify v1.4.9 BSD-3-Clause
+    github.com/evanphx/json-patch v5.6.0+incompatible BSD-3-Clause
+    github.com/fsnotify/fsnotify v1.5.1 BSD-3-Clause
     github.com/getsentry/raven-go v0.2.0 BSD-3-Clause
     github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 BSD-3-Clause
     github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 BSD-3-Clause
@@ -316,13 +328,15 @@ BSD-3-Clause licenses
     github.com/google/go-cmp v0.5.5 BSD-3-Clause
     github.com/google/uuid v1.1.2 BSD-3-Clause
     github.com/googleapis/gax-go/v2 v2.0.5 BSD-3-Clause
+    github.com/gorilla/mux v1.8.0 BSD-3-Clause
     github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause
     github.com/hashicorp/go-msgpack v0.5.3 BSD-3-Clause
     github.com/hashicorp/go.net v0.0.1 BSD-3-Clause
-    github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 BSD-3-Clause
+    github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 BSD-3-Clause
     github.com/imdario/mergo v0.3.12 BSD-3-Clause
     github.com/jessevdk/go-flags v1.4.0 BSD-3-Clause
     github.com/julienschmidt/httprouter v1.3.0 BSD-3-Clause
+    github.com/kr/fs v0.1.0 BSD-3-Clause
     github.com/miekg/dns v1.0.14 BSD-3-Clause
     github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 BSD-3-Clause
     github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f BSD-3-Clause
@@ -331,23 +345,23 @@ BSD-3-Clause licenses
     github.com/rogpeppe/go-internal v1.3.0 BSD-3-Clause
     github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 BSD-3-Clause
     github.com/spf13/pflag v1.0.5 BSD-3-Clause
-    golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 BSD-3-Clause
+    golang.org/x/crypto v0.0.0-20220214200702-86341886e292 BSD-3-Clause
     golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 BSD-3-Clause
     golang.org/x/image v0.0.0-20190802002840-cff245a6509b BSD-3-Clause
     golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 BSD-3-Clause
     golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 BSD-3-Clause
-    golang.org/x/mod v0.4.2 BSD-3-Clause
-    golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 BSD-3-Clause
-    golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d BSD-3-Clause
+    golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 BSD-3-Clause
+    golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd BSD-3-Clause
+    golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 BSD-3-Clause
     golang.org/x/sync v0.0.0-20210220032951-036812b2e83c BSD-3-Clause
-    golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 BSD-3-Clause
-    golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d BSD-3-Clause
-    golang.org/x/text v0.3.6 BSD-3-Clause
-    golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac BSD-3-Clause
-    golang.org/x/tools v0.1.2 BSD-3-Clause
+    golang.org/x/sys v0.0.0-20220209214540-3681064d5158 BSD-3-Clause
+    golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 BSD-3-Clause
+    golang.org/x/text v0.3.7 BSD-3-Clause
+    golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 BSD-3-Clause
+    golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717 BSD-3-Clause
     golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 BSD-3-Clause
-    google.golang.org/api v0.20.0 BSD-3-Clause
-    google.golang.org/protobuf v1.26.0 BSD-3-Clause
+    google.golang.org/api v0.43.0 BSD-3-Clause
+    google.golang.org/protobuf v1.27.1 BSD-3-Clause
     gopkg.in/errgo.v2 v2.1.0 BSD-3-Clause
     gopkg.in/fsnotify.v1 v1.4.7 BSD-3-Clause
     gopkg.in/inf.v0 v0.9.1 BSD-3-Clause
@@ -388,20 +402,21 @@ MIT licenses
     github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e MIT
     github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da MIT
     github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 MIT
+    github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 MIT
     github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a MIT
     github.com/benbjohnson/clock v1.1.0 MIT
     github.com/beorn7/perks v1.0.1 MIT
     github.com/bgentry/speakeasy v0.1.0 MIT
     github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c MIT
-    github.com/blang/semver v3.5.1+incompatible MIT
+    github.com/blang/semver/v4 v4.0.0 MIT
     github.com/cespare/xxhash v1.1.0 MIT
-    github.com/cespare/xxhash/v2 v2.1.1 MIT
+    github.com/cespare/xxhash/v2 v2.1.2 MIT
     github.com/chzyer/logex v1.1.10 MIT
     github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e MIT
     github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 MIT
     github.com/client9/misspell v0.3.4 MIT
     github.com/coreos/bbolt v1.3.2 MIT
-    github.com/cpuguy83/go-md2man/v2 v2.0.0 MIT
+    github.com/cpuguy83/go-md2man/v2 v2.0.1 MIT
     github.com/creack/pty v1.1.11 MIT
     github.com/dgrijalva/jwt-go v3.2.0+incompatible MIT
     github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 MIT
@@ -411,11 +426,11 @@ MIT licenses
     github.com/fatih/color v1.7.0 MIT
     github.com/felixge/httpsnoop v1.0.1 MIT
     github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
+    github.com/getkin/kin-openapi v0.76.0 MIT
     github.com/go-kit/kit v0.9.0 MIT
     github.com/go-kit/log v0.1.0 MIT
     github.com/go-logfmt/logfmt v0.5.0 MIT
     github.com/go-stack/stack v1.8.0 MIT
-    github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 MIT
     github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 MIT
     github.com/hashicorp/go-syslog v1.0.0 MIT
     github.com/hashicorp/mdns v1.0.0 MIT
@@ -423,7 +438,7 @@ MIT licenses
     github.com/huandu/xstrings v1.3.1 MIT
     github.com/josharian/intern v1.0.0 MIT
     github.com/jpillora/backoff v1.0.0 MIT
-    github.com/json-iterator/go v1.1.11 MIT
+    github.com/json-iterator/go v1.1.12 MIT
     github.com/jstemmer/go-junit-report v0.9.1 MIT
     github.com/jtolds/gls v4.20.0+incompatible MIT
     github.com/kisielk/errcheck v1.5.0 MIT
@@ -440,12 +455,12 @@ MIT licenses
     github.com/mitchellh/go-homedir v1.1.0 MIT
     github.com/mitchellh/go-testing-interface v1.0.0 MIT
     github.com/mitchellh/iochan v1.0.0 MIT
-    github.com/mitchellh/mapstructure v1.1.2 MIT
+    github.com/mitchellh/mapstructure v1.4.1 MIT
     github.com/mitchellh/reflectwalk v1.0.0 MIT
     github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e MIT
     github.com/nxadm/tail v1.4.8 MIT
-    github.com/onsi/ginkgo v1.16.4 MIT
-    github.com/onsi/gomega v1.15.0 MIT
+    github.com/onsi/ginkgo v1.16.5 MIT
+    github.com/onsi/gomega v1.18.1 MIT
     github.com/pelletier/go-toml v1.2.0 MIT
     github.com/peterbourgon/diskv v2.0.1+incompatible MIT
     github.com/posener/complete v1.1.1 MIT
@@ -463,16 +478,16 @@ MIT licenses
     github.com/subosito/gotenv v1.2.0 MIT
     github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 MIT
     github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 MIT
-    github.com/yuin/goldmark v1.3.5 MIT
+    github.com/yuin/goldmark v1.4.1 MIT
     go.etcd.io/bbolt v1.3.6 MIT
     go.uber.org/atomic v1.7.0 MIT
-    go.uber.org/goleak v1.1.10 MIT
+    go.uber.org/goleak v1.1.12 MIT
     go.uber.org/multierr v1.6.0 MIT
-    go.uber.org/zap v1.19.0 MIT
+    go.uber.org/zap v1.19.1 MIT
     gopkg.in/alecthomas/kingpin.v2 v2.2.6 MIT
     gopkg.in/natefinch/lumberjack.v2 v2.0.0 MIT
     gopkg.in/resty.v1 v1.12.0 MIT
-    honnef.co/go/tools v0.0.1-2020.1.3 MIT
+    honnef.co/go/tools v0.0.1-2020.1.4 MIT
 
 ========================================================================
 MIT and Apache-2.0 licenses
@@ -486,7 +501,7 @@ MIT and BSD-3-Clause licenses
 
     github.com/ghodss/yaml v1.0.0 MIT and BSD-3-Clause
     github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 MIT and BSD-3-Clause
-    sigs.k8s.io/yaml v1.2.0 MIT and BSD-3-Clause
+    sigs.k8s.io/yaml v1.3.0 MIT and BSD-3-Clause
 
 ========================================================================
 MPL-2.0 licenses
diff --git a/operator/dist/licenses/license-github.com-antlr-antlr4-runtime-Go-antlr.txt b/operator/dist/licenses/license-github.com-antlr-antlr4-runtime-Go-antlr.txt
new file mode 100644
index 0000000..52cf18e
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-antlr-antlr4-runtime-Go-antlr.txt
@@ -0,0 +1,26 @@
+Copyright 2021 The ANTLR Project
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.
+
+    2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+
+    3. Neither the name of the copyright holder nor the names of its
+    contributors may be used to endorse or promote products derived from this
+    software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/operator/dist/licenses/license-github.com-armon-go-socks5.txt b/operator/dist/licenses/license-github.com-armon-go-socks5.txt
new file mode 100644
index 0000000..a5df10e
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-armon-go-socks5.txt
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Armon Dadgar
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/operator/dist/licenses/license-github.com-blang-semver-v4.txt b/operator/dist/licenses/license-github.com-blang-semver-v4.txt
new file mode 100644
index 0000000..5ba5c86
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-blang-semver-v4.txt
@@ -0,0 +1,22 @@
+The MIT License
+
+Copyright (c) 2014 Benedikt Lang <github at benediktlang.de>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/operator/dist/licenses/license-github.com-cncf-xds-go.txt b/operator/dist/licenses/license-github.com-cncf-xds-go.txt
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-cncf-xds-go.txt
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
diff --git a/operator/dist/licenses/license-github.com-getkin-kin-openapi.txt b/operator/dist/licenses/license-github.com-getkin-kin-openapi.txt
new file mode 100644
index 0000000..992b983
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-getkin-kin-openapi.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017-2018 the project authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/operator/dist/licenses/license-github.com-google-cel-go.txt b/operator/dist/licenses/license-github.com-google-cel-go.txt
new file mode 100644
index 0000000..2493ed2
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-google-cel-go.txt
@@ -0,0 +1,233 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
+===========================================================================
+The common/types/pb/equal.go modification of proto.Equal logic
+===========================================================================
+Copyright (c) 2018 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/operator/dist/licenses/license-github.com-google-cel-spec.txt b/operator/dist/licenses/license-github.com-google-cel-spec.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-google-cel-spec.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
diff --git a/operator/dist/licenses/license-github.com-google-gnostic.txt b/operator/dist/licenses/license-github.com-google-gnostic.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-google-gnostic.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
diff --git a/operator/dist/licenses/license-github.com-google-martian-v3.txt b/operator/dist/licenses/license-github.com-google-martian-v3.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-google-martian-v3.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
diff --git a/operator/dist/licenses/license-github.com-gorilla-mux.txt b/operator/dist/licenses/license-github.com-gorilla-mux.txt
new file mode 100644
index 0000000..6903df6
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-gorilla-mux.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2012-2018 The Gorilla Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+	 * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+	 * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+	 * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/operator/dist/licenses/license-github.com-kr-fs.txt b/operator/dist/licenses/license-github.com-kr-fs.txt
new file mode 100644
index 0000000..7448756
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-kr-fs.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2012 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/operator/dist/licenses/license-github.com-pkg-sftp.txt b/operator/dist/licenses/license-github.com-pkg-sftp.txt
new file mode 100644
index 0000000..b7b5392
--- /dev/null
+++ b/operator/dist/licenses/license-github.com-pkg-sftp.txt
@@ -0,0 +1,9 @@
+Copyright (c) 2013, Dave Cheney
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROF [...]
diff --git a/operator/dist/licenses/license-sigs.k8s.io-json.txt b/operator/dist/licenses/license-sigs.k8s.io-json.txt
new file mode 100644
index 0000000..e5adf7f
--- /dev/null
+++ b/operator/dist/licenses/license-sigs.k8s.io-json.txt
@@ -0,0 +1,238 @@
+Files other than internal/golang/* licensed under:
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed 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.
+
+
+------------------
+
+internal/golang/* files licensed under:
+
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/operator/go.mod b/operator/go.mod
index df18081..8486181 100644
--- a/operator/go.mod
+++ b/operator/go.mod
@@ -4,19 +4,19 @@ go 1.17
 
 require (
 	github.com/Masterminds/sprig/v3 v3.1.0
-	github.com/evanphx/json-patch v4.11.0+incompatible
+	github.com/evanphx/json-patch v5.6.0+incompatible
 	github.com/ghodss/yaml v1.0.0
-	github.com/go-logr/logr v0.4.0
+	github.com/go-logr/logr v1.2.0
 	github.com/sirupsen/logrus v1.8.1
-	k8s.io/api v0.22.1
-	k8s.io/apimachinery v0.22.1
-	k8s.io/client-go v0.22.1
-	sigs.k8s.io/controller-runtime v0.10.0
+	k8s.io/api v0.24.2
+	k8s.io/apimachinery v0.24.2
+	k8s.io/client-go v0.24.2
+	sigs.k8s.io/controller-runtime v0.12.3
 	software.sslmate.com/src/go-pkcs12 v0.0.0-20210415151418-c5206de65a78
 )
 
 require (
-	cloud.google.com/go v0.54.0 // indirect
+	cloud.google.com/go v0.81.0 // indirect
 	github.com/Azure/go-autorest v14.2.0+incompatible // indirect
 	github.com/Azure/go-autorest/autorest v0.11.18 // indirect
 	github.com/Azure/go-autorest/autorest/adal v0.9.13 // indirect
@@ -25,55 +25,65 @@ require (
 	github.com/Azure/go-autorest/tracing v0.6.0 // indirect
 	github.com/Masterminds/goutils v1.1.0 // indirect
 	github.com/Masterminds/semver/v3 v3.1.0 // indirect
+	github.com/PuerkitoBio/purell v1.1.1 // indirect
+	github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
-	github.com/cespare/xxhash/v2 v2.1.1 // indirect
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/emicklei/go-restful v2.9.5+incompatible // indirect
 	github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect
-	github.com/fsnotify/fsnotify v1.4.9 // indirect
-	github.com/go-logr/zapr v0.4.0 // indirect
+	github.com/fsnotify/fsnotify v1.5.1 // indirect
+	github.com/go-logr/zapr v1.2.0 // indirect
+	github.com/go-openapi/jsonpointer v0.19.5 // indirect
+	github.com/go-openapi/jsonreference v0.19.5 // indirect
+	github.com/go-openapi/swag v0.19.14 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
 	github.com/google/go-cmp v0.5.5 // indirect
 	github.com/google/gofuzz v1.1.0 // indirect
 	github.com/google/uuid v1.1.2 // indirect
-	github.com/googleapis/gnostic v0.5.5 // indirect
 	github.com/huandu/xstrings v1.3.1 // indirect
 	github.com/imdario/mergo v0.3.12 // indirect
-	github.com/json-iterator/go v1.1.11 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/mailru/easyjson v0.7.6 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
 	github.com/mitchellh/copystructure v1.0.0 // indirect
 	github.com/mitchellh/reflectwalk v1.0.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
-	github.com/modern-go/reflect2 v1.0.1 // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/prometheus/client_golang v1.11.1 // indirect
+	github.com/prometheus/client_golang v1.12.1 // indirect
 	github.com/prometheus/client_model v0.2.0 // indirect
-	github.com/prometheus/common v0.26.0 // indirect
-	github.com/prometheus/procfs v0.6.0 // indirect
+	github.com/prometheus/common v0.32.1 // indirect
+	github.com/prometheus/procfs v0.7.3 // indirect
 	github.com/spf13/cast v1.3.1 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
 	go.uber.org/atomic v1.7.0 // indirect
 	go.uber.org/multierr v1.6.0 // indirect
-	go.uber.org/zap v1.19.0 // indirect
-	golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect
-	golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect
-	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
-	golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 // indirect
-	golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
-	golang.org/x/text v0.3.6 // indirect
-	golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
+	go.uber.org/zap v1.19.1 // indirect
+	golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
+	golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
+	golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
+	golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect
+	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
+	golang.org/x/text v0.3.7 // indirect
+	golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
 	gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
-	google.golang.org/protobuf v1.26.0 // indirect
+	google.golang.org/protobuf v1.27.1 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
-	k8s.io/apiextensions-apiserver v0.22.1 // indirect
-	k8s.io/component-base v0.22.1 // indirect
-	k8s.io/klog/v2 v2.9.0 // indirect
-	k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e // indirect
-	k8s.io/utils v0.0.0-20210802155522-efc7438f0176 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
-	sigs.k8s.io/yaml v1.2.0 // indirect
+	k8s.io/apiextensions-apiserver v0.24.2 // indirect
+	k8s.io/component-base v0.24.2 // indirect
+	k8s.io/klog/v2 v2.60.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
+	k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
+	sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
 )
diff --git a/operator/go.sum b/operator/go.sum
index 1d351b6..4e6b2ee 100644
--- a/operator/go.sum
+++ b/operator/go.sum
@@ -8,22 +8,36 @@ cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg
 cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
 cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
 cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0=
 cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
+cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
+cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8=
+cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
 cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
 cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
 github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
 github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
@@ -50,7 +64,9 @@ github.com/Masterminds/sprig/v3 v3.1.0/go.mod h1:ONGMf7UfYGAbMXCZmQLy8x3lCDIPrEZ
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -58,9 +74,11 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
@@ -71,20 +89,23 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
-github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
 github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
 github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
@@ -96,6 +117,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -107,24 +129,30 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
-github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs=
-github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=
+github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
+github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
+github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
 github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
 github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -139,15 +167,18 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
-github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
-github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
-github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM=
-github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
+github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE=
+github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=
+github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
 github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
+github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
 github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
 github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
@@ -158,6 +189,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -169,11 +201,15 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
 github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
 github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
@@ -189,11 +225,19 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
+github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=
+github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=
+github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
+github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -201,21 +245,28 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
 github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
-github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
-github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@@ -247,6 +298,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
 github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs=
 github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
@@ -255,12 +307,14 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
 github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
 github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
@@ -272,6 +326,7 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -282,6 +337,7 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
@@ -299,17 +355,20 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
 github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
-github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A=
+github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -324,13 +383,16 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
 github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
-github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
+github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
@@ -339,6 +401,7 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
@@ -348,8 +411,8 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
 github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s=
-github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -359,19 +422,22 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
@@ -388,12 +454,13 @@ github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
+github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
+github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
@@ -412,15 +479,21 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
 go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
+go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
 go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
 go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
 go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
+go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=
 go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
 go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
 go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
@@ -428,6 +501,9 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
@@ -443,26 +519,32 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
+go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
+go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE=
 go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
+go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=
+go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
+golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -485,7 +567,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
 golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
@@ -495,7 +577,10 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -512,6 +597,7 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -521,27 +607,52 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE=
-golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -576,41 +687,62 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo=
-golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
-golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
-golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -646,13 +778,30 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK
 golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -669,12 +818,24 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb
 google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
 google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
+google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
+google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
+google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
@@ -694,12 +855,35 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx
 google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
 google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
 google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -708,11 +892,20 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
 google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
 google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -724,8 +917,9 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -764,39 +958,43 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-k8s.io/api v0.22.1 h1:ISu3tD/jRhYfSW8jI/Q1e+lRxkR7w9UwQEZ7FgslrwY=
-k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY=
-k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE=
-k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c=
-k8s.io/apimachinery v0.22.1 h1:DTARnyzmdHMz7bFWFDDm22AM4pLWTQECMpRTFu2d2OM=
-k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
-k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400=
-k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw=
-k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk=
-k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o=
-k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo=
-k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo=
-k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
-k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI=
+k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg=
+k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k=
+k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ=
+k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM=
+k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
+k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI=
+k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA=
+k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30=
+k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
+k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU=
+k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM=
+k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
+k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
-k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM=
-k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
-k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM=
-k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20210802155522-efc7438f0176 h1:Mx0aa+SUAcNRQbs5jUzV8lkDlGFU8laZsY9jrcVX5SY=
+k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc=
+k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
+k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
 k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=
+k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
-sigs.k8s.io/controller-runtime v0.10.0 h1:HgyZmMpjUOrtkaFtCnfxsR1bGRuFoAczSNbn2MoKj5U=
-sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
+sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio=
+sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0=
+sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=
+sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
-sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno=
-sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
-sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
 software.sslmate.com/src/go-pkcs12 v0.0.0-20210415151418-c5206de65a78 h1:SqYE5+A2qvRhErbsXFfUEUmpWEKxxRSMgGLkvRAFOV4=
 software.sslmate.com/src/go-pkcs12 v0.0.0-20210415151418-c5206de65a78/go.mod h1:B7Wf0Ya4DHF9Yw+qfZuJijQYkWicqDa+79Ytmmq3Kjg=
diff --git a/operator/main.go b/operator/main.go
index e4b4174..97fab46 100644
--- a/operator/main.go
+++ b/operator/main.go
@@ -143,6 +143,13 @@ func main() {
 		setupLog.Error(err, "unable to create controller", "controller", "Satellite")
 		os.Exit(1)
 	}
+	if err = (&operatorcontrollers.SwAgentReconciler{
+		Client: mgr.GetClient(),
+		Scheme: mgr.GetScheme(),
+	}).SetupWithManager(mgr); err != nil {
+		setupLog.Error(err, "unable to create controller", "controller", "SwAgent")
+		os.Exit(1)
+	}
 	if err = (&operatorcontrollers.OAPServerConfigReconciler{
 		Client: mgr.GetClient(),
 		Scheme: mgr.GetScheme(),
@@ -184,6 +191,10 @@ func main() {
 			setupLog.Error(err, "unable to create webhook", "webhook", "Satellite")
 			os.Exit(1)
 		}
+		if err = (&operatorv1alpha1.SwAgent{}).SetupWebhookWithManager(mgr); err != nil {
+			setupLog.Error(err, "unable to create webhook", "webhook", "SwAgent")
+			os.Exit(1)
+		}
 		if err = (&operatorv1alpha1.OAPServerConfig{}).SetupWebhookWithManager(mgr); err != nil {
 			setupLog.Error(err, "unable to create webhook", "webhook", "OAPServerConfig")
 			os.Exit(1)
diff --git a/operator/pkg/kubernetes/apply.go b/operator/pkg/kubernetes/apply.go
index 2ae1e87..b4ca561 100644
--- a/operator/pkg/kubernetes/apply.go
+++ b/operator/pkg/kubernetes/apply.go
@@ -102,7 +102,7 @@ func (a *Application) apply(ctx context.Context, obj *unstructured.Unstructured,
 	key := client.ObjectKeyFromObject(obj)
 	current := &unstructured.Unstructured{}
 	current.SetGroupVersionKind(obj.GetObjectKind().GroupVersionKind())
-	err := a.Get(ctx, key, current)
+	err := a.Client.Get(ctx, key, current)
 
 	if apierrors.IsNotFound(err) {
 		log.Info("could not find existing resource, creating one...")
@@ -114,7 +114,7 @@ func (a *Application) apply(ctx context.Context, obj *unstructured.Unstructured,
 			obj = curr
 		}
 
-		if err = a.Create(ctx, obj); err != nil {
+		if err = a.Client.Create(ctx, obj); err != nil {
 			return false, fmt.Errorf("failed to create: %w", err)
 		}
 
@@ -137,7 +137,7 @@ func (a *Application) apply(ctx context.Context, obj *unstructured.Unstructured,
 		log.Info("resource keeps the same as before")
 		return false, nil
 	}
-	if err := a.Update(ctx, obj); err != nil {
+	if err := a.Client.Update(ctx, obj); err != nil {
 		return false, fmt.Errorf("failed to update: %w", err)
 	}
 	log.Info("updated")
diff --git a/operator/pkg/operator/injector/configmap.go b/operator/pkg/operator/injector/configmap.go
index 758c083..d4f440c 100644
--- a/operator/pkg/operator/injector/configmap.go
+++ b/operator/pkg/operator/injector/configmap.go
@@ -115,9 +115,13 @@ func GetConfigmapConfiguration(configmap *corev1.ConfigMap) (map[string]string,
 	data := configmap.Data
 	configuration := make(map[string]string)
 
+	if nil == data {
+		return configuration, nil
+	}
+
 	v, ok := data[DefaultConfigmapKey]
 	if !ok {
-		return configuration, fmt.Errorf("DefaultConfigmapKey %s not exist", DefaultConfigmapKey)
+		return configuration, nil
 	}
 
 	str := strings.Split(v, "\n")
diff --git a/operator/pkg/operator/injector/injection.go b/operator/pkg/operator/injector/injection.go
index 7ba77d9..5671dca 100644
--- a/operator/pkg/operator/injector/injection.go
+++ b/operator/pkg/operator/injector/injection.go
@@ -20,6 +20,7 @@ package injector
 import (
 	"context"
 	"encoding/json"
+	"fmt"
 	"net/http"
 	"strings"
 
@@ -27,6 +28,8 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
+
+	"github.com/apache/skywalking-swck/operator/apis/operator/v1alpha1"
 )
 
 // Injection is each step of the injection process
@@ -50,6 +53,7 @@ type InjectProcessData struct {
 	injectFileds      *SidecarInjectField
 	annotation        *Annotations
 	annotationOverlay *AnnotationOverlay
+	swAgentL          *v1alpha1.SwAgentList
 	pod               *corev1.Pod
 	req               admission.Request
 	log               logr.Logger
@@ -75,6 +79,7 @@ type GetStrategy struct {
 // get injection strategy from pod's labels and annotations
 // if don't need to inject, then return the original pod, otherwise go to the next step
 func (gs *GetStrategy) execute(ipd *InjectProcessData) admission.Response {
+	log.Info("=============== GetStrategy ================")
 	ipd.injectFileds.GetInjectStrategy(*ipd.annotation, &ipd.pod.ObjectMeta.Labels, &ipd.pod.ObjectMeta.Annotations)
 	if !ipd.injectFileds.NeedInject {
 		log.Info("don't inject agent")
@@ -87,6 +92,25 @@ func (gs *GetStrategy) setNext(next Injection) {
 	gs.next = next
 }
 
+// OverlaySwAgentCR is the cr config step of injection process
+type OverlaySwAgentCR struct {
+	next Injection
+}
+
+// get configs from SwAgent CR
+func (gs *OverlaySwAgentCR) execute(ipd *InjectProcessData) admission.Response {
+	log.Info(fmt.Sprintf("=============== OverlaySwAgentCR(%d) ================ ", len(ipd.swAgentL.Items)))
+	if !ipd.injectFileds.OverlaySwAgentCR(ipd.swAgentL, ipd.pod) {
+		log.Info("overlay SwAgent cr config error.")
+		return PatchReq(ipd.pod, ipd.req)
+	}
+	return gs.next.execute(ipd)
+}
+
+func (gs *OverlaySwAgentCR) setNext(next Injection) {
+	gs.next = next
+}
+
 // OverlaySidecar is the second step of injection process
 type OverlaySidecar struct {
 	next Injection
@@ -95,6 +119,7 @@ type OverlaySidecar struct {
 // OverlaySidecar will inject sidecar information such as image, command, args etc.
 // Since we did not set the validation function for these fields, it usually goes to the next step
 func (os *OverlaySidecar) execute(ipd *InjectProcessData) admission.Response {
+	log.Info("=============== OverlaySidecar ================")
 	if !ipd.injectFileds.OverlaySidecar(*ipd.annotation, ipd.annotationOverlay, &ipd.pod.ObjectMeta.Annotations) {
 		return PatchReq(ipd.pod, ipd.req)
 	}
@@ -114,9 +139,7 @@ type OverlayAgent struct {
 // If the agent overlay option is not set, go directly to the next step
 // If set the wrong value in the annotation , inject the error info and return
 func (oa *OverlayAgent) execute(ipd *InjectProcessData) admission.Response {
-	if !ipd.injectFileds.AgentOverlay {
-		return oa.next.execute(ipd)
-	}
+	log.Info("=============== OverlayAgent ================")
 	if !ipd.injectFileds.OverlayAgent(*ipd.annotation, ipd.annotationOverlay, &ipd.pod.ObjectMeta.Annotations) {
 		ipd.log.Info("overlay agent config error!please look the error annotation!")
 		return PatchReq(ipd.pod, ipd.req)
@@ -136,14 +159,12 @@ type OverlayPlugins struct {
 // OverlayPlugins contains two step , the first is to set jvm string , the second is to set optional plugins
 // during the step , we need to add jvm string to the Env of injected container
 func (op *OverlayPlugins) execute(ipd *InjectProcessData) admission.Response {
-	if !ipd.injectFileds.AgentOverlay {
-		return op.next.execute(ipd)
-	}
+	log.Info("=============== OverlayPlugins ================")
 	ipd.injectFileds.OverlayPlugins(&ipd.pod.ObjectMeta.Annotations)
 	if ipd.injectFileds.JvmAgentConfigStr != "" {
 		ipd.injectFileds.Env.Value = strings.Join([]string{ipd.injectFileds.Env.Value, ipd.injectFileds.JvmAgentConfigStr}, "=")
 	}
-	ipd.injectFileds.OverlayOptional(&ipd.pod.ObjectMeta.Annotations)
+	ipd.injectFileds.OverlayOptional(ipd.swAgentL.Items, &ipd.pod.ObjectMeta.Annotations)
 	return op.next.execute(ipd)
 }
 func (op *OverlayPlugins) setNext(next Injection) {
@@ -158,7 +179,8 @@ type GetConfigmap struct {
 // GetConfigmap will get the configmap specified in the annotation. if not exist ,
 // we will get data from default configmap and create configmap in the req's namespace
 func (gc *GetConfigmap) execute(ipd *InjectProcessData) admission.Response {
-	if !ipd.injectFileds.CreateConfigmap(ipd.ctx, ipd.kubeclient, ipd.req.Namespace, &ipd.pod.ObjectMeta.Annotations) {
+	log.Info("=============== GetConfigmap ================")
+	if !ipd.injectFileds.ValidateConfigmap(ipd.ctx, ipd.kubeclient, ipd.req.Namespace, &ipd.pod.ObjectMeta.Annotations) {
 		return PatchReq(ipd.pod, ipd.req)
 	}
 	return gc.next.execute(ipd)
@@ -174,6 +196,7 @@ type PodInject struct {
 
 // PodInject will inject all fields to the pod
 func (pi *PodInject) execute(ipd *InjectProcessData) admission.Response {
+	log.Info("=============== PodInject ================")
 	ipd.injectFileds.Inject(ipd.pod)
 	ipd.injectFileds.injectSucceedAnnotation(&ipd.pod.Annotations)
 	log.Info("inject successfully!")
@@ -185,13 +208,14 @@ func (pi *PodInject) setNext(next Injection) {
 
 // NewInjectProcess create a new InjectProcess
 func NewInjectProcess(ctx context.Context, injectFileds *SidecarInjectField, annotation *Annotations,
-	annotationOverlay *AnnotationOverlay, pod *corev1.Pod, req admission.Request, log logr.Logger,
+	annotationOverlay *AnnotationOverlay, swAgentL *v1alpha1.SwAgentList, pod *corev1.Pod, req admission.Request, log logr.Logger,
 	kubeclient client.Client) *InjectProcessData {
 	return &InjectProcessData{
 		ctx:               ctx,
 		injectFileds:      injectFileds,
 		annotation:        annotation,
 		annotationOverlay: annotationOverlay,
+		swAgentL:          swAgentL,
 		pod:               pod,
 		req:               req,
 		log:               log,
@@ -220,9 +244,13 @@ func (ipd *InjectProcessData) Run() admission.Response {
 	overlaysidecar := &OverlaySidecar{}
 	overlaysidecar.setNext(overlayAgent)
 
+	// set next step is OverlaySwAgentCR
+	overlaySwAgentCR := &OverlaySwAgentCR{}
+	overlaySwAgentCR.setNext(overlaysidecar)
+
 	// set next step is OverlaySidecar
 	getStrategy := &GetStrategy{}
-	getStrategy.setNext(overlaysidecar)
+	getStrategy.setNext(overlaySwAgentCR)
 
 	// this is first step and do real injection
 	return getStrategy.execute(ipd)
diff --git a/operator/pkg/operator/injector/injector.go b/operator/pkg/operator/injector/injector.go
index 700b06a..1340137 100644
--- a/operator/pkg/operator/injector/injector.go
+++ b/operator/pkg/operator/injector/injector.go
@@ -21,24 +21,24 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"regexp"
 	"strings"
 
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	logf "sigs.k8s.io/controller-runtime/pkg/log"
+
+	"github.com/apache/skywalking-swck/operator/apis/operator/v1alpha1"
 )
 
 const (
-	// the label means whether to enbale injection , "true" of "false"
+	// the label means whether to enbale injection , "true" or "false".
 	ActiveInjectorLabel = "swck-java-agent-injected"
 	// SidecarInjectSucceedAnno represents injection succeed
 	SidecarInjectSucceedAnno = "sidecar.skywalking.apache.org/succeed"
 	// the annotation means which container to inject
 	sidecarInjectContainerAnno = "strategy.skywalking.apache.org/inject.Container"
-	// the annotation means whether to enable overlay agent, "true" of "false"
-	sidecarAgentOverlayAnno = "strategy.skywalking.apache.org/agent.Overlay"
 	// the annotation that specify the reason for injection failure
 	sidecarInjectErrorAnno = "sidecar.skywalking.apache.org/error"
 	// those annotations with the following prefixes represent sidecar information
@@ -58,9 +58,8 @@ const (
 	// If user want to use optional-reporter-plugins , the annotation must match a optinal-reporter plugin
 	// such as optional-exporter.skywalking.apache.org: "kafka"
 	optionsReporterAnnotation = "optional-reporter.skywalking.apache.org"
-	// the ServiceName and BackendService are important information that need to be printed
-	ServiceName    = "agent.service_name"
-	BackendService = "collector.backend_service"
+	// the mount path of empty volume, which shared by init container and target container.
+	mountPath = "/sky/agent"
 )
 
 // log is for logging in this package.
@@ -70,11 +69,6 @@ var log = logf.Log.WithName("injector")
 type SidecarInjectField struct {
 	// determine whether to inject , default is not to inject
 	NeedInject bool
-	// determine whether to use annotation to overlay agent config ,
-	// default is not to overlay,which means only use configmap to set agent config
-	// Otherwise, the way to overlay is set jvm agent ,just like following
-	// -javaagent: /sky/agent/skywalking-agent,jar={config1}={value1},{config2}={value2}
-	AgentOverlay bool
 	// Initcontainer is a container that has the agent folder
 	Initcontainer corev1.Container
 	// sidecarVolume is a shared directory between App's container and initcontainer
@@ -89,6 +83,8 @@ type SidecarInjectField struct {
 	ConfigmapVolumeMount corev1.VolumeMount
 	// env is used to set java agent’s parameters
 	Env corev1.EnvVar
+	// envs is the envs pass to target containers
+	Envs []corev1.EnvVar
 	// the string is used to set jvm agent ,just like following
 	// -javaagent: /sky/agent/skywalking-agent,jar=jvmAgentConfigStr
 	JvmAgentConfigStr string
@@ -103,6 +99,7 @@ func NewSidecarInjectField() *SidecarInjectField {
 
 // Inject will do real injection
 func (s *SidecarInjectField) Inject(pod *corev1.Pod) {
+	log.Info(fmt.Sprintf("inject pod : %s", pod.GenerateName))
 	// add initcontrainers to spec
 	if pod.Spec.InitContainers != nil {
 		pod.Spec.InitContainers = append(pod.Spec.InitContainers, s.Initcontainer)
@@ -111,37 +108,51 @@ func (s *SidecarInjectField) Inject(pod *corev1.Pod) {
 	}
 
 	// add volume to spec
-	if pod.Spec.Volumes != nil {
-		pod.Spec.Volumes = append(pod.Spec.Volumes, s.SidecarVolume, s.ConfigmapVolume)
-	} else {
-		pod.Spec.Volumes = []corev1.Volume{s.SidecarVolume, s.ConfigmapVolume}
+	if pod.Spec.Volumes == nil {
+		pod.Spec.Volumes = []corev1.Volume{}
+	}
+	pod.Spec.Volumes = append(pod.Spec.Volumes, s.SidecarVolume)
+	if len(s.ConfigmapVolume.Name) > 0 && len(s.ConfigmapVolume.ConfigMap.Name) > 0 {
+		pod.Spec.Volumes = append(pod.Spec.Volumes, s.ConfigmapVolume)
 	}
 
 	// choose a specific container to inject
-	containers := []*corev1.Container{}
+	targetContainers := s.findInjectContainer(pod.Spec.Containers)
 
-	c := s.findInjectContainer(pod.Spec.Containers)
-	if c != nil {
-		containers = append(containers, c)
-	} else {
-		for i := range pod.Spec.Containers {
-			containers = append(containers, &pod.Spec.Containers[i])
+	// add volumemount and env to container
+	for i := range targetContainers {
+		log.Info(fmt.Sprintf("inject container : %s", targetContainers[i].Name))
+		if (*targetContainers[i]).VolumeMounts == nil {
+			(*targetContainers[i]).VolumeMounts = []corev1.VolumeMount{}
 		}
-	}
 
-	// add volumemount and env to container
-	for i := range containers {
-		if (*containers[i]).VolumeMounts != nil {
-			(*containers[i]).VolumeMounts = append((*containers[i]).VolumeMounts,
-				s.SidecarVolumeMount, s.ConfigmapVolumeMount)
-		} else {
-			(*containers[i]).VolumeMounts = []corev1.VolumeMount{s.SidecarVolumeMount,
-				s.ConfigmapVolumeMount}
+		(*targetContainers[i]).VolumeMounts = append((*targetContainers[i]).VolumeMounts, s.SidecarVolumeMount)
+		if len(s.ConfigmapVolumeMount.Name) > 0 && len(s.ConfigmapVolumeMount.MountPath) > 0 {
+			(*targetContainers[i]).VolumeMounts = append((*targetContainers[i]).VolumeMounts, s.ConfigmapVolumeMount)
 		}
-		if (*containers[i]).Env != nil {
-			(*containers[i]).Env = append((*containers[i]).Env, s.Env)
+
+		if (*targetContainers[i]).Env != nil {
+			(*targetContainers[i]).Env = append((*targetContainers[i]).Env, s.Env)
 		} else {
-			(*containers[i]).Env = []corev1.EnvVar{s.Env}
+			(*targetContainers[i]).Env = []corev1.EnvVar{s.Env}
+		}
+
+		// envs to be append
+		var envsTBA []corev1.EnvVar
+		for j, envInject := range s.Envs {
+			isExists := false
+			for _, envExists := range targetContainers[i].Env {
+				if strings.EqualFold(envExists.Name, envInject.Name) {
+					isExists = true
+					break
+				}
+			}
+			if !isExists {
+				envsTBA = append(envsTBA, s.Envs[j])
+			}
+		}
+		if len(s.Envs) > 0 {
+			(*targetContainers[i]).Env = append((*targetContainers[i]).Env, envsTBA...)
 		}
 	}
 }
@@ -151,15 +162,13 @@ func (s *SidecarInjectField) GetInjectStrategy(a Annotations, labels,
 	annotation *map[string]string) {
 	// set default value
 	s.NeedInject = false
-	s.InjectContainer = ""
-	s.AgentOverlay = false
 
-	// set NeedInject's value , if the pod has the label "swck-java-agent-injected=true",means need inject
+	// set NeedInject's value , if the pod has the label "swck-java-agent-injected=true", means need inject
 	if *labels == nil {
 		return
 	}
 
-	if strings.EqualFold(strings.ToLower((*labels)[ActiveInjectorLabel]), "true") {
+	if strings.EqualFold((*labels)[ActiveInjectorLabel], "true") {
 		s.NeedInject = true
 	}
 
@@ -171,27 +180,37 @@ func (s *SidecarInjectField) GetInjectStrategy(a Annotations, labels,
 	if v, ok := (*annotation)[sidecarInjectContainerAnno]; ok {
 		s.InjectContainer = v
 	}
+}
 
-	// set AgentOverlay's value
-	if v, ok := (*annotation)[sidecarAgentOverlayAnno]; ok {
-		if strings.EqualFold(strings.ToLower(v), "true") {
-			s.AgentOverlay = true
-		}
+func (s *SidecarInjectField) findInjectContainer(containers []corev1.Container) []*corev1.Container {
+
+	var targetContainers []*corev1.Container
+
+	if len(containers) == 0 {
+		return targetContainers
 	}
-}
 
-func (s *SidecarInjectField) findInjectContainer(containers []corev1.Container) *corev1.Container {
 	// validate the container is or not exist
-	if s.InjectContainer == "" {
-		return nil
+	if len(s.InjectContainer) == 0 {
+		for i := range containers {
+			targetContainers = append(targetContainers, &containers[i])
+		}
+		return targetContainers
 	}
 
+	containerMatcher, err := regexp.Compile(s.InjectContainer)
+	if err != nil {
+		log.Error(err, fmt.Sprintf("failed to compile regular expression: %s", s.InjectContainer))
+		targetContainers = append(targetContainers, &containers[0])
+		return targetContainers
+	}
 	for i := range containers {
-		if containers[i].Name == s.InjectContainer {
-			return &containers[i]
+		if containerMatcher.MatchString(containers[i].Name) {
+			log.Info(fmt.Sprintf("container %s matched. ", containers[i].Name))
+			targetContainers = append(targetContainers, &containers[i])
 		}
 	}
-	return nil
+	return targetContainers
 }
 
 func (s *SidecarInjectField) injectErrorAnnotation(annotation *map[string]string, errorInfo string) {
@@ -200,6 +219,7 @@ func (s *SidecarInjectField) injectErrorAnnotation(annotation *map[string]string
 
 func (s *SidecarInjectField) injectSucceedAnnotation(annotation *map[string]string) {
 	(*annotation)[SidecarInjectSucceedAnno] = "true"
+	(*annotation)[ActiveInjectorLabel] = "true"
 }
 
 // SidecarOverlayandGetValue get final value of sidecar
@@ -212,23 +232,80 @@ func (s *SidecarInjectField) SidecarOverlayandGetValue(ao *AnnotationOverlay, an
 			return "", false
 		}
 	}
-	return ao.GetFinalValue(a), true
+	return (*ao)[a], true
 }
 
+// annotation > swAgent > default
 func (s *SidecarInjectField) setValue(config *string, ao *AnnotationOverlay, annotation *map[string]string,
 	a Annotation) bool {
 	if v, ok := s.SidecarOverlayandGetValue(ao, annotation, a); ok {
-		*config = v
-		return true
+		if len(v) > 0 {
+			*config = v
+			return true
+		} else if len(*config) > 0 {
+			return true
+		} else {
+			*config = a.DefaultValue
+			return true
+		}
 	}
 	return false
 }
 
+func (s *SidecarInjectField) OverlaySwAgentCR(swAgentL *v1alpha1.SwAgentList, pod *corev1.Pod) bool {
+	s.ConfigmapVolume.ConfigMap = new(corev1.ConfigMapVolumeSource)
+
+	// chose the last matched SwAgent
+	if len(swAgentL.Items) > 0 {
+		swAgent := swAgentL.Items[len(swAgentL.Items)-1]
+		log.Info(fmt.Sprintf("agent %s loaded.", swAgent.Name))
+		// shared volume, mount path is fixed
+		s.SidecarVolume.Name = swAgent.Spec.SharedVolumeName
+		s.SidecarVolume.VolumeSource.EmptyDir = &corev1.EmptyDirVolumeSource{}
+		s.SidecarVolumeMount.Name = swAgent.Spec.SharedVolumeName
+		s.SidecarVolumeMount.MountPath = mountPath
+
+		// agent configmap
+		if swAgent.Spec.SwConfigMapVolume != nil {
+			if len(swAgent.Spec.SwConfigMapVolume.Name) > 0 &&
+				len(swAgent.Spec.SwConfigMapVolume.ConfigMapName) > 0 &&
+				len(swAgent.Spec.SwConfigMapVolume.ConfigMapMountFile) > 0 {
+				//s.ConfigmapVolume = corev1.Volume{}
+				s.ConfigmapVolume.Name = swAgent.Spec.SwConfigMapVolume.Name
+				s.ConfigmapVolume.ConfigMap = new(corev1.ConfigMapVolumeSource)
+				s.ConfigmapVolume.ConfigMap.Name = swAgent.Spec.SwConfigMapVolume.ConfigMapName
+				//s.ConfigmapVolumeMount = corev1.VolumeMount{}
+				s.ConfigmapVolumeMount.Name = swAgent.Spec.SwConfigMapVolume.Name
+				s.ConfigmapVolumeMount.MountPath = "/sky/agent/config/" + swAgent.Spec.SwConfigMapVolume.ConfigMapMountFile
+				s.ConfigmapVolumeMount.SubPath = swAgent.Spec.SwConfigMapVolume.ConfigMapMountFile
+			}
+		}
+
+		// init container
+		s.Initcontainer.Name = swAgent.Spec.JavaSidecar.Name
+		s.Initcontainer.Image = swAgent.Spec.JavaSidecar.Image
+		s.Initcontainer.Args = swAgent.Spec.JavaSidecar.Args
+		s.Initcontainer.Command = swAgent.Spec.JavaSidecar.Command
+		s.Initcontainer.VolumeMounts = append(s.Initcontainer.VolumeMounts, corev1.VolumeMount{
+			Name:      swAgent.Spec.SharedVolumeName,
+			MountPath: mountPath,
+		})
+
+		// target container
+		s.Envs = swAgent.Spec.JavaSidecar.Env
+		s.InjectContainer = swAgent.Spec.ContainerMatcher
+	}
+
+	return true
+}
+
 // OverlaySidecar overlays default config
 func (s *SidecarInjectField) OverlaySidecar(a Annotations, ao *AnnotationOverlay, annotation *map[string]string) bool {
-	s.ConfigmapVolume.ConfigMap = new(corev1.ConfigMapVolumeSource)
 	s.Initcontainer.Command = make([]string, 1)
 	s.Initcontainer.Args = make([]string, 2)
+	if nil == s.ConfigmapVolume.ConfigMap {
+		s.ConfigmapVolume.ConfigMap = new(corev1.ConfigMapVolumeSource)
+	}
 
 	limitsStr := ""
 	requestStr := ""
@@ -249,6 +326,7 @@ func (s *SidecarInjectField) OverlaySidecar(a Annotations, ao *AnnotationOverlay
 		"env.Name":                         &s.Env.Name,
 		"env.Value":                        &s.Env.Value,
 	}
+
 	anno := GetAnnotationsByPrefix(a, sidecarAnnotationPrefix)
 	for _, v := range anno.Annotations {
 		fieldName := strings.TrimPrefix(v.Name, sidecarAnnotationPrefix)
@@ -337,23 +415,48 @@ func (s *SidecarInjectField) OverlayAgent(a Annotations, ao *AnnotationOverlay,
 // optional-reporter.skywalking.apache.org: "kafka"
 // the final command will be "cd /optional-plugins && ls | grep -E "trace|webflux|cloud-gateway-2.1.x" | xargs -i cp {}  /plugins
 // or "cd /optional-reporter-plugins && ls | grep -E "kafka" | xargs -i cp {}  /plugins"
-func (s *SidecarInjectField) OverlayOptional(annotation *map[string]string) {
+func (s *SidecarInjectField) OverlayOptional(swAgentL []v1alpha1.SwAgent, annotation *map[string]string) {
 	sourceOptionalPath := strings.Join([]string{s.SidecarVolumeMount.MountPath, "optional-plugins/"}, "/")
 	sourceOptionalReporterPath := strings.Join([]string{s.SidecarVolumeMount.MountPath, "optional-reporter-plugins/"}, "/")
 	targetPath := strings.Join([]string{s.SidecarVolumeMount.MountPath, "plugins/"}, "/")
 
+	command := ""
+	optionalPlugin := ""
+	optinalReporterPlugins := ""
+
+	// chose the last matched SwAgent
+	if len(swAgentL) > 0 {
+		swAgent := swAgentL[len(swAgentL)-1]
+		log.Info(fmt.Sprintf("agent %s loaded.", swAgent.Name))
+		if len(swAgent.Spec.OptionalPlugins) > 0 {
+			optionalPlugin = strings.Join(swAgent.Spec.OptionalPlugins, "|")
+		}
+		if len(swAgent.Spec.OptionalReporterPlugins) > 0 {
+			optinalReporterPlugins = strings.Join(swAgent.Spec.OptionalReporterPlugins, "|")
+		}
+	}
+
 	for k, v := range *annotation {
-		command := ""
 		if strings.EqualFold(k, optionsAnnotation) {
-			command = "cd " + sourceOptionalPath + "&& ls | grep -E \"" + v + "\"  | xargs -i cp {} " + targetPath
+			optionalPlugin = v
 		} else if strings.EqualFold(k, optionsReporterAnnotation) {
-			command = "cd " + sourceOptionalReporterPath + "&& ls | grep -E \"" + v + "\"  | xargs -i cp {} " + targetPath
+			optinalReporterPlugins = v
 		}
 		if command != "" {
 			s.Initcontainer.Args[1] = strings.Join([]string{s.Initcontainer.Args[1], command}, " && ")
 		}
 	}
 
+	if len(optionalPlugin) > 0 {
+		command = "cd " + sourceOptionalPath + " && ls | grep -E \"" + optionalPlugin + "\"  | xargs -i cp {} " + targetPath
+		s.Initcontainer.Args[1] = strings.Join([]string{s.Initcontainer.Args[1], command}, " && ")
+	}
+
+	if len(optinalReporterPlugins) > 0 {
+		command = "cd " + sourceOptionalReporterPath + " && ls | grep -E \"" + optinalReporterPlugins + "\"  | xargs -i cp {} " + targetPath
+		s.Initcontainer.Args[1] = strings.Join([]string{s.Initcontainer.Args[1], command}, " && ")
+	}
+
 }
 
 // OverlayPlugins will add Plugins' config to JvmAgentStr without verification
@@ -375,9 +478,12 @@ func (s *SidecarInjectField) OverlayPlugins(annotation *map[string]string) {
 	}
 }
 
-// CreateConfigmap will create a configmap to set java agent config.
-func (s *SidecarInjectField) CreateConfigmap(ctx context.Context, kubeclient client.Client, namespace string,
+// ValidateConfigmap will validate a configmap(if exists) to set java agent config.
+func (s *SidecarInjectField) ValidateConfigmap(ctx context.Context, kubeclient client.Client, namespace string,
 	annotation *map[string]string) bool {
+	if len(s.ConfigmapVolume.Name) == 0 || len(s.ConfigmapVolume.ConfigMap.Name) == 0 {
+		return true
+	}
 	configmap := &corev1.ConfigMap{}
 	configmapName := s.ConfigmapVolume.VolumeSource.ConfigMap.LocalObjectReference.Name
 	// check whether the configmap is existed
@@ -395,39 +501,10 @@ func (s *SidecarInjectField) CreateConfigmap(ctx context.Context, kubeclient cli
 		}
 		log.Error(errinfo, "the configmap validate false", "configmapName", configmapName)
 	}
-	// if configmap not exist or validate false , get default configmap
-	defaultConfigmap := &corev1.ConfigMap{}
-	if err := kubeclient.Get(ctx, client.ObjectKey{Namespace: DefaultConfigmapNamespace,
-		Name: DefaultConfigmapName}, defaultConfigmap); err != nil {
-		log.Error(err, "can't get default configmap")
-		s.injectErrorAnnotation(annotation, fmt.Sprintf("get configmap %s from namespace %s error[%s]",
-			DefaultConfigmapName, DefaultConfigmapNamespace, err.Error()))
-		return false
-	}
-
-	// use default configmap's data to create new configmap and update namespace
-	injectConfigmap := corev1.ConfigMap{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      configmapName,
-			Namespace: namespace,
-		},
-		Data: defaultConfigmap.Data,
-	}
-
-	// create the configmap in user's namespace
-	if err := kubeclient.Create(ctx, &injectConfigmap); err != nil {
-		log.Error(err, "create configmap failed")
-		s.injectErrorAnnotation(annotation, fmt.Sprintf("create configmap %s in namespace %s error[%s]",
-			configmapName, namespace, err.Error()))
-		return false
-	}
 	return true
 }
 
 func GetInjectedAgentConfig(annotation *map[string]string, configuration *map[string]string) {
-	if strings.ToLower((*annotation)[sidecarAgentOverlayAnno]) != "true" {
-		return
-	}
 	for k, v := range *annotation {
 		if strings.HasPrefix(k, agentAnnotationPrefix) {
 			option := strings.TrimPrefix(k, agentAnnotationPrefix)
@@ -444,19 +521,3 @@ func GetInjectedAgentConfig(annotation *map[string]string, configuration *map[st
 		}
 	}
 }
-
-func GetServiceName(configuration *map[string]string) string {
-	v, ok := (*configuration)[ServiceName]
-	if !ok {
-		return ""
-	}
-	return v
-}
-
-func GetBackendService(configuration *map[string]string) string {
-	v, ok := (*configuration)[BackendService]
-	if !ok {
-		return ""
-	}
-	return v
-}
diff --git a/operator/pkg/operator/injector/webhook.go b/operator/pkg/operator/injector/webhook.go
index f04da0c..c7c050f 100644
--- a/operator/pkg/operator/injector/webhook.go
+++ b/operator/pkg/operator/injector/webhook.go
@@ -20,11 +20,14 @@ package injector
 import (
 	"context"
 	"net/http"
+	"strings"
 
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	logf "sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
+
+	"github.com/apache/skywalking-swck/operator/apis/operator/v1alpha1"
 )
 
 // log is for logging in this package.
@@ -44,8 +47,7 @@ type JavaagentInjector struct {
 func (r *JavaagentInjector) Handle(ctx context.Context, req admission.Request) admission.Response {
 	pod := &corev1.Pod{}
 
-	err := r.decoder.Decode(req, pod)
-	if err != nil {
+	if err := r.decoder.Decode(req, pod); err != nil {
 		return admission.Errored(http.StatusBadRequest, err)
 	}
 
@@ -53,6 +55,9 @@ func (r *JavaagentInjector) Handle(ctx context.Context, req admission.Request) a
 	if pod.Annotations == nil {
 		pod.Annotations = map[string]string{}
 	}
+
+	swAgentL := r.findMatchedSwAgentL(ctx, req, pod)
+
 	// initialize all annotation types that can be overridden
 	anno, err := NewAnnotations()
 	if err != nil {
@@ -63,11 +68,36 @@ func (r *JavaagentInjector) Handle(ctx context.Context, req admission.Request) a
 	// initialize SidecarInjectField and get injected strategy from annotations
 	s := NewSidecarInjectField()
 	// initialize InjectProcess as a call chain
-	ip := NewInjectProcess(ctx, s, anno, ao, pod, req, javaagentInjectorLog, r.Client)
+	ip := NewInjectProcess(ctx, s, anno, ao, swAgentL, pod, req, javaagentInjectorLog, r.Client)
 	// do real injection
 	return ip.Run()
 }
 
+func (r *JavaagentInjector) findMatchedSwAgentL(ctx context.Context, req admission.Request, pod *corev1.Pod) *v1alpha1.SwAgentList {
+	swAgentList := &v1alpha1.SwAgentList{}
+	if err := r.Client.List(ctx, swAgentList, client.InNamespace(req.Namespace)); err != nil {
+		javaagentInjectorLog.Error(err, "get SwAgent error")
+	}
+
+	// selector
+	var availableSwAgentL []v1alpha1.SwAgent
+	for _, swAgent := range swAgentList.Items {
+		isMatch := true
+		if len(swAgent.Spec.Selector) != 0 {
+			for k, v := range swAgent.Spec.Selector {
+				if !strings.EqualFold(v, pod.Labels[k]) {
+					isMatch = false
+				}
+			}
+		}
+		if isMatch {
+			availableSwAgentL = append(availableSwAgentL, swAgent)
+		}
+	}
+	swAgentList.Items = availableSwAgentL
+	return swAgentList
+}
+
 // Javaagent implements admission.DecoderInjector.
 // A decoder will be automatically injected.
 
diff --git a/operator/pkg/operator/manifests/injector/templates/annotations.yaml b/operator/pkg/operator/manifests/injector/templates/annotations.yaml
index 31a6777..d703bb2 100644
--- a/operator/pkg/operator/manifests/injector/templates/annotations.yaml
+++ b/operator/pkg/operator/manifests/injector/templates/annotations.yaml
@@ -70,17 +70,17 @@ annotations:
     envName: nil
 
   - name: sidecar.skywalking.apache.org/configmapVolume.ConfigMap.Name
-    defaultValue: skywalking-swck-java-agent-configmap
+    defaultValue:
     validateFunc: nil
     envName: nil
 
   - name: sidecar.skywalking.apache.org/configmapVolume.Name
-    defaultValue: java-agent-configmap-volume
+    defaultValue:
     validateFunc: nil
     envName: nil
 
   - name: sidecar.skywalking.apache.org/configmapVolumeMount.MountPath
-    defaultValue: /sky/agent/config
+    defaultValue:
     validateFunc: nil
     envName: nil
 
diff --git a/test/e2e/demo.yaml b/test/e2e/demo-swagent.yaml
similarity index 81%
copy from test/e2e/demo.yaml
copy to test/e2e/demo-swagent.yaml
index 0d7d0a4..ad643c6 100644
--- a/test/e2e/demo.yaml
+++ b/test/e2e/demo-swagent.yaml
@@ -27,11 +27,6 @@ spec:
       labels:
         swck-java-agent-injected: "true"
         app: demo
-      annotations:
-        strategy.skywalking.apache.org/agent.Overlay: "true"
-        sidecar.skywalking.apache.org/initcontainer.resources.limits: '{"memory": "100Mi","cpu": "100m"}'
-        sidecar.skywalking.apache.org/initcontainer.resources.requests: '{"memory": "100Mi","cpu": "100m"}'
-        agent.skywalking.apache.org/collector.backend_service: "oap-service:11800"
     spec:
       containers:
       - name: demo1
diff --git a/test/e2e/demo.yaml b/test/e2e/demo.yaml
index 0d7d0a4..52b82cb 100644
--- a/test/e2e/demo.yaml
+++ b/test/e2e/demo.yaml
@@ -28,7 +28,6 @@ spec:
         swck-java-agent-injected: "true"
         app: demo
       annotations:
-        strategy.skywalking.apache.org/agent.Overlay: "true"
         sidecar.skywalking.apache.org/initcontainer.resources.limits: '{"memory": "100Mi","cpu": "100m"}'
         sidecar.skywalking.apache.org/initcontainer.resources.requests: '{"memory": "100Mi","cpu": "100m"}'
         agent.skywalking.apache.org/collector.backend_service: "oap-service:11800"
diff --git a/test/e2e/oap-ui-swagent-configmap/e2e.yaml b/test/e2e/oap-ui-swagent-configmap/e2e.yaml
new file mode 100644
index 0000000..4489dfc
--- /dev/null
+++ b/test/e2e/oap-ui-swagent-configmap/e2e.yaml
@@ -0,0 +1,117 @@
+# 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.
+
+setup:
+  env: kind
+  file: ../kind.yaml
+  steps:
+    - name: prepare e2e.yaml
+      command: bash hack/prepare-e2e.sh
+    - name: install cert-manager
+      command: |
+        # kind k8s cluster is in $TMPDIR
+        export KUBECONFIG=${TMPDIR}/e2e-k8s.config
+        kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
+      wait:
+        - namespace: cert-manager
+          resource: pod
+          for: condition=Ready
+    - name: install operator
+      command: |
+        export OPERATOR_IMG=controller
+        make -C operator docker-build   
+        kind load docker-image controller
+        make -C operator install
+        make -C operator deploy
+      wait:
+        - namespace: skywalking-swck-system
+          resource: pod
+          for: condition=Ready
+    - name: setup oapserver and swagent cr
+      command: |
+        kubectl create namespace skywalking-system
+        kubectl apply -f test/e2e/skywalking-components-with-swagent-configmap.yaml
+      wait:
+        - namespace: skywalking-system
+          resource: OAPServer/skywalking-system
+          for: condition=Available
+        - namespace: skywalking-system
+          resource: UI/skywalking-system
+          for: condition=Available
+    - name: setup java agent demo
+      command: |
+        kubectl label namespace skywalking-system swck-injection=enabled
+        kubectl create -f test/e2e/demo-swagent.yaml
+      wait:
+        - namespace: skywalking-system
+          resource: deployment/demo
+          for: condition=Available
+  kind:
+    expose-ports:
+      - namespace: skywalking-system
+        resource: service/demo
+        port: 8085
+      - namespace: skywalking-system
+        resource: service/skywalking-system-oap
+        port: 12800
+      - namespace: skywalking-system
+        resource: service/skywalking-system-ui
+        port: 80
+  timeout: 20m
+
+cleanup:
+  # always never success failure
+  on: always
+
+trigger:
+  action: http
+  interval: 30s
+  times: 30
+  url: http://${service_demo_host}:${service_demo_8085}/hello
+  method: GET
+
+verify:
+  # verify with retry strategy
+  retry:
+    # max retry count
+    count: 10
+    # the interval between two attempts, e.g. 10s, 1m.
+    interval: 10s
+  cases:
+    # test oapserver
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql service ls
+      expected: ../verify/service.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name service_cpm --service-name Your_ApplicationName | yq e 'to_entries' -
+      expected: ../verify/metrics.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql endpoint list --keyword=hello --service-name Your_ApplicationName
+      expected: ../verify/endpoint.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name GET:/hello --service-name Your_ApplicationName | yq e 'to_entries' -
+      expected: ../verify/metrics.yaml
+    - query: 'kubectl get pods -l app=demo -o yaml | yq e ''.items[0].spec.volumes'''
+      expected: ../verify/swagent-configmap-volumemounts.yaml
+    - query: 'kubectl get pods -l app=demo -o yaml | yq e ''.items[0].spec.initContainers[0]'''
+      expected: ../verify/swagent-configmap-initcontainer.yaml
+    - query: 'kubectl get pods -l app=demo -o yaml | yq e ''.items[0].spec.containers[0]'''
+      expected: ../verify/swagent-configmap-target-container.yaml
+    - query: 'kubectl logs -l app=demo -n skywalking-system --tail=-1 | grep -Eo "AgentClassLoader.*webflux.*\.jar loaded" | grep -Eo "/sky/agent/plugins/.*webflux.*\.jar" | jq -R -s -c "split(\"\n\")[:-1]" |  yq e ''to_entries'''
+      expected: ../verify/optional-plugin.yaml
+    - query: 'kubectl logs -l app=demo -n skywalking-system --tail=-1 | grep -Eo "AgentClassLoader.*cloud-gateway-2\.1\.x.*\.jar loaded" | grep -Eo "/sky/agent/plugins/.*cloud-gateway-2\.1\.x.*\.jar" | jq -R -s -c "split(\"\n\")[:-1]" |  yq e ''to_entries'''
+      expected: ../verify/optional-plugin.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_ui_host}:${service_skywalking_system_ui_80}/graphql service ls
+      expected: ../verify/service.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_ui_host}:${service_skywalking_system_ui_80}/graphql endpoint list --keyword=hello --service-name Your_ApplicationName
+      expected: ../verify/endpoint.yaml
+    - includes:
+        - ../ui-cases.yaml
\ No newline at end of file
diff --git a/test/e2e/oap-ui-swagent/e2e.yaml b/test/e2e/oap-ui-swagent/e2e.yaml
new file mode 100644
index 0000000..b9a492f
--- /dev/null
+++ b/test/e2e/oap-ui-swagent/e2e.yaml
@@ -0,0 +1,117 @@
+# 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.
+
+setup:
+  env: kind
+  file: ../kind.yaml
+  steps:
+    - name: prepare e2e.yaml
+      command: bash hack/prepare-e2e.sh
+    - name: install cert-manager
+      command: |
+        # kind k8s cluster is in $TMPDIR
+        export KUBECONFIG=${TMPDIR}/e2e-k8s.config
+        kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
+      wait:
+        - namespace: cert-manager
+          resource: pod
+          for: condition=Ready
+    - name: install operator
+      command: |
+        export OPERATOR_IMG=controller
+        make -C operator docker-build   
+        kind load docker-image controller
+        make -C operator install
+        make -C operator deploy
+      wait:
+        - namespace: skywalking-swck-system
+          resource: pod
+          for: condition=Ready
+    - name: setup oapserver and swagent cr
+      command: |
+        kubectl create namespace skywalking-system
+        kubectl apply -f test/e2e/skywalking-components-with-swagent.yaml
+      wait:
+        - namespace: skywalking-system
+          resource: OAPServer/skywalking-system
+          for: condition=Available
+        - namespace: skywalking-system
+          resource: UI/skywalking-system
+          for: condition=Available
+    - name: setup java agent demo
+      command: |
+        kubectl label namespace skywalking-system swck-injection=enabled
+        kubectl create -f test/e2e/demo-swagent.yaml
+      wait:
+        - namespace: skywalking-system
+          resource: deployment/demo
+          for: condition=Available
+  kind:
+    expose-ports:
+      - namespace: skywalking-system
+        resource: service/demo
+        port: 8085
+      - namespace: skywalking-system
+        resource: service/skywalking-system-oap
+        port: 12800
+      - namespace: skywalking-system
+        resource: service/skywalking-system-ui
+        port: 80
+  timeout: 20m
+
+cleanup:
+  # always never success failure
+  on: always
+
+trigger:
+  action: http
+  interval: 30s
+  times: 30
+  url: http://${service_demo_host}:${service_demo_8085}/hello
+  method: GET
+
+verify:
+  # verify with retry strategy
+  retry:
+    # max retry count
+    count: 10
+    # the interval between two attempts, e.g. 10s, 1m.
+    interval: 10s
+  cases:
+    # test oapserver
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql service ls
+      expected: ../verify/service.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name service_cpm --service-name Your_ApplicationName | yq e 'to_entries' -
+      expected: ../verify/metrics.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql endpoint list --keyword=hello --service-name Your_ApplicationName
+      expected: ../verify/endpoint.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_oap_host}:${service_skywalking_system_oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name GET:/hello --service-name Your_ApplicationName | yq e 'to_entries' -
+      expected: ../verify/metrics.yaml
+    - query: 'kubectl get pods -l app=demo -o yaml | yq e ''.items[0].spec.volumes'''
+      expected: ../verify/swagent-volumemount.yaml
+    - query: 'kubectl get pods -l app=demo -o yaml | yq e ''.items[0].spec.initContainers[0]'''
+      expected: ../verify/swagent-initcontainer.yaml
+    - query: 'kubectl get pods -l app=demo -o yaml | yq e ''.items[0].spec.containers[0]'''
+      expected: ../verify/swagent-target-container.yaml
+    - query: 'kubectl logs -l app=demo -n skywalking-system --tail=-1 | grep -Eo "AgentClassLoader.*webflux.*\.jar loaded" | grep -Eo "/sky/agent/plugins/.*webflux.*\.jar" | jq -R -s -c "split(\"\n\")[:-1]" |  yq e ''to_entries'''
+      expected: ../verify/optional-plugin.yaml
+    - query: 'kubectl logs -l app=demo -n skywalking-system --tail=-1 | grep -Eo "AgentClassLoader.*cloud-gateway-2\.1\.x.*\.jar loaded" | grep -Eo "/sky/agent/plugins/.*cloud-gateway-2\.1\.x.*\.jar" | jq -R -s -c "split(\"\n\")[:-1]" |  yq e ''to_entries'''
+      expected: ../verify/optional-plugin.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_ui_host}:${service_skywalking_system_ui_80}/graphql service ls
+      expected: ../verify/service.yaml
+    - query: swctl --display yaml --base-url=http://${service_skywalking_system_ui_host}:${service_skywalking_system_ui_80}/graphql endpoint list --keyword=hello --service-name Your_ApplicationName
+      expected: ../verify/endpoint.yaml
+    - includes:
+        - ../ui-cases.yaml
\ No newline at end of file
diff --git a/test/e2e/resource.yaml b/test/e2e/resource.yaml
index 9425256..07b69ad 100644
--- a/test/e2e/resource.yaml
+++ b/test/e2e/resource.yaml
@@ -35,7 +35,6 @@ spec:
         swck-java-agent-injected: "true"
         app: songs
       annotations:
-        strategy.skywalking.apache.org/agent.Overlay: "true"
         agent.skywalking.apache.org/agent.service_name: "agent::songs"
         agent.skywalking.apache.org/collector.backend_service: "oap-service:11800"
         agent.skywalking.apache.org/agent.instance_name: "songs"
diff --git a/test/e2e/skywalking-components-with-swagent-configmap.yaml b/test/e2e/skywalking-components-with-swagent-configmap.yaml
new file mode 100644
index 0000000..8d43ede
--- /dev/null
+++ b/test/e2e/skywalking-components-with-swagent-configmap.yaml
@@ -0,0 +1,93 @@
+# 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: operator.skywalking.apache.org/v1alpha1
+kind: OAPServer
+metadata:
+  name: skywalking-system
+  namespace: skywalking-system
+spec:
+  version: 8.8.1
+  instances: 1
+  image: ghcr.io/apache/skywalking/oap:46ae1cfe1ea137577a6d191f4bda39ea82feb2ac
+  service:
+    template:
+      type: ClusterIP
+
+---
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: UI
+metadata:
+  name: skywalking-system
+  namespace: skywalking-system
+spec:
+  version: 8.8.1
+  instances: 1
+  image: ghcr.io/apache/skywalking/ui:46ae1cfe1ea137577a6d191f4bda39ea82feb2ac
+  OAPServerAddress: http://skywalking-system-oap.skywalking-system:12800
+  service:
+    template:
+      type: ClusterIP
+    ingress:
+      host: demo.ui.skywalking
+
+---
+
+apiVersion: v1
+data:
+  agent.config: |-
+    # The service name in UI
+    agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
+
+    # Backend service addresses.
+    collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:oap:11800}
+
+    logging.level=debug
+    logging.output=CONSOLE
+
+    # Please refer to https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/configurations/#table-of-agent-configuration-properties to get more details.
+kind: ConfigMap
+metadata:
+  name: java-agent-config
+  namespace: skywalking-system
+
+
+---
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: SwAgent
+metadata:
+  name: swagent-001
+  namespace: skywalking-system
+spec:
+  containerMatcher: ''
+  selector:
+  javaSidecar:
+    name: swagent-001
+    image: ghcr.io/apache/skywalking-java/skywalking-java:438d2954232ee7b996ca0a7d961eddcd2da0c5e6-java8
+    env:
+      - name: "SW_LOGGING_LEVEL"
+        value: "DEBUG"
+      - name: "SW_AGENT_COLLECTOR_BACKEND_SERVICES"
+        value: "skywalking-system-oap.skywalking-system.svc:11800"
+  sharedVolumeName: "sky-agent-test-001"
+  swConfigMapVolume:
+    name: "java-agent-configmap-test-001-volume"
+    configMapName: "java-agent-config"
+    configMapMountFile: "agent.config"
+  optionalPlugins:
+    - "webflux"
+    - "cloud-gateway-2.1.x"
\ No newline at end of file
diff --git a/test/e2e/skywalking-components-with-swagent.yaml b/test/e2e/skywalking-components-with-swagent.yaml
new file mode 100644
index 0000000..f0840ee
--- /dev/null
+++ b/test/e2e/skywalking-components-with-swagent.yaml
@@ -0,0 +1,90 @@
+# 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: operator.skywalking.apache.org/v1alpha1
+kind: OAPServer
+metadata:
+  name: skywalking-system
+  namespace: skywalking-system
+spec:
+  version: 8.8.1
+  instances: 1
+  image: ghcr.io/apache/skywalking/oap:46ae1cfe1ea137577a6d191f4bda39ea82feb2ac
+  service:
+    template:
+      type: ClusterIP
+
+---
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: UI
+metadata:
+  name: skywalking-system
+  namespace: skywalking-system
+spec:
+  version: 8.8.1
+  instances: 1
+  image: ghcr.io/apache/skywalking/ui:46ae1cfe1ea137577a6d191f4bda39ea82feb2ac
+  OAPServerAddress: http://skywalking-system-oap.skywalking-system:12800
+  service:
+    template:
+      type: ClusterIP
+    ingress:
+      host: demo.ui.skywalking
+
+---
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: SwAgent
+metadata:
+  name: swagent-001
+  namespace: skywalking-system
+spec:
+  containerMatcher: ''
+  selector:
+  javaSidecar:
+    name: swagent-001
+    image: ghcr.io/apache/skywalking-java/skywalking-java:f8deb7c30b931aae83ac1f438ce72b3f74414ae5-java8
+    env:
+      - name: "SW_LOGGING_LEVEL"
+        value: "DEBUG"
+      - name: "SW_AGENT_COLLECTOR_BACKEND_SERVICES"
+        value: "skywalking-system-oap:11800"
+  sharedVolumeName: "sky-agent-test-001"
+  optionalPlugins:
+    - "webflux"
+    - "cloud-gateway-2.1.x"
+
+---
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: SwAgent
+metadata:
+  name: swagent-002
+  namespace: skywalking-system
+spec:
+  containerMatcher: ''
+  selector:
+  javaSidecar:
+    name: swagent-002
+    image: ghcr.io/apache/skywalking-java/skywalking-java:438d2954232ee7b996ca0a7d961eddcd2da0c5e6-java8
+    env:
+      - name: "SW_LOGGING_LEVEL"
+        value: "DEBUG"
+      - name: "SW_AGENT_COLLECTOR_BACKEND_SERVICES"
+        value: "skywalking-system-oap:11800"
+  sharedVolumeName: "sky-agent-test-002"
+  optionalPlugins:
+    - "webflux"
+    - "cloud-gateway-2.1.x"
\ No newline at end of file
diff --git a/test/e2e/verify/optional-plugin.yaml b/test/e2e/verify/optional-plugin.yaml
new file mode 100644
index 0000000..d23ccee
--- /dev/null
+++ b/test/e2e/verify/optional-plugin.yaml
@@ -0,0 +1,19 @@
+# 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.
+
+{{- contains . }}
+- key: {{ ge .key 0 }}
+  value: {{ notEmpty .value }}
+{{- end }}
\ No newline at end of file
diff --git a/test/e2e/verify/swagent-configmap-initcontainer.yaml b/test/e2e/verify/swagent-configmap-initcontainer.yaml
new file mode 100644
index 0000000..72351bc
--- /dev/null
+++ b/test/e2e/verify/swagent-configmap-initcontainer.yaml
@@ -0,0 +1,24 @@
+# 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.
+
+{{- contains .}}
+- image: apache/skywalking-java-agent:8.9.0-java8
+  name: swagent-001
+  volumeMounts:
+    - montPath: /sky/agent
+      name: sky-agent-test-001
+    - mountPath: /sky/agent/config
+      name: java-agent-configmap-test-001-volume
+{{- end}}
\ No newline at end of file
diff --git a/test/e2e/verify/swagent-configmap-target-container.yaml b/test/e2e/verify/swagent-configmap-target-container.yaml
new file mode 100644
index 0000000..06c4885
--- /dev/null
+++ b/test/e2e/verify/swagent-configmap-target-container.yaml
@@ -0,0 +1,25 @@
+# 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.
+
+{{- contains .}}
+env:
+  - name: JAVA_TOOL_OPTIONS
+    value: -javaagent:/sky/agent/skywalking-agent.jar
+  - name: SW_LOGGING_LEVEL
+    value: "DEBUG"
+volumeMounts:
+  - mountPath: /sky/agent
+    name: sky-agent-test-001
+{{- end}}
diff --git a/test/e2e/verify/swagent-configmap-volumemounts.yaml b/test/e2e/verify/swagent-configmap-volumemounts.yaml
new file mode 100644
index 0000000..5a2a262
--- /dev/null
+++ b/test/e2e/verify/swagent-configmap-volumemounts.yaml
@@ -0,0 +1,20 @@
+# 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.
+
+{{- contains .}}
+volumeMounts:
+  - mountPath: /sky/agent/config
+    name: java-agent-configmap-test-001-volume
+{{- end}}
diff --git a/test/e2e/verify/swagent-initcontainer.yaml b/test/e2e/verify/swagent-initcontainer.yaml
new file mode 100644
index 0000000..e320393
--- /dev/null
+++ b/test/e2e/verify/swagent-initcontainer.yaml
@@ -0,0 +1,22 @@
+# 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.
+
+{{- contains .}}
+- image: apache/skywalking-java-agent:8.9.0-java8
+  name: swagent-002
+  volumeMounts:
+    - montPath: /sky/agent
+      name: sky-agent-test-002
+{{- end}}
\ No newline at end of file
diff --git a/test/e2e/verify/swagent-target-container.yaml b/test/e2e/verify/swagent-target-container.yaml
new file mode 100644
index 0000000..a491351
--- /dev/null
+++ b/test/e2e/verify/swagent-target-container.yaml
@@ -0,0 +1,25 @@
+# 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.
+
+{{- contains .}}
+env:
+  - name: JAVA_TOOL_OPTIONS
+    value: -javaagent:/sky/agent/skywalking-agent.jar
+  - name: SW_LOGGING_LEVEL
+    value: "DEBUG"
+volumeMounts:
+  - mountPath: /sky/agent
+    name: sky-agent-test-002
+{{- end}}
diff --git a/test/e2e/verify/swagent-volumemount.yaml b/test/e2e/verify/swagent-volumemount.yaml
new file mode 100644
index 0000000..50c12cf
--- /dev/null
+++ b/test/e2e/verify/swagent-volumemount.yaml
@@ -0,0 +1,19 @@
+# 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.
+
+{{- contains .}}
+- emptyDir: {}
+  name: sky-agent-test-002
+{{- end}}
\ No newline at end of file