Repository: knative-sandbox/eventing-kafka-broker
Pull request #2635 (2022-09-09 14:01:11)

Add data plane config CM name to namespaced reconcilers
It was missing.

Signed-off-by: Pierangelo Di Pilato <pierdipi@redhat.com>

pierDipi: /assign @aliok 
knative-prow[bot]: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative-sandbox/eventing-kafka-broker/pull/2635#" title="Author self-approved">pierDipi</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative-sandbox%2Feventing-kafka-broker).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/knative-sandbox/eventing-kafka-broker/blob/main/OWNERS)~~ [pierDipi]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
codecov[bot]: # [Codecov](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) Report
> Merging [#2635](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) (895503d) into [main](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/commit/e0decf21100bfb9184010ff7596728cf04579df1?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) (e0decf2) will **decrease** coverage by `6.25%`.
> The diff coverage is `33.33%`.

```diff
@@             Coverage Diff              @@
##               main    #2635      +/-   ##
============================================
- Coverage     62.04%   55.79%   -6.26%     
============================================
  Files           147       75      -72     
  Lines         10318     7820    -2498     
  Branches        229        0     -229     
============================================
- Hits           6402     4363    -2039     
+ Misses         3468     3142     -326     
+ Partials        448      315     -133     
```

| Flag | Coverage Δ | |
|---|---|---|
| java-unittests | `?` | |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) | Coverage Δ | |
|---|---|---|
| [...l-plane/pkg/reconciler/broker/namespaced\_broker.go](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-Y29udHJvbC1wbGFuZS9wa2cvcmVjb25jaWxlci9icm9rZXIvbmFtZXNwYWNlZF9icm9rZXIuZ28=) | `0.00% <0.00%> (ø)` | |
| [...ane/pkg/reconciler/broker/namespaced\_controller.go](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-Y29udHJvbC1wbGFuZS9wa2cvcmVjb25jaWxlci9icm9rZXIvbmFtZXNwYWNlZF9jb250cm9sbGVyLmdv) | `0.00% <0.00%> (ø)` | |
| [...ne/pkg/reconciler/trigger/namespaced\_controller.go](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-Y29udHJvbC1wbGFuZS9wa2cvcmVjb25jaWxlci90cmlnZ2VyL25hbWVzcGFjZWRfY29udHJvbGxlci5nbw==) | `86.56% <100.00%> (+0.20%)` | :arrow_up: |
| [...enting/kafka/broker/core/OrderedAsyncExecutor.java](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-ZGF0YS1wbGFuZS9jb3JlL3NyYy9tYWluL2phdmEvZGV2L2tuYXRpdmUvZXZlbnRpbmcva2Fma2EvYnJva2VyL2NvcmUvT3JkZXJlZEFzeW5jRXhlY3V0b3IuamF2YQ==) | | |
| [...atcher/impl/filter/subscriptionsapi/AnyFilter.java](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-ZGF0YS1wbGFuZS9kaXNwYXRjaGVyL3NyYy9tYWluL2phdmEvZGV2L2tuYXRpdmUvZXZlbnRpbmcva2Fma2EvYnJva2VyL2Rpc3BhdGNoZXIvaW1wbC9maWx0ZXIvc3Vic2NyaXB0aW9uc2FwaS9BbnlGaWx0ZXIuamF2YQ==) | | |
| [...ting/kafka/broker/core/utils/ReferenceCounter.java](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-ZGF0YS1wbGFuZS9jb3JlL3NyYy9tYWluL2phdmEvZGV2L2tuYXRpdmUvZXZlbnRpbmcva2Fma2EvYnJva2VyL2NvcmUvdXRpbHMvUmVmZXJlbmNlQ291bnRlci5qYXZh) | | |
| [...ting/kafka/broker/dispatcher/CloudEventSender.java](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-ZGF0YS1wbGFuZS9kaXNwYXRjaGVyL3NyYy9tYWluL2phdmEvZGV2L2tuYXRpdmUvZXZlbnRpbmcva2Fma2EvYnJva2VyL2Rpc3BhdGNoZXIvQ2xvdWRFdmVudFNlbmRlci5qYXZh) | | |
| [...er/dispatcher/impl/consumer/InvalidCloudEvent.java](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-ZGF0YS1wbGFuZS9kaXNwYXRjaGVyL3NyYy9tYWluL2phdmEvZGV2L2tuYXRpdmUvZXZlbnRpbmcva2Fma2EvYnJva2VyL2Rpc3BhdGNoZXIvaW1wbC9jb25zdW1lci9JbnZhbGlkQ2xvdWRFdmVudC5qYXZh) | | |
| [...ve/eventing/kafka/broker/dispatcher/main/Main.java](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-ZGF0YS1wbGFuZS9kaXNwYXRjaGVyL3NyYy9tYWluL2phdmEvZGV2L2tuYXRpdmUvZXZlbnRpbmcva2Fma2EvYnJva2VyL2Rpc3BhdGNoZXIvbWFpbi9NYWluLmphdmE=) | | |
| [...atcher/impl/filter/subscriptionsapi/NotFilter.java](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox#diff-ZGF0YS1wbGFuZS9kaXNwYXRjaGVyL3NyYy9tYWluL2phdmEvZGV2L2tuYXRpdmUvZXZlbnRpbmcva2Fma2EvYnJva2VyL2Rpc3BhdGNoZXIvaW1wbC9maWx0ZXIvc3Vic2NyaXB0aW9uc2FwaS9Ob3RGaWx0ZXIuamF2YQ==) | | |
| ... and [65 more](https://codecov.io/gh/knative-sandbox/eventing-kafka-broker/pull/2635/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) | |

Help us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox)

knative-prow[bot]: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative-sandbox/eventing-kafka-broker/pull/2635#pullrequestreview-1102392230" title="Approved">aliok</a>*, *<a href="https://github.com/knative-sandbox/eventing-kafka-broker/pull/2635#" title="Author self-approved">pierDipi</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative-sandbox%2Feventing-kafka-broker).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/knative-sandbox/eventing-kafka-broker/blob/main/OWNERS)~~ [aliok,pierDipi]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
knative-prow[bot]: @pierDipi: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
channel-reconciler-tests-ssl_eventing-kafka-broker_main | 895503d13d13980b7785eb4132cf8280a3ea0681 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka-broker/2635/channel-reconciler-tests-ssl_eventing-kafka-broker_main/1568238093767544832) | true | `/test channel-reconciler-tests-ssl_eventing-kafka-broker_main`

[Your PR dashboard](https://prow.knative.dev/pr).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
knative-prow[bot]: @pierDipi: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
channel-reconciler-tests-ssl_eventing-kafka-broker_main | 895503d13d13980b7785eb4132cf8280a3ea0681 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka-broker/2635/channel-reconciler-tests-ssl_eventing-kafka-broker_main/1568238093767544832) | true | `/test channel-reconciler-tests-ssl_eventing-kafka-broker_main`
channel-integration-tests-ssl_eventing-kafka-broker_main | 895503d13d13980b7785eb4132cf8280a3ea0681 | [link](https://prow.knative.dev/view/gs/knative-prow/pr-logs/pull/knative-sandbox_eventing-kafka-broker/2635/channel-integration-tests-ssl_eventing-kafka-broker_main/1568238093541052416) | true | `/test channel-integration-tests-ssl_eventing-kafka-broker_main`

[Your PR dashboard](https://prow.knative.dev/pr).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->

Patch:
diff --git a/control-plane/pkg/keda/keda.go b/control-plane/pkg/keda/keda.go
index 5acdcde44..7397e6adb 100644
--- a/control-plane/pkg/keda/keda.go
+++ b/control-plane/pkg/keda/keda.go
@@ -204,3 +204,25 @@ func addAuthSecretTargetRef(parameter string, secretKeyRef v1beta1.SecretValueFr
 	secretTargetRefs = append(secretTargetRefs, ref)
 	return secretTargetRefs
 }
+
+func SetAutoscalingAnnotations(objannotations map[string]string) map[string]string {
+	if objannotations != nil {
+		cgannotations := map[string]string{}
+		setAnnotation(objannotations, keda.AutoscalingClassAnnotation, cgannotations)
+		setAnnotation(objannotations, keda.AutoscalingMinScaleAnnotation, cgannotations)
+		setAnnotation(objannotations, keda.AutoscalingMaxScaleAnnotation, cgannotations)
+		setAnnotation(objannotations, keda.KedaAutoscalingPollingIntervalAnnotation, cgannotations)
+		setAnnotation(objannotations, keda.KedaAutoscalingCooldownPeriodAnnotation, cgannotations)
+		setAnnotation(objannotations, keda.KedaAutoscalingKafkaLagThreshold, cgannotations)
+		return cgannotations
+	}
+	return nil
+}
+
+func setAnnotation(objannotations map[string]string, key string, cgannotations map[string]string) {
+	value, ok := objannotations[key]
+	if !ok || value == "" {
+		return
+	}
+	cgannotations[key] = value
+}
diff --git a/control-plane/pkg/reconciler/broker/broker.go b/control-plane/pkg/reconciler/broker/broker.go
index 64b0a3b75..bac36b5aa 100644
--- a/control-plane/pkg/reconciler/broker/broker.go
+++ b/control-plane/pkg/reconciler/broker/broker.go
@@ -70,7 +70,7 @@ func NewCounter() *Counter {
 	}
 }
 
-func (c Counter) Inc(brokerUUID string) int {
+func (c *Counter) Inc(brokerUUID string) int {
 	c.counterLock.Lock()
 	defer c.counterLock.Unlock()
 	c.counterMap[brokerUUID]++
@@ -78,7 +78,7 @@ func (c Counter) Inc(brokerUUID string) int {
 	return c.counterMap[brokerUUID]
 }
 
-func (c Counter) Del(brokerUUID string) {
+func (c *Counter) Del(brokerUUID string) {
 	c.counterLock.Lock()
 	defer c.counterLock.Unlock()
 	delete(c.counterMap, brokerUUID)
diff --git a/control-plane/pkg/reconciler/broker/namespaced_broker.go b/control-plane/pkg/reconciler/broker/namespaced_broker.go
index 6b3db178d..cfc8f8dd7 100644
--- a/control-plane/pkg/reconciler/broker/namespaced_broker.go
+++ b/control-plane/pkg/reconciler/broker/namespaced_broker.go
@@ -110,15 +110,16 @@ func (r *NamespacedReconciler) createReconcilerForBrokerInstance(broker *eventin
 
 	return &Reconciler{
 		Reconciler: &base.Reconciler{
-			KubeClient:              r.Reconciler.KubeClient,
-			PodLister:               r.Reconciler.PodLister,
-			SecretLister:            r.Reconciler.SecretLister,
-			SecretTracker:           r.Reconciler.SecretTracker,
-			ConfigMapTracker:        r.Reconciler.ConfigMapTracker,
-			ContractConfigMapName:   r.Reconciler.ContractConfigMapName,
-			ContractConfigMapFormat: r.Reconciler.ContractConfigMapFormat,
-			DispatcherLabel:         r.Reconciler.DispatcherLabel,
-			ReceiverLabel:           r.Reconciler.ReceiverLabel,
+			KubeClient:                   r.Reconciler.KubeClient,
+			PodLister:                    r.Reconciler.PodLister,
+			SecretLister:                 r.Reconciler.SecretLister,
+			SecretTracker:                r.Reconciler.SecretTracker,
+			ConfigMapTracker:             r.Reconciler.ConfigMapTracker,
+			DataPlaneConfigConfigMapName: r.Reconciler.DataPlaneConfigConfigMapName,
+			ContractConfigMapName:        r.Reconciler.ContractConfigMapName,
+			ContractConfigMapFormat:      r.Reconciler.ContractConfigMapFormat,
+			DispatcherLabel:              r.Reconciler.DispatcherLabel,
+			ReceiverLabel:                r.Reconciler.ReceiverLabel,
 
 			DataPlaneNamespace:          broker.Namespace,
 			DataPlaneConfigMapNamespace: broker.Namespace,
@@ -134,6 +135,7 @@ func (r *NamespacedReconciler) createReconcilerForBrokerInstance(broker *eventin
 		NewKafkaClusterAdminClient: r.NewKafkaClusterAdminClient,
 		BootstrapServers:           r.BootstrapServers,
 		Prober:                     r.Prober,
+		Counter:                    NewCounter(),
 	}
 }
 
diff --git a/control-plane/pkg/reconciler/broker/namespaced_controller.go b/control-plane/pkg/reconciler/broker/namespaced_controller.go
index 214e8ba46..2f1b2356f 100644
--- a/control-plane/pkg/reconciler/broker/namespaced_controller.go
+++ b/control-plane/pkg/reconciler/broker/namespaced_controller.go
@@ -71,15 +71,16 @@ func NewNamespacedController(ctx context.Context, watcher configmap.Watcher, env
 
 	reconciler := &NamespacedReconciler{
 		Reconciler: &base.Reconciler{
-			KubeClient:                  kubeclient.Get(ctx),
-			PodLister:                   podinformer.Get(ctx).Lister(),
-			SecretLister:                secretinformer.Get(ctx).Lister(),
-			DataPlaneConfigMapNamespace: env.DataPlaneConfigMapNamespace,
-			ContractConfigMapName:       env.ContractConfigMapName,
-			ContractConfigMapFormat:     env.ContractConfigMapFormat,
-			DataPlaneNamespace:          env.SystemNamespace,
-			DispatcherLabel:             base.BrokerDispatcherLabel,
-			ReceiverLabel:               base.BrokerReceiverLabel,
+			KubeClient:                   kubeclient.Get(ctx),
+			PodLister:                    podinformer.Get(ctx).Lister(),
+			SecretLister:                 secretinformer.Get(ctx).Lister(),
+			DataPlaneConfigConfigMapName: env.DataPlaneConfigConfigMapName,
+			DataPlaneConfigMapNamespace:  env.DataPlaneConfigMapNamespace,
+			ContractConfigMapName:        env.ContractConfigMapName,
+			ContractConfigMapFormat:      env.ContractConfigMapFormat,
+			DataPlaneNamespace:           env.SystemNamespace,
+			DispatcherLabel:              base.BrokerDispatcherLabel,
+			ReceiverLabel:                base.BrokerReceiverLabel,
 		},
 		NewKafkaClusterAdminClient: sarama.NewClusterAdmin,
 		ConfigMapLister:            configmapInformer.Lister(),
diff --git a/control-plane/pkg/reconciler/source/controller.go b/control-plane/pkg/reconciler/source/controller.go
index 39558b676..f1fbe98fd 100644
--- a/control-plane/pkg/reconciler/source/controller.go
+++ b/control-plane/pkg/reconciler/source/controller.go
@@ -30,6 +30,7 @@ import (
 	kafkainformer "knative.dev/eventing-kafka/pkg/client/injection/informers/sources/v1beta1/kafkasource"
 	"knative.dev/eventing-kafka/pkg/client/injection/reconciler/sources/v1beta1/kafkasource"
 
+	kedaclient "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client"
 	"knative.dev/eventing-kafka-broker/control-plane/pkg/reconciler/consumergroup"
 )
 
@@ -43,6 +44,7 @@ func NewController(ctx context.Context) *controller.Impl {
 	r := &Reconciler{
 		ConsumerGroupLister: consumerGroupInformer.Lister(),
 		InternalsClient:     consumergroupclient.Get(ctx),
+		KedaClient:          kedaclient.Get(ctx),
 	}
 
 	impl := kafkasource.NewImpl(ctx, r)
diff --git a/control-plane/pkg/reconciler/source/source.go b/control-plane/pkg/reconciler/source/source.go
index c3536ce35..67920d9bf 100644
--- a/control-plane/pkg/reconciler/source/source.go
+++ b/control-plane/pkg/reconciler/source/source.go
@@ -37,6 +37,9 @@ import (
 	internalscg "knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing/v1alpha1"
 	internalsclient "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/clientset/versioned"
 	internalslst "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/listers/eventing/v1alpha1"
+
+	kedaclientset "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned"
+	kedafunc "knative.dev/eventing-kafka-broker/control-plane/pkg/keda"
 )
 
 const (
@@ -55,6 +58,7 @@ var (
 type Reconciler struct {
 	ConsumerGroupLister internalslst.ConsumerGroupLister
 	InternalsClient     internalsclient.Interface
+	KedaClient          kedaclientset.Interface
 }
 
 func (r *Reconciler) ReconcileKind(ctx context.Context, ks *sources.KafkaSource) reconciler.Event {
@@ -135,7 +139,6 @@ func (r Reconciler) reconcileConsumerGroup(ctx context.Context, ks *sources.Kafk
 					Reply:      &internalscg.ReplyStrategy{NoReply: &internalscg.NoReply{Enabled: true}},
 				},
 			},
-			Replicas: ks.Spec.Consumers,
 		},
 	}
 
@@ -144,15 +147,20 @@ func (r Reconciler) reconcileConsumerGroup(ctx context.Context, ks *sources.Kafk
 			Extensions: ks.Spec.CloudEventOverrides.Extensions,
 		}
 	}
+
 	if kt, ok := ks.Labels[sources.KafkaKeyTypeLabel]; ok && len(kt) > 0 {
 		expectedCg.Spec.Template.Spec.Configs.KeyType = &kt
 	}
 
+	// TODO: make keda annotation values configurable and maybe unexposed
+	expectedCg.Annotations = kedafunc.SetAutoscalingAnnotations(ks.Annotations)
+
 	cg, err := r.ConsumerGroupLister.ConsumerGroups(ks.GetNamespace()).Get(string(ks.UID)) //Get by consumer group id
 	if err != nil && !apierrors.IsNotFound(err) {
 		return nil, err
 	}
 	if apierrors.IsNotFound(err) {
+		expectedCg.Spec.Replicas = ks.Spec.Consumers
 		cg, err := r.InternalsClient.InternalV1alpha1().ConsumerGroups(expectedCg.GetNamespace()).Create(ctx, expectedCg, metav1.CreateOptions{})
 		if err != nil && !apierrors.IsAlreadyExists(err) {
 			return nil, fmt.Errorf("failed to create consumer group %s/%s: %w", expectedCg.GetNamespace(), expectedCg.GetName(), err)
@@ -160,7 +168,7 @@ func (r Reconciler) reconcileConsumerGroup(ctx context.Context, ks *sources.Kafk
 		return cg, nil
 	}
 
-	if equality.Semantic.DeepDerivative(expectedCg.Spec, cg.Spec) {
+	if equality.Semantic.DeepDerivative(expectedCg.Spec, cg.Spec) && equality.Semantic.DeepDerivative(expectedCg.Annotations, cg.Annotations) {
 		return cg, nil
 	}
 
@@ -170,6 +178,19 @@ func (r Reconciler) reconcileConsumerGroup(ctx context.Context, ks *sources.Kafk
 		Spec:       expectedCg.Spec,
 		Status:     cg.Status,
 	}
+	newCg.Annotations = expectedCg.Annotations
+
+	// If KEDA is not enabled, then we must update the ConsumerGroup replicas to match KafkaSource consumers
+	// TODO: code below failing unit tests with err: "panic: interface conversion: testing.ActionImpl is not testing.GetAction: missing method GetName"
+	/*if err := discovery.ServerSupportsVersion(r.KubeClient.Discovery(), keda.KedaSchemeGroupVersion); err != nil {
+		newCg.Spec.Replicas = ks.Spec.Consumers
+	}*/
+
+	_, err = r.KedaClient.KedaV1alpha1().ScaledObjects(cg.GetNamespace()).List(ctx, metav1.ListOptions{})
+	if err != nil && apierrors.IsNotFound(err) {
+		newCg.Spec.Replicas = ks.Spec.Consumers
+	}
+
 	if cg, err = r.InternalsClient.InternalV1alpha1().ConsumerGroups(cg.GetNamespace()).Update(ctx, newCg, metav1.UpdateOptions{}); err != nil {
 		return nil, fmt.Errorf("failed to update consumer group %s/%s: %w", newCg.GetNamespace(), newCg.GetName(), err)
 	}
diff --git a/control-plane/pkg/reconciler/trigger/namespaced_controller.go b/control-plane/pkg/reconciler/trigger/namespaced_controller.go
index 09870d026..0b4d7cc09 100644
--- a/control-plane/pkg/reconciler/trigger/namespaced_controller.go
+++ b/control-plane/pkg/reconciler/trigger/namespaced_controller.go
@@ -57,15 +57,16 @@ func NewNamespacedController(ctx context.Context, watcher configmap.Watcher, con
 
 	reconciler := &NamespacedReconciler{
 		Reconciler: &base.Reconciler{
-			KubeClient:                  kubeclient.Get(ctx),
-			PodLister:                   podinformer.Get(ctx).Lister(),
-			SecretLister:                secretinformer.Get(ctx).Lister(),
-			DataPlaneConfigMapNamespace: configs.DataPlaneConfigMapNamespace,
-			ContractConfigMapName:       configs.ContractConfigMapName,
-			ContractConfigMapFormat:     configs.ContractConfigMapFormat,
-			DataPlaneNamespace:          configs.SystemNamespace,
-			DispatcherLabel:             base.BrokerDispatcherLabel,
-			ReceiverLabel:               base.BrokerReceiverLabel,
+			KubeClient:                   kubeclient.Get(ctx),
+			PodLister:                    podinformer.Get(ctx).Lister(),
+			SecretLister:                 secretinformer.Get(ctx).Lister(),
+			DataPlaneConfigConfigMapName: configs.DataPlaneConfigConfigMapName,
+			DataPlaneConfigMapNamespace:  configs.DataPlaneConfigMapNamespace,
+			ContractConfigMapName:        configs.ContractConfigMapName,
+			ContractConfigMapFormat:      configs.ContractConfigMapFormat,
+			DataPlaneNamespace:           configs.SystemNamespace,
+			DispatcherLabel:              base.BrokerDispatcherLabel,
+			ReceiverLabel:                base.BrokerReceiverLabel,
 		},
 		FlagsHolder: &FlagsHolder{
 			Flags: feature.Flags{},
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/clientset.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/clientset.go
new file mode 100644
index 000000000..9d951e88c
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/clientset.go
@@ -0,0 +1,121 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package versioned
+
+import (
+	"fmt"
+	"net/http"
+
+	discovery "k8s.io/client-go/discovery"
+	rest "k8s.io/client-go/rest"
+	flowcontrol "k8s.io/client-go/util/flowcontrol"
+	kedav1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1"
+)
+
+type Interface interface {
+	Discovery() discovery.DiscoveryInterface
+	KedaV1alpha1() kedav1alpha1.KedaV1alpha1Interface
+}
+
+// Clientset contains the clients for groups. Each group has exactly one
+// version included in a Clientset.
+type Clientset struct {
+	*discovery.DiscoveryClient
+	kedaV1alpha1 *kedav1alpha1.KedaV1alpha1Client
+}
+
+// KedaV1alpha1 retrieves the KedaV1alpha1Client
+func (c *Clientset) KedaV1alpha1() kedav1alpha1.KedaV1alpha1Interface {
+	return c.kedaV1alpha1
+}
+
+// Discovery retrieves the DiscoveryClient
+func (c *Clientset) Discovery() discovery.DiscoveryInterface {
+	if c == nil {
+		return nil
+	}
+	return c.DiscoveryClient
+}
+
+// NewForConfig creates a new Clientset for the given config.
+// If config's RateLimiter is not set and QPS and Burst are acceptable,
+// NewForConfig will generate a rate-limiter in configShallowCopy.
+// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient),
+// where httpClient was generated with rest.HTTPClientFor(c).
+func NewForConfig(c *rest.Config) (*Clientset, error) {
+	configShallowCopy := *c
+
+	if configShallowCopy.UserAgent == "" {
+		configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent()
+	}
+
+	// share the transport between all clients
+	httpClient, err := rest.HTTPClientFor(&configShallowCopy)
+	if err != nil {
+		return nil, err
+	}
+
+	return NewForConfigAndClient(&configShallowCopy, httpClient)
+}
+
+// NewForConfigAndClient creates a new Clientset for the given config and http client.
+// Note the http client provided takes precedence over the configured transport values.
+// If config's RateLimiter is not set and QPS and Burst are acceptable,
+// NewForConfigAndClient will generate a rate-limiter in configShallowCopy.
+func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset, error) {
+	configShallowCopy := *c
+	if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
+		if configShallowCopy.Burst <= 0 {
+			return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
+		}
+		configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
+	}
+
+	var cs Clientset
+	var err error
+	cs.kedaV1alpha1, err = kedav1alpha1.NewForConfigAndClient(&configShallowCopy, httpClient)
+	if err != nil {
+		return nil, err
+	}
+
+	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfigAndClient(&configShallowCopy, httpClient)
+	if err != nil {
+		return nil, err
+	}
+	return &cs, nil
+}
+
+// NewForConfigOrDie creates a new Clientset for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *Clientset {
+	cs, err := NewForConfig(c)
+	if err != nil {
+		panic(err)
+	}
+	return cs
+}
+
+// New creates a new Clientset for the given RESTClient.
+func New(c rest.Interface) *Clientset {
+	var cs Clientset
+	cs.kedaV1alpha1 = kedav1alpha1.New(c)
+
+	cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
+	return &cs
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/doc.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/doc.go
new file mode 100644
index 000000000..e48c2aa44
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package has the automatically generated clientset.
+package versioned
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/clientset_generated.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/clientset_generated.go
new file mode 100644
index 000000000..0e872c0fd
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/clientset_generated.go
@@ -0,0 +1,85 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/client-go/discovery"
+	fakediscovery "k8s.io/client-go/discovery/fake"
+	"k8s.io/client-go/testing"
+	clientset "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned"
+	kedav1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1"
+	fakekedav1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake"
+)
+
+// NewSimpleClientset returns a clientset that will respond with the provided objects.
+// It's backed by a very simple object tracker that processes creates, updates and deletions as-is,
+// without applying any validations and/or defaults. It shouldn't be considered a replacement
+// for a real clientset and is mostly useful in simple unit tests.
+func NewSimpleClientset(objects ...runtime.Object) *Clientset {
+	o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder())
+	for _, obj := range objects {
+		if err := o.Add(obj); err != nil {
+			panic(err)
+		}
+	}
+
+	cs := &Clientset{tracker: o}
+	cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake}
+	cs.AddReactor("*", "*", testing.ObjectReaction(o))
+	cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) {
+		gvr := action.GetResource()
+		ns := action.GetNamespace()
+		watch, err := o.Watch(gvr, ns)
+		if err != nil {
+			return false, nil, err
+		}
+		return true, watch, nil
+	})
+
+	return cs
+}
+
+// Clientset implements clientset.Interface. Meant to be embedded into a
+// struct to get a default implementation. This makes faking out just the method
+// you want to test easier.
+type Clientset struct {
+	testing.Fake
+	discovery *fakediscovery.FakeDiscovery
+	tracker   testing.ObjectTracker
+}
+
+func (c *Clientset) Discovery() discovery.DiscoveryInterface {
+	return c.discovery
+}
+
+func (c *Clientset) Tracker() testing.ObjectTracker {
+	return c.tracker
+}
+
+var (
+	_ clientset.Interface = &Clientset{}
+	_ testing.FakeClient  = &Clientset{}
+)
+
+// KedaV1alpha1 retrieves the KedaV1alpha1Client
+func (c *Clientset) KedaV1alpha1() kedav1alpha1.KedaV1alpha1Interface {
+	return &fakekedav1alpha1.FakeKedaV1alpha1{Fake: &c.Fake}
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/doc.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/doc.go
new file mode 100644
index 000000000..2c4903250
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package has the automatically generated fake clientset.
+package fake
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/register.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/register.go
new file mode 100644
index 000000000..6555aa503
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake/register.go
@@ -0,0 +1,56 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	kedav1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+)
+
+var scheme = runtime.NewScheme()
+var codecs = serializer.NewCodecFactory(scheme)
+
+var localSchemeBuilder = runtime.SchemeBuilder{
+	kedav1alpha1.AddToScheme,
+}
+
+// AddToScheme adds all types of this clientset into the given scheme. This allows composition
+// of clientsets, like in:
+//
+//   import (
+//     "k8s.io/client-go/kubernetes"
+//     clientsetscheme "k8s.io/client-go/kubernetes/scheme"
+//     aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
+//   )
+//
+//   kclientset, _ := kubernetes.NewForConfig(c)
+//   _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
+//
+// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
+// correctly.
+var AddToScheme = localSchemeBuilder.AddToScheme
+
+func init() {
+	v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"})
+	utilruntime.Must(AddToScheme(scheme))
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme/doc.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme/doc.go
new file mode 100644
index 000000000..7acc2dcf2
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package contains the scheme of the automatically generated clientset.
+package scheme
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme/register.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme/register.go
new file mode 100644
index 000000000..0882d9013
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme/register.go
@@ -0,0 +1,56 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package scheme
+
+import (
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	serializer "k8s.io/apimachinery/pkg/runtime/serializer"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	kedav1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+)
+
+var Scheme = runtime.NewScheme()
+var Codecs = serializer.NewCodecFactory(Scheme)
+var ParameterCodec = runtime.NewParameterCodec(Scheme)
+var localSchemeBuilder = runtime.SchemeBuilder{
+	kedav1alpha1.AddToScheme,
+}
+
+// AddToScheme adds all types of this clientset into the given scheme. This allows composition
+// of clientsets, like in:
+//
+//   import (
+//     "k8s.io/client-go/kubernetes"
+//     clientsetscheme "k8s.io/client-go/kubernetes/scheme"
+//     aggregatorclientsetscheme "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/scheme"
+//   )
+//
+//   kclientset, _ := kubernetes.NewForConfig(c)
+//   _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme)
+//
+// After this, RawExtensions in Kubernetes types will serialize kube-aggregator types
+// correctly.
+var AddToScheme = localSchemeBuilder.AddToScheme
+
+func init() {
+	v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
+	utilruntime.Must(AddToScheme(Scheme))
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/clustertriggerauthentication.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/clustertriggerauthentication.go
new file mode 100644
index 000000000..3ed2d4e92
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/clustertriggerauthentication.go
@@ -0,0 +1,168 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+	scheme "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme"
+)
+
+// ClusterTriggerAuthenticationsGetter has a method to return a ClusterTriggerAuthenticationInterface.
+// A group's client should implement this interface.
+type ClusterTriggerAuthenticationsGetter interface {
+	ClusterTriggerAuthentications() ClusterTriggerAuthenticationInterface
+}
+
+// ClusterTriggerAuthenticationInterface has methods to work with ClusterTriggerAuthentication resources.
+type ClusterTriggerAuthenticationInterface interface {
+	Create(ctx context.Context, clusterTriggerAuthentication *v1alpha1.ClusterTriggerAuthentication, opts v1.CreateOptions) (*v1alpha1.ClusterTriggerAuthentication, error)
+	Update(ctx context.Context, clusterTriggerAuthentication *v1alpha1.ClusterTriggerAuthentication, opts v1.UpdateOptions) (*v1alpha1.ClusterTriggerAuthentication, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.ClusterTriggerAuthentication, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ClusterTriggerAuthenticationList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterTriggerAuthentication, err error)
+	ClusterTriggerAuthenticationExpansion
+}
+
+// clusterTriggerAuthentications implements ClusterTriggerAuthenticationInterface
+type clusterTriggerAuthentications struct {
+	client rest.Interface
+}
+
+// newClusterTriggerAuthentications returns a ClusterTriggerAuthentications
+func newClusterTriggerAuthentications(c *KedaV1alpha1Client) *clusterTriggerAuthentications {
+	return &clusterTriggerAuthentications{
+		client: c.RESTClient(),
+	}
+}
+
+// Get takes name of the clusterTriggerAuthentication, and returns the corresponding clusterTriggerAuthentication object, and an error if there is any.
+func (c *clusterTriggerAuthentications) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	result = &v1alpha1.ClusterTriggerAuthentication{}
+	err = c.client.Get().
+		Resource("clustertriggerauthentications").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of ClusterTriggerAuthentications that match those selectors.
+func (c *clusterTriggerAuthentications) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.ClusterTriggerAuthenticationList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.ClusterTriggerAuthenticationList{}
+	err = c.client.Get().
+		Resource("clustertriggerauthentications").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested clusterTriggerAuthentications.
+func (c *clusterTriggerAuthentications) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Resource("clustertriggerauthentications").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a clusterTriggerAuthentication and creates it.  Returns the server's representation of the clusterTriggerAuthentication, and an error, if there is any.
+func (c *clusterTriggerAuthentications) Create(ctx context.Context, clusterTriggerAuthentication *v1alpha1.ClusterTriggerAuthentication, opts v1.CreateOptions) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	result = &v1alpha1.ClusterTriggerAuthentication{}
+	err = c.client.Post().
+		Resource("clustertriggerauthentications").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(clusterTriggerAuthentication).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a clusterTriggerAuthentication and updates it. Returns the server's representation of the clusterTriggerAuthentication, and an error, if there is any.
+func (c *clusterTriggerAuthentications) Update(ctx context.Context, clusterTriggerAuthentication *v1alpha1.ClusterTriggerAuthentication, opts v1.UpdateOptions) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	result = &v1alpha1.ClusterTriggerAuthentication{}
+	err = c.client.Put().
+		Resource("clustertriggerauthentications").
+		Name(clusterTriggerAuthentication.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(clusterTriggerAuthentication).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the clusterTriggerAuthentication and deletes it. Returns an error if one occurs.
+func (c *clusterTriggerAuthentications) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Resource("clustertriggerauthentications").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *clusterTriggerAuthentications) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	var timeout time.Duration
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Resource("clustertriggerauthentications").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched clusterTriggerAuthentication.
+func (c *clusterTriggerAuthentications) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	result = &v1alpha1.ClusterTriggerAuthentication{}
+	err = c.client.Patch(pt).
+		Resource("clustertriggerauthentications").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/doc.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/doc.go
new file mode 100644
index 000000000..41e872fe9
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package has the automatically generated typed clients.
+package v1alpha1
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/doc.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/doc.go
new file mode 100644
index 000000000..c7f6e65ca
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// Package fake has the automatically generated clients.
+package fake
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_clustertriggerauthentication.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_clustertriggerauthentication.go
new file mode 100644
index 000000000..6d5f19e72
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_clustertriggerauthentication.go
@@ -0,0 +1,122 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+)
+
+// FakeClusterTriggerAuthentications implements ClusterTriggerAuthenticationInterface
+type FakeClusterTriggerAuthentications struct {
+	Fake *FakeKedaV1alpha1
+}
+
+var clustertriggerauthenticationsResource = schema.GroupVersionResource{Group: "keda", Version: "v1alpha1", Resource: "clustertriggerauthentications"}
+
+var clustertriggerauthenticationsKind = schema.GroupVersionKind{Group: "keda", Version: "v1alpha1", Kind: "ClusterTriggerAuthentication"}
+
+// Get takes name of the clusterTriggerAuthentication, and returns the corresponding clusterTriggerAuthentication object, and an error if there is any.
+func (c *FakeClusterTriggerAuthentications) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootGetAction(clustertriggerauthenticationsResource, name), &v1alpha1.ClusterTriggerAuthentication{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ClusterTriggerAuthentication), err
+}
+
+// List takes label and field selectors, and returns the list of ClusterTriggerAuthentications that match those selectors.
+func (c *FakeClusterTriggerAuthentications) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.ClusterTriggerAuthenticationList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootListAction(clustertriggerauthenticationsResource, clustertriggerauthenticationsKind, opts), &v1alpha1.ClusterTriggerAuthenticationList{})
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.ClusterTriggerAuthenticationList{ListMeta: obj.(*v1alpha1.ClusterTriggerAuthenticationList).ListMeta}
+	for _, item := range obj.(*v1alpha1.ClusterTriggerAuthenticationList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested clusterTriggerAuthentications.
+func (c *FakeClusterTriggerAuthentications) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewRootWatchAction(clustertriggerauthenticationsResource, opts))
+}
+
+// Create takes the representation of a clusterTriggerAuthentication and creates it.  Returns the server's representation of the clusterTriggerAuthentication, and an error, if there is any.
+func (c *FakeClusterTriggerAuthentications) Create(ctx context.Context, clusterTriggerAuthentication *v1alpha1.ClusterTriggerAuthentication, opts v1.CreateOptions) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootCreateAction(clustertriggerauthenticationsResource, clusterTriggerAuthentication), &v1alpha1.ClusterTriggerAuthentication{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ClusterTriggerAuthentication), err
+}
+
+// Update takes the representation of a clusterTriggerAuthentication and updates it. Returns the server's representation of the clusterTriggerAuthentication, and an error, if there is any.
+func (c *FakeClusterTriggerAuthentications) Update(ctx context.Context, clusterTriggerAuthentication *v1alpha1.ClusterTriggerAuthentication, opts v1.UpdateOptions) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootUpdateAction(clustertriggerauthenticationsResource, clusterTriggerAuthentication), &v1alpha1.ClusterTriggerAuthentication{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ClusterTriggerAuthentication), err
+}
+
+// Delete takes name of the clusterTriggerAuthentication and deletes it. Returns an error if one occurs.
+func (c *FakeClusterTriggerAuthentications) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewRootDeleteActionWithOptions(clustertriggerauthenticationsResource, name, opts), &v1alpha1.ClusterTriggerAuthentication{})
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeClusterTriggerAuthentications) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewRootDeleteCollectionAction(clustertriggerauthenticationsResource, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.ClusterTriggerAuthenticationList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched clusterTriggerAuthentication.
+func (c *FakeClusterTriggerAuthentications) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewRootPatchSubresourceAction(clustertriggerauthenticationsResource, name, pt, data, subresources...), &v1alpha1.ClusterTriggerAuthentication{})
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ClusterTriggerAuthentication), err
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_keda_client.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_keda_client.go
new file mode 100644
index 000000000..110bdb7af
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_keda_client.go
@@ -0,0 +1,52 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	rest "k8s.io/client-go/rest"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1"
+)
+
+type FakeKedaV1alpha1 struct {
+	*testing.Fake
+}
+
+func (c *FakeKedaV1alpha1) ClusterTriggerAuthentications() v1alpha1.ClusterTriggerAuthenticationInterface {
+	return &FakeClusterTriggerAuthentications{c}
+}
+
+func (c *FakeKedaV1alpha1) ScaledJobs(namespace string) v1alpha1.ScaledJobInterface {
+	return &FakeScaledJobs{c, namespace}
+}
+
+func (c *FakeKedaV1alpha1) ScaledObjects(namespace string) v1alpha1.ScaledObjectInterface {
+	return &FakeScaledObjects{c, namespace}
+}
+
+func (c *FakeKedaV1alpha1) TriggerAuthentications(namespace string) v1alpha1.TriggerAuthenticationInterface {
+	return &FakeTriggerAuthentications{c, namespace}
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *FakeKedaV1alpha1) RESTClient() rest.Interface {
+	var ret *rest.RESTClient
+	return ret
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_scaledjob.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_scaledjob.go
new file mode 100644
index 000000000..a00f0e671
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_scaledjob.go
@@ -0,0 +1,142 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+)
+
+// FakeScaledJobs implements ScaledJobInterface
+type FakeScaledJobs struct {
+	Fake *FakeKedaV1alpha1
+	ns   string
+}
+
+var scaledjobsResource = schema.GroupVersionResource{Group: "keda", Version: "v1alpha1", Resource: "scaledjobs"}
+
+var scaledjobsKind = schema.GroupVersionKind{Group: "keda", Version: "v1alpha1", Kind: "ScaledJob"}
+
+// Get takes name of the scaledJob, and returns the corresponding scaledJob object, and an error if there is any.
+func (c *FakeScaledJobs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ScaledJob, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(scaledjobsResource, c.ns, name), &v1alpha1.ScaledJob{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledJob), err
+}
+
+// List takes label and field selectors, and returns the list of ScaledJobs that match those selectors.
+func (c *FakeScaledJobs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.ScaledJobList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(scaledjobsResource, scaledjobsKind, c.ns, opts), &v1alpha1.ScaledJobList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.ScaledJobList{ListMeta: obj.(*v1alpha1.ScaledJobList).ListMeta}
+	for _, item := range obj.(*v1alpha1.ScaledJobList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested scaledJobs.
+func (c *FakeScaledJobs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(scaledjobsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a scaledJob and creates it.  Returns the server's representation of the scaledJob, and an error, if there is any.
+func (c *FakeScaledJobs) Create(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.CreateOptions) (result *v1alpha1.ScaledJob, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(scaledjobsResource, c.ns, scaledJob), &v1alpha1.ScaledJob{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledJob), err
+}
+
+// Update takes the representation of a scaledJob and updates it. Returns the server's representation of the scaledJob, and an error, if there is any.
+func (c *FakeScaledJobs) Update(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.UpdateOptions) (result *v1alpha1.ScaledJob, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(scaledjobsResource, c.ns, scaledJob), &v1alpha1.ScaledJob{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledJob), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeScaledJobs) UpdateStatus(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.UpdateOptions) (*v1alpha1.ScaledJob, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(scaledjobsResource, "status", c.ns, scaledJob), &v1alpha1.ScaledJob{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledJob), err
+}
+
+// Delete takes name of the scaledJob and deletes it. Returns an error if one occurs.
+func (c *FakeScaledJobs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteActionWithOptions(scaledjobsResource, c.ns, name, opts), &v1alpha1.ScaledJob{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeScaledJobs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(scaledjobsResource, c.ns, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.ScaledJobList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched scaledJob.
+func (c *FakeScaledJobs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledJob, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(scaledjobsResource, c.ns, name, pt, data, subresources...), &v1alpha1.ScaledJob{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledJob), err
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_scaledobject.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_scaledobject.go
new file mode 100644
index 000000000..3769872e9
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_scaledobject.go
@@ -0,0 +1,142 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+)
+
+// FakeScaledObjects implements ScaledObjectInterface
+type FakeScaledObjects struct {
+	Fake *FakeKedaV1alpha1
+	ns   string
+}
+
+var scaledobjectsResource = schema.GroupVersionResource{Group: "keda", Version: "v1alpha1", Resource: "scaledobjects"}
+
+var scaledobjectsKind = schema.GroupVersionKind{Group: "keda", Version: "v1alpha1", Kind: "ScaledObject"}
+
+// Get takes name of the scaledObject, and returns the corresponding scaledObject object, and an error if there is any.
+func (c *FakeScaledObjects) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ScaledObject, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(scaledobjectsResource, c.ns, name), &v1alpha1.ScaledObject{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledObject), err
+}
+
+// List takes label and field selectors, and returns the list of ScaledObjects that match those selectors.
+func (c *FakeScaledObjects) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.ScaledObjectList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(scaledobjectsResource, scaledobjectsKind, c.ns, opts), &v1alpha1.ScaledObjectList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.ScaledObjectList{ListMeta: obj.(*v1alpha1.ScaledObjectList).ListMeta}
+	for _, item := range obj.(*v1alpha1.ScaledObjectList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested scaledObjects.
+func (c *FakeScaledObjects) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(scaledobjectsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a scaledObject and creates it.  Returns the server's representation of the scaledObject, and an error, if there is any.
+func (c *FakeScaledObjects) Create(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.CreateOptions) (result *v1alpha1.ScaledObject, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(scaledobjectsResource, c.ns, scaledObject), &v1alpha1.ScaledObject{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledObject), err
+}
+
+// Update takes the representation of a scaledObject and updates it. Returns the server's representation of the scaledObject, and an error, if there is any.
+func (c *FakeScaledObjects) Update(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.UpdateOptions) (result *v1alpha1.ScaledObject, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(scaledobjectsResource, c.ns, scaledObject), &v1alpha1.ScaledObject{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledObject), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeScaledObjects) UpdateStatus(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.UpdateOptions) (*v1alpha1.ScaledObject, error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateSubresourceAction(scaledobjectsResource, "status", c.ns, scaledObject), &v1alpha1.ScaledObject{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledObject), err
+}
+
+// Delete takes name of the scaledObject and deletes it. Returns an error if one occurs.
+func (c *FakeScaledObjects) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteActionWithOptions(scaledobjectsResource, c.ns, name, opts), &v1alpha1.ScaledObject{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeScaledObjects) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(scaledobjectsResource, c.ns, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.ScaledObjectList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched scaledObject.
+func (c *FakeScaledObjects) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledObject, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(scaledobjectsResource, c.ns, name, pt, data, subresources...), &v1alpha1.ScaledObject{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.ScaledObject), err
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_triggerauthentication.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_triggerauthentication.go
new file mode 100644
index 000000000..0ca5880e4
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake/fake_triggerauthentication.go
@@ -0,0 +1,130 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	"context"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	labels "k8s.io/apimachinery/pkg/labels"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	testing "k8s.io/client-go/testing"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+)
+
+// FakeTriggerAuthentications implements TriggerAuthenticationInterface
+type FakeTriggerAuthentications struct {
+	Fake *FakeKedaV1alpha1
+	ns   string
+}
+
+var triggerauthenticationsResource = schema.GroupVersionResource{Group: "keda", Version: "v1alpha1", Resource: "triggerauthentications"}
+
+var triggerauthenticationsKind = schema.GroupVersionKind{Group: "keda", Version: "v1alpha1", Kind: "TriggerAuthentication"}
+
+// Get takes name of the triggerAuthentication, and returns the corresponding triggerAuthentication object, and an error if there is any.
+func (c *FakeTriggerAuthentications) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.TriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewGetAction(triggerauthenticationsResource, c.ns, name), &v1alpha1.TriggerAuthentication{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.TriggerAuthentication), err
+}
+
+// List takes label and field selectors, and returns the list of TriggerAuthentications that match those selectors.
+func (c *FakeTriggerAuthentications) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.TriggerAuthenticationList, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewListAction(triggerauthenticationsResource, triggerauthenticationsKind, c.ns, opts), &v1alpha1.TriggerAuthenticationList{})
+
+	if obj == nil {
+		return nil, err
+	}
+
+	label, _, _ := testing.ExtractFromListOptions(opts)
+	if label == nil {
+		label = labels.Everything()
+	}
+	list := &v1alpha1.TriggerAuthenticationList{ListMeta: obj.(*v1alpha1.TriggerAuthenticationList).ListMeta}
+	for _, item := range obj.(*v1alpha1.TriggerAuthenticationList).Items {
+		if label.Matches(labels.Set(item.Labels)) {
+			list.Items = append(list.Items, item)
+		}
+	}
+	return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested triggerAuthentications.
+func (c *FakeTriggerAuthentications) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return c.Fake.
+		InvokesWatch(testing.NewWatchAction(triggerauthenticationsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a triggerAuthentication and creates it.  Returns the server's representation of the triggerAuthentication, and an error, if there is any.
+func (c *FakeTriggerAuthentications) Create(ctx context.Context, triggerAuthentication *v1alpha1.TriggerAuthentication, opts v1.CreateOptions) (result *v1alpha1.TriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewCreateAction(triggerauthenticationsResource, c.ns, triggerAuthentication), &v1alpha1.TriggerAuthentication{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.TriggerAuthentication), err
+}
+
+// Update takes the representation of a triggerAuthentication and updates it. Returns the server's representation of the triggerAuthentication, and an error, if there is any.
+func (c *FakeTriggerAuthentications) Update(ctx context.Context, triggerAuthentication *v1alpha1.TriggerAuthentication, opts v1.UpdateOptions) (result *v1alpha1.TriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewUpdateAction(triggerauthenticationsResource, c.ns, triggerAuthentication), &v1alpha1.TriggerAuthentication{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.TriggerAuthentication), err
+}
+
+// Delete takes name of the triggerAuthentication and deletes it. Returns an error if one occurs.
+func (c *FakeTriggerAuthentications) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	_, err := c.Fake.
+		Invokes(testing.NewDeleteActionWithOptions(triggerauthenticationsResource, c.ns, name, opts), &v1alpha1.TriggerAuthentication{})
+
+	return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeTriggerAuthentications) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(triggerauthenticationsResource, c.ns, listOpts)
+
+	_, err := c.Fake.Invokes(action, &v1alpha1.TriggerAuthenticationList{})
+	return err
+}
+
+// Patch applies the patch and returns the patched triggerAuthentication.
+func (c *FakeTriggerAuthentications) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.TriggerAuthentication, err error) {
+	obj, err := c.Fake.
+		Invokes(testing.NewPatchSubresourceAction(triggerauthenticationsResource, c.ns, name, pt, data, subresources...), &v1alpha1.TriggerAuthentication{})
+
+	if obj == nil {
+		return nil, err
+	}
+	return obj.(*v1alpha1.TriggerAuthentication), err
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/generated_expansion.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/generated_expansion.go
new file mode 100644
index 000000000..6bca2a24c
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/generated_expansion.go
@@ -0,0 +1,27 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+type ClusterTriggerAuthenticationExpansion interface{}
+
+type ScaledJobExpansion interface{}
+
+type ScaledObjectExpansion interface{}
+
+type TriggerAuthenticationExpansion interface{}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/keda_client.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/keda_client.go
new file mode 100644
index 000000000..a5a98043f
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/keda_client.go
@@ -0,0 +1,122 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"net/http"
+
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+	"knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme"
+)
+
+type KedaV1alpha1Interface interface {
+	RESTClient() rest.Interface
+	ClusterTriggerAuthenticationsGetter
+	ScaledJobsGetter
+	ScaledObjectsGetter
+	TriggerAuthenticationsGetter
+}
+
+// KedaV1alpha1Client is used to interact with features provided by the keda group.
+type KedaV1alpha1Client struct {
+	restClient rest.Interface
+}
+
+func (c *KedaV1alpha1Client) ClusterTriggerAuthentications() ClusterTriggerAuthenticationInterface {
+	return newClusterTriggerAuthentications(c)
+}
+
+func (c *KedaV1alpha1Client) ScaledJobs(namespace string) ScaledJobInterface {
+	return newScaledJobs(c, namespace)
+}
+
+func (c *KedaV1alpha1Client) ScaledObjects(namespace string) ScaledObjectInterface {
+	return newScaledObjects(c, namespace)
+}
+
+func (c *KedaV1alpha1Client) TriggerAuthentications(namespace string) TriggerAuthenticationInterface {
+	return newTriggerAuthentications(c, namespace)
+}
+
+// NewForConfig creates a new KedaV1alpha1Client for the given config.
+// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient),
+// where httpClient was generated with rest.HTTPClientFor(c).
+func NewForConfig(c *rest.Config) (*KedaV1alpha1Client, error) {
+	config := *c
+	if err := setConfigDefaults(&config); err != nil {
+		return nil, err
+	}
+	httpClient, err := rest.HTTPClientFor(&config)
+	if err != nil {
+		return nil, err
+	}
+	return NewForConfigAndClient(&config, httpClient)
+}
+
+// NewForConfigAndClient creates a new KedaV1alpha1Client for the given config and http client.
+// Note the http client provided takes precedence over the configured transport values.
+func NewForConfigAndClient(c *rest.Config, h *http.Client) (*KedaV1alpha1Client, error) {
+	config := *c
+	if err := setConfigDefaults(&config); err != nil {
+		return nil, err
+	}
+	client, err := rest.RESTClientForConfigAndClient(&config, h)
+	if err != nil {
+		return nil, err
+	}
+	return &KedaV1alpha1Client{client}, nil
+}
+
+// NewForConfigOrDie creates a new KedaV1alpha1Client for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *KedaV1alpha1Client {
+	client, err := NewForConfig(c)
+	if err != nil {
+		panic(err)
+	}
+	return client
+}
+
+// New creates a new KedaV1alpha1Client for the given RESTClient.
+func New(c rest.Interface) *KedaV1alpha1Client {
+	return &KedaV1alpha1Client{c}
+}
+
+func setConfigDefaults(config *rest.Config) error {
+	gv := v1alpha1.SchemeGroupVersion
+	config.GroupVersion = &gv
+	config.APIPath = "/apis"
+	config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
+
+	if config.UserAgent == "" {
+		config.UserAgent = rest.DefaultKubernetesUserAgent()
+	}
+
+	return nil
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *KedaV1alpha1Client) RESTClient() rest.Interface {
+	if c == nil {
+		return nil
+	}
+	return c.restClient
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/scaledjob.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/scaledjob.go
new file mode 100644
index 000000000..4ffdd0156
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/scaledjob.go
@@ -0,0 +1,195 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+	scheme "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme"
+)
+
+// ScaledJobsGetter has a method to return a ScaledJobInterface.
+// A group's client should implement this interface.
+type ScaledJobsGetter interface {
+	ScaledJobs(namespace string) ScaledJobInterface
+}
+
+// ScaledJobInterface has methods to work with ScaledJob resources.
+type ScaledJobInterface interface {
+	Create(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.CreateOptions) (*v1alpha1.ScaledJob, error)
+	Update(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.UpdateOptions) (*v1alpha1.ScaledJob, error)
+	UpdateStatus(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.UpdateOptions) (*v1alpha1.ScaledJob, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.ScaledJob, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ScaledJobList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledJob, err error)
+	ScaledJobExpansion
+}
+
+// scaledJobs implements ScaledJobInterface
+type scaledJobs struct {
+	client rest.Interface
+	ns     string
+}
+
+// newScaledJobs returns a ScaledJobs
+func newScaledJobs(c *KedaV1alpha1Client, namespace string) *scaledJobs {
+	return &scaledJobs{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the scaledJob, and returns the corresponding scaledJob object, and an error if there is any.
+func (c *scaledJobs) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ScaledJob, err error) {
+	result = &v1alpha1.ScaledJob{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of ScaledJobs that match those selectors.
+func (c *scaledJobs) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.ScaledJobList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.ScaledJobList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested scaledJobs.
+func (c *scaledJobs) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a scaledJob and creates it.  Returns the server's representation of the scaledJob, and an error, if there is any.
+func (c *scaledJobs) Create(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.CreateOptions) (result *v1alpha1.ScaledJob, err error) {
+	result = &v1alpha1.ScaledJob{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(scaledJob).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a scaledJob and updates it. Returns the server's representation of the scaledJob, and an error, if there is any.
+func (c *scaledJobs) Update(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.UpdateOptions) (result *v1alpha1.ScaledJob, err error) {
+	result = &v1alpha1.ScaledJob{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		Name(scaledJob.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(scaledJob).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *scaledJobs) UpdateStatus(ctx context.Context, scaledJob *v1alpha1.ScaledJob, opts v1.UpdateOptions) (result *v1alpha1.ScaledJob, err error) {
+	result = &v1alpha1.ScaledJob{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		Name(scaledJob.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(scaledJob).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the scaledJob and deletes it. Returns an error if one occurs.
+func (c *scaledJobs) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *scaledJobs) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	var timeout time.Duration
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched scaledJob.
+func (c *scaledJobs) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledJob, err error) {
+	result = &v1alpha1.ScaledJob{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("scaledjobs").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/scaledobject.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/scaledobject.go
new file mode 100644
index 000000000..160a51851
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/scaledobject.go
@@ -0,0 +1,195 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+	scheme "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme"
+)
+
+// ScaledObjectsGetter has a method to return a ScaledObjectInterface.
+// A group's client should implement this interface.
+type ScaledObjectsGetter interface {
+	ScaledObjects(namespace string) ScaledObjectInterface
+}
+
+// ScaledObjectInterface has methods to work with ScaledObject resources.
+type ScaledObjectInterface interface {
+	Create(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.CreateOptions) (*v1alpha1.ScaledObject, error)
+	Update(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.UpdateOptions) (*v1alpha1.ScaledObject, error)
+	UpdateStatus(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.UpdateOptions) (*v1alpha1.ScaledObject, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.ScaledObject, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ScaledObjectList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledObject, err error)
+	ScaledObjectExpansion
+}
+
+// scaledObjects implements ScaledObjectInterface
+type scaledObjects struct {
+	client rest.Interface
+	ns     string
+}
+
+// newScaledObjects returns a ScaledObjects
+func newScaledObjects(c *KedaV1alpha1Client, namespace string) *scaledObjects {
+	return &scaledObjects{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the scaledObject, and returns the corresponding scaledObject object, and an error if there is any.
+func (c *scaledObjects) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ScaledObject, err error) {
+	result = &v1alpha1.ScaledObject{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of ScaledObjects that match those selectors.
+func (c *scaledObjects) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.ScaledObjectList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.ScaledObjectList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested scaledObjects.
+func (c *scaledObjects) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a scaledObject and creates it.  Returns the server's representation of the scaledObject, and an error, if there is any.
+func (c *scaledObjects) Create(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.CreateOptions) (result *v1alpha1.ScaledObject, err error) {
+	result = &v1alpha1.ScaledObject{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(scaledObject).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a scaledObject and updates it. Returns the server's representation of the scaledObject, and an error, if there is any.
+func (c *scaledObjects) Update(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.UpdateOptions) (result *v1alpha1.ScaledObject, err error) {
+	result = &v1alpha1.ScaledObject{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		Name(scaledObject.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(scaledObject).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *scaledObjects) UpdateStatus(ctx context.Context, scaledObject *v1alpha1.ScaledObject, opts v1.UpdateOptions) (result *v1alpha1.ScaledObject, err error) {
+	result = &v1alpha1.ScaledObject{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		Name(scaledObject.Name).
+		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(scaledObject).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the scaledObject and deletes it. Returns an error if one occurs.
+func (c *scaledObjects) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *scaledObjects) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	var timeout time.Duration
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched scaledObject.
+func (c *scaledObjects) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledObject, err error) {
+	result = &v1alpha1.ScaledObject{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("scaledobjects").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/triggerauthentication.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/triggerauthentication.go
new file mode 100644
index 000000000..df5bde4e9
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/triggerauthentication.go
@@ -0,0 +1,178 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	"context"
+	"time"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+	scheme "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme"
+)
+
+// TriggerAuthenticationsGetter has a method to return a TriggerAuthenticationInterface.
+// A group's client should implement this interface.
+type TriggerAuthenticationsGetter interface {
+	TriggerAuthentications(namespace string) TriggerAuthenticationInterface
+}
+
+// TriggerAuthenticationInterface has methods to work with TriggerAuthentication resources.
+type TriggerAuthenticationInterface interface {
+	Create(ctx context.Context, triggerAuthentication *v1alpha1.TriggerAuthentication, opts v1.CreateOptions) (*v1alpha1.TriggerAuthentication, error)
+	Update(ctx context.Context, triggerAuthentication *v1alpha1.TriggerAuthentication, opts v1.UpdateOptions) (*v1alpha1.TriggerAuthentication, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.TriggerAuthentication, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.TriggerAuthenticationList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.TriggerAuthentication, err error)
+	TriggerAuthenticationExpansion
+}
+
+// triggerAuthentications implements TriggerAuthenticationInterface
+type triggerAuthentications struct {
+	client rest.Interface
+	ns     string
+}
+
+// newTriggerAuthentications returns a TriggerAuthentications
+func newTriggerAuthentications(c *KedaV1alpha1Client, namespace string) *triggerAuthentications {
+	return &triggerAuthentications{
+		client: c.RESTClient(),
+		ns:     namespace,
+	}
+}
+
+// Get takes name of the triggerAuthentication, and returns the corresponding triggerAuthentication object, and an error if there is any.
+func (c *triggerAuthentications) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.TriggerAuthentication, err error) {
+	result = &v1alpha1.TriggerAuthentication{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		Name(name).
+		VersionedParams(&options, scheme.ParameterCodec).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// List takes label and field selectors, and returns the list of TriggerAuthentications that match those selectors.
+func (c *triggerAuthentications) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.TriggerAuthenticationList, err error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	result = &v1alpha1.TriggerAuthenticationList{}
+	err = c.client.Get().
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Watch returns a watch.Interface that watches the requested triggerAuthentications.
+func (c *triggerAuthentications) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	var timeout time.Duration
+	if opts.TimeoutSeconds != nil {
+		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+	}
+	opts.Watch = true
+	return c.client.Get().
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Watch(ctx)
+}
+
+// Create takes the representation of a triggerAuthentication and creates it.  Returns the server's representation of the triggerAuthentication, and an error, if there is any.
+func (c *triggerAuthentications) Create(ctx context.Context, triggerAuthentication *v1alpha1.TriggerAuthentication, opts v1.CreateOptions) (result *v1alpha1.TriggerAuthentication, err error) {
+	result = &v1alpha1.TriggerAuthentication{}
+	err = c.client.Post().
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(triggerAuthentication).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Update takes the representation of a triggerAuthentication and updates it. Returns the server's representation of the triggerAuthentication, and an error, if there is any.
+func (c *triggerAuthentications) Update(ctx context.Context, triggerAuthentication *v1alpha1.TriggerAuthentication, opts v1.UpdateOptions) (result *v1alpha1.TriggerAuthentication, err error) {
+	result = &v1alpha1.TriggerAuthentication{}
+	err = c.client.Put().
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		Name(triggerAuthentication.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(triggerAuthentication).
+		Do(ctx).
+		Into(result)
+	return
+}
+
+// Delete takes name of the triggerAuthentication and deletes it. Returns an error if one occurs.
+func (c *triggerAuthentications) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		Name(name).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *triggerAuthentications) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	var timeout time.Duration
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+	}
+	return c.client.Delete().
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		VersionedParams(&listOpts, scheme.ParameterCodec).
+		Timeout(timeout).
+		Body(&opts).
+		Do(ctx).
+		Error()
+}
+
+// Patch applies the patch and returns the patched triggerAuthentication.
+func (c *triggerAuthentications) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.TriggerAuthentication, err error) {
+	result = &v1alpha1.TriggerAuthentication{}
+	err = c.client.Patch(pt).
+		Namespace(c.ns).
+		Resource("triggerauthentications").
+		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
+		Body(data).
+		Do(ctx).
+		Into(result)
+	return
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/client.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/client.go
new file mode 100644
index 000000000..baa05d7a3
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/client.go
@@ -0,0 +1,632 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by injection-gen. DO NOT EDIT.
+
+package client
+
+import (
+	context "context"
+	json "encoding/json"
+	errors "errors"
+	fmt "fmt"
+
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	unstructured "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	schema "k8s.io/apimachinery/pkg/runtime/schema"
+	types "k8s.io/apimachinery/pkg/types"
+	watch "k8s.io/apimachinery/pkg/watch"
+	discovery "k8s.io/client-go/discovery"
+	dynamic "k8s.io/client-go/dynamic"
+	rest "k8s.io/client-go/rest"
+	v1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1"
+	versioned "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned"
+	typedkedav1alpha1 "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1"
+	injection "knative.dev/pkg/injection"
+	dynamicclient "knative.dev/pkg/injection/clients/dynamicclient"
+	logging "knative.dev/pkg/logging"
+)
+
+func init() {
+	injection.Default.RegisterClient(withClientFromConfig)
+	injection.Default.RegisterClientFetcher(func(ctx context.Context) interface{} {
+		return Get(ctx)
+	})
+	injection.Dynamic.RegisterDynamicClient(withClientFromDynamic)
+}
+
+// Key is used as the key for associating information with a context.Context.
+type Key struct{}
+
+func withClientFromConfig(ctx context.Context, cfg *rest.Config) context.Context {
+	return context.WithValue(ctx, Key{}, versioned.NewForConfigOrDie(cfg))
+}
+
+func withClientFromDynamic(ctx context.Context) context.Context {
+	return context.WithValue(ctx, Key{}, &wrapClient{dyn: dynamicclient.Get(ctx)})
+}
+
+// Get extracts the versioned.Interface client from the context.
+func Get(ctx context.Context) versioned.Interface {
+	untyped := ctx.Value(Key{})
+	if untyped == nil {
+		if injection.GetConfig(ctx) == nil {
+			logging.FromContext(ctx).Panic(
+				"Unable to fetch knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned.Interface from context. This context is not the application context (which is typically given to constructors via sharedmain).")
+		} else {
+			logging.FromContext(ctx).Panic(
+				"Unable to fetch knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned.Interface from context.")
+		}
+	}
+	return untyped.(versioned.Interface)
+}
+
+type wrapClient struct {
+	dyn dynamic.Interface
+}
+
+var _ versioned.Interface = (*wrapClient)(nil)
+
+func (w *wrapClient) Discovery() discovery.DiscoveryInterface {
+	panic("Discovery called on dynamic client!")
+}
+
+func convert(from interface{}, to runtime.Object) error {
+	bs, err := json.Marshal(from)
+	if err != nil {
+		return fmt.Errorf("Marshal() = %w", err)
+	}
+	if err := json.Unmarshal(bs, to); err != nil {
+		return fmt.Errorf("Unmarshal() = %w", err)
+	}
+	return nil
+}
+
+// KedaV1alpha1 retrieves the KedaV1alpha1Client
+func (w *wrapClient) KedaV1alpha1() typedkedav1alpha1.KedaV1alpha1Interface {
+	return &wrapKedaV1alpha1{
+		dyn: w.dyn,
+	}
+}
+
+type wrapKedaV1alpha1 struct {
+	dyn dynamic.Interface
+}
+
+func (w *wrapKedaV1alpha1) RESTClient() rest.Interface {
+	panic("RESTClient called on dynamic client!")
+}
+
+func (w *wrapKedaV1alpha1) ClusterTriggerAuthentications() typedkedav1alpha1.ClusterTriggerAuthenticationInterface {
+	return &wrapKedaV1alpha1ClusterTriggerAuthenticationImpl{
+		dyn: w.dyn.Resource(schema.GroupVersionResource{
+			Group:    "keda",
+			Version:  "v1alpha1",
+			Resource: "clustertriggerauthentications",
+		}),
+	}
+}
+
+type wrapKedaV1alpha1ClusterTriggerAuthenticationImpl struct {
+	dyn dynamic.NamespaceableResourceInterface
+}
+
+var _ typedkedav1alpha1.ClusterTriggerAuthenticationInterface = (*wrapKedaV1alpha1ClusterTriggerAuthenticationImpl)(nil)
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) Create(ctx context.Context, in *v1alpha1.ClusterTriggerAuthentication, opts v1.CreateOptions) (*v1alpha1.ClusterTriggerAuthentication, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ClusterTriggerAuthentication",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Create(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ClusterTriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return w.dyn.Delete(ctx, name, opts)
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	return w.dyn.DeleteCollection(ctx, opts, listOpts)
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.ClusterTriggerAuthentication, error) {
+	uo, err := w.dyn.Get(ctx, name, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ClusterTriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ClusterTriggerAuthenticationList, error) {
+	uo, err := w.dyn.List(ctx, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ClusterTriggerAuthenticationList{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ClusterTriggerAuthentication, err error) {
+	uo, err := w.dyn.Patch(ctx, name, pt, data, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ClusterTriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) Update(ctx context.Context, in *v1alpha1.ClusterTriggerAuthentication, opts v1.UpdateOptions) (*v1alpha1.ClusterTriggerAuthentication, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ClusterTriggerAuthentication",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Update(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ClusterTriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) UpdateStatus(ctx context.Context, in *v1alpha1.ClusterTriggerAuthentication, opts v1.UpdateOptions) (*v1alpha1.ClusterTriggerAuthentication, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ClusterTriggerAuthentication",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.UpdateStatus(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ClusterTriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ClusterTriggerAuthenticationImpl) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return nil, errors.New("NYI: Watch")
+}
+
+func (w *wrapKedaV1alpha1) ScaledJobs(namespace string) typedkedav1alpha1.ScaledJobInterface {
+	return &wrapKedaV1alpha1ScaledJobImpl{
+		dyn: w.dyn.Resource(schema.GroupVersionResource{
+			Group:    "keda",
+			Version:  "v1alpha1",
+			Resource: "scaledjobs",
+		}),
+
+		namespace: namespace,
+	}
+}
+
+type wrapKedaV1alpha1ScaledJobImpl struct {
+	dyn dynamic.NamespaceableResourceInterface
+
+	namespace string
+}
+
+var _ typedkedav1alpha1.ScaledJobInterface = (*wrapKedaV1alpha1ScaledJobImpl)(nil)
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) Create(ctx context.Context, in *v1alpha1.ScaledJob, opts v1.CreateOptions) (*v1alpha1.ScaledJob, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ScaledJob",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).Create(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledJob{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return w.dyn.Namespace(w.namespace).Delete(ctx, name, opts)
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	return w.dyn.Namespace(w.namespace).DeleteCollection(ctx, opts, listOpts)
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.ScaledJob, error) {
+	uo, err := w.dyn.Namespace(w.namespace).Get(ctx, name, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledJob{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ScaledJobList, error) {
+	uo, err := w.dyn.Namespace(w.namespace).List(ctx, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledJobList{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledJob, err error) {
+	uo, err := w.dyn.Namespace(w.namespace).Patch(ctx, name, pt, data, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledJob{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) Update(ctx context.Context, in *v1alpha1.ScaledJob, opts v1.UpdateOptions) (*v1alpha1.ScaledJob, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ScaledJob",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).Update(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledJob{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) UpdateStatus(ctx context.Context, in *v1alpha1.ScaledJob, opts v1.UpdateOptions) (*v1alpha1.ScaledJob, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ScaledJob",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).UpdateStatus(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledJob{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledJobImpl) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return nil, errors.New("NYI: Watch")
+}
+
+func (w *wrapKedaV1alpha1) ScaledObjects(namespace string) typedkedav1alpha1.ScaledObjectInterface {
+	return &wrapKedaV1alpha1ScaledObjectImpl{
+		dyn: w.dyn.Resource(schema.GroupVersionResource{
+			Group:    "keda",
+			Version:  "v1alpha1",
+			Resource: "scaledobjects",
+		}),
+
+		namespace: namespace,
+	}
+}
+
+type wrapKedaV1alpha1ScaledObjectImpl struct {
+	dyn dynamic.NamespaceableResourceInterface
+
+	namespace string
+}
+
+var _ typedkedav1alpha1.ScaledObjectInterface = (*wrapKedaV1alpha1ScaledObjectImpl)(nil)
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) Create(ctx context.Context, in *v1alpha1.ScaledObject, opts v1.CreateOptions) (*v1alpha1.ScaledObject, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ScaledObject",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).Create(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledObject{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return w.dyn.Namespace(w.namespace).Delete(ctx, name, opts)
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	return w.dyn.Namespace(w.namespace).DeleteCollection(ctx, opts, listOpts)
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.ScaledObject, error) {
+	uo, err := w.dyn.Namespace(w.namespace).Get(ctx, name, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledObject{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.ScaledObjectList, error) {
+	uo, err := w.dyn.Namespace(w.namespace).List(ctx, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledObjectList{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.ScaledObject, err error) {
+	uo, err := w.dyn.Namespace(w.namespace).Patch(ctx, name, pt, data, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledObject{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) Update(ctx context.Context, in *v1alpha1.ScaledObject, opts v1.UpdateOptions) (*v1alpha1.ScaledObject, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ScaledObject",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).Update(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledObject{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) UpdateStatus(ctx context.Context, in *v1alpha1.ScaledObject, opts v1.UpdateOptions) (*v1alpha1.ScaledObject, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "ScaledObject",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).UpdateStatus(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.ScaledObject{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1ScaledObjectImpl) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return nil, errors.New("NYI: Watch")
+}
+
+func (w *wrapKedaV1alpha1) TriggerAuthentications(namespace string) typedkedav1alpha1.TriggerAuthenticationInterface {
+	return &wrapKedaV1alpha1TriggerAuthenticationImpl{
+		dyn: w.dyn.Resource(schema.GroupVersionResource{
+			Group:    "keda",
+			Version:  "v1alpha1",
+			Resource: "triggerauthentications",
+		}),
+
+		namespace: namespace,
+	}
+}
+
+type wrapKedaV1alpha1TriggerAuthenticationImpl struct {
+	dyn dynamic.NamespaceableResourceInterface
+
+	namespace string
+}
+
+var _ typedkedav1alpha1.TriggerAuthenticationInterface = (*wrapKedaV1alpha1TriggerAuthenticationImpl)(nil)
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) Create(ctx context.Context, in *v1alpha1.TriggerAuthentication, opts v1.CreateOptions) (*v1alpha1.TriggerAuthentication, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "TriggerAuthentication",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).Create(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.TriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+	return w.dyn.Namespace(w.namespace).Delete(ctx, name, opts)
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	return w.dyn.Namespace(w.namespace).DeleteCollection(ctx, opts, listOpts)
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.TriggerAuthentication, error) {
+	uo, err := w.dyn.Namespace(w.namespace).Get(ctx, name, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.TriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.TriggerAuthenticationList, error) {
+	uo, err := w.dyn.Namespace(w.namespace).List(ctx, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.TriggerAuthenticationList{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.TriggerAuthentication, err error) {
+	uo, err := w.dyn.Namespace(w.namespace).Patch(ctx, name, pt, data, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.TriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) Update(ctx context.Context, in *v1alpha1.TriggerAuthentication, opts v1.UpdateOptions) (*v1alpha1.TriggerAuthentication, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "TriggerAuthentication",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).Update(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.TriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) UpdateStatus(ctx context.Context, in *v1alpha1.TriggerAuthentication, opts v1.UpdateOptions) (*v1alpha1.TriggerAuthentication, error) {
+	in.SetGroupVersionKind(schema.GroupVersionKind{
+		Group:   "keda",
+		Version: "v1alpha1",
+		Kind:    "TriggerAuthentication",
+	})
+	uo := &unstructured.Unstructured{}
+	if err := convert(in, uo); err != nil {
+		return nil, err
+	}
+	uo, err := w.dyn.Namespace(w.namespace).UpdateStatus(ctx, uo, opts)
+	if err != nil {
+		return nil, err
+	}
+	out := &v1alpha1.TriggerAuthentication{}
+	if err := convert(uo, out); err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (w *wrapKedaV1alpha1TriggerAuthenticationImpl) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+	return nil, errors.New("NYI: Watch")
+}
diff --git a/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/fake/fake.go b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/fake/fake.go
new file mode 100644
index 000000000..efa133700
--- /dev/null
+++ b/vendor/knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/fake/fake.go
@@ -0,0 +1,57 @@
+/*
+Copyright 2020 The Knative Authors
+
+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.
+*/
+
+// Code generated by injection-gen. DO NOT EDIT.
+
+package fake
+
+import (
+	context "context"
+
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	rest "k8s.io/client-go/rest"
+	fake "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake"
+	client "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client"
+	injection "knative.dev/pkg/injection"
+	logging "knative.dev/pkg/logging"
+)
+
+func init() {
+	injection.Fake.RegisterClient(withClient)
+	injection.Fake.RegisterClientFetcher(func(ctx context.Context) interface{} {
+		return Get(ctx)
+	})
+}
+
+func withClient(ctx context.Context, cfg *rest.Config) context.Context {
+	ctx, _ = With(ctx)
+	return ctx
+}
+
+func With(ctx context.Context, objects ...runtime.Object) (context.Context, *fake.Clientset) {
+	cs := fake.NewSimpleClientset(objects...)
+	return context.WithValue(ctx, client.Key{}, cs), cs
+}
+
+// Get extracts the Kubernetes client from the context.
+func Get(ctx context.Context) *fake.Clientset {
+	untyped := ctx.Value(client.Key{})
+	if untyped == nil {
+		logging.FromContext(ctx).Panic(
+			"Unable to fetch knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake.Clientset from context.")
+	}
+	return untyped.(*fake.Clientset)
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index df41dacde..272c1ffef 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1343,6 +1343,13 @@ knative.dev/eventing/test/upgrade/prober/wathola/sender
 ## explicit; go 1.18
 knative.dev/eventing-autoscaler-keda/pkg/reconciler/keda
 knative.dev/eventing-autoscaler-keda/third_party/pkg/apis/keda/v1alpha1
+knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned
+knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/fake
+knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/scheme
+knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1
+knative.dev/eventing-autoscaler-keda/third_party/pkg/client/clientset/versioned/typed/keda/v1alpha1/fake
+knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client
+knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/fake
 # knative.dev/eventing-kafka v0.34.1-0.20220907020318-2f1fbd6dda1b
 ## explicit; go 1.16
 knative.dev/eventing-kafka/pkg/apis/bindings


Test patch:
diff --git a/control-plane/pkg/reconciler/source/controller_test.go b/control-plane/pkg/reconciler/source/controller_test.go
index 1218c2267..fbb094333 100644
--- a/control-plane/pkg/reconciler/source/controller_test.go
+++ b/control-plane/pkg/reconciler/source/controller_test.go
@@ -37,11 +37,13 @@ import (
 
 	_ "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/injection/informers/eventing/v1alpha1/consumergroup/fake"
 
+	kedaclient "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/fake"
 	"knative.dev/eventing-kafka-broker/control-plane/pkg/config"
 )
 
-func TestNewControllerV2(t *testing.T) {
+func TestNewController(t *testing.T) {
 	ctx, _ := reconcilertesting.SetupFakeContext(t)
+	ctx, _ = kedaclient.With(ctx)
 
 	configs := &config.Env{
 		SystemNamespace:      "cm",
diff --git a/control-plane/pkg/reconciler/source/source_test.go b/control-plane/pkg/reconciler/source/source_test.go
index 2ace88d4a..650f4dd62 100644
--- a/control-plane/pkg/reconciler/source/source_test.go
+++ b/control-plane/pkg/reconciler/source/source_test.go
@@ -48,6 +48,8 @@ import (
 	fakeconsumergroupinformer "knative.dev/eventing-kafka-broker/control-plane/pkg/client/internals/kafka/injection/client/fake"
 
 	. "knative.dev/eventing-kafka-broker/control-plane/pkg/reconciler/testing"
+
+	kedaclient "knative.dev/eventing-autoscaler-keda/third_party/pkg/client/injection/client/fake"
 )
 
 func TestGetLabels(t *testing.T) {
@@ -473,10 +475,60 @@ func TestReconcileKind(t *testing.T) {
 				},
 			},
 		},
+		{
+			Name: "Reconciled normal - with autoscaling annotations",
+			Objects: []runtime.Object{
+				NewSource(WithAutoscalingAnnotationsSource()),
+			},
+			Key: testKey,
+			WantCreates: []runtime.Object{
+				NewConsumerGroup(
+					WithConsumerGroupName(SourceUUID),
+					WithConsumerGroupNamespace(SourceNamespace),
+					WithConsumerGroupOwnerRef(kmeta.NewControllerRef(NewSource())),
+					WithConsumerGroupMetaLabels(OwnerAsSourceLabel),
+					WithConsumerGroupLabels(ConsumerSourceLabel),
+					WithConsumerGroupAnnotations(ConsumerGroupAnnotations),
+					ConsumerGroupConsumerSpec(NewConsumerSpec(
+						ConsumerTopics(SourceTopics[0], SourceTopics[1]),
+						ConsumerConfigs(
+							ConsumerGroupIdConfig(SourceConsumerGroup),
+							ConsumerBootstrapServersConfig(SourceBootstrapServers),
+						),
+						ConsumerAuth(NewConsumerSpecAuth()),
+						ConsumerDelivery(
+							NewConsumerSpecDelivery(
+								internals.Ordered,
+								NewConsumerTimeout("PT600S"),
+								NewConsumerRetry(10),
+								NewConsumerBackoffDelay("PT0.3S"),
+								NewConsumerBackoffPolicy(eventingduck.BackoffPolicyExponential),
+							),
+						),
+						ConsumerSubscriber(NewSourceSinkReference()),
+						ConsumerReply(ConsumerNoReply()),
+					)),
+					ConsumerGroupReplicas(1),
+				),
+			},
+			WantStatusUpdates: []clientgotesting.UpdateActionImpl{
+				{
+					Object: NewSource(
+						StatusSourceConsumerGroupUnknown(),
+						StatusSourceSinkResolved(""),
+						StatusSourceSelector(),
+						WithAutoscalingAnnotationsSource(),
+					),
+				},
+			},
+		},
 		{
 			Name: "Reconciled normal - existing cg with sink update",
 			Objects: []runtime.Object{
-				NewSource(WithSourceSink(NewSourceSink2Reference())),
+				NewSource(
+					WithSourceSink(NewSourceSink2Reference()),
+					WithSourceConsumers(1),
+				),
 				NewConsumerGroup(
 					WithConsumerGroupName(SourceUUID),
 					WithConsumerGroupNamespace(SourceNamespace),
@@ -534,7 +586,6 @@ func TestReconcileKind(t *testing.T) {
 							ConsumerSubscriber(NewSourceSink2Reference()),
 							ConsumerReply(ConsumerNoReply()),
 						)),
-						ConsumerGroupReplicas(1),
 						ConsumerGroupReady,
 					),
 				},
@@ -543,6 +594,7 @@ func TestReconcileKind(t *testing.T) {
 				{
 					Object: NewSource(
 						WithSourceSink(NewSourceSink2Reference()),
+						WithSourceConsumers(1),
 						StatusSourceConsumerGroup(),
 						StatusSourceSinkResolved(""),
 						StatusSourceSelector(),
@@ -553,7 +605,64 @@ func TestReconcileKind(t *testing.T) {
 		{
 			Name: "Reconciled normal - existing cg with update",
 			Objects: []runtime.Object{
-				NewSource(),
+				NewSource(WithSourceConsumers(1)),
+				NewConsumerGroup(
+					WithConsumerGroupName(SourceUUID),
+					WithConsumerGroupNamespace(SourceNamespace),
+					WithConsumerGroupOwnerRef(kmeta.NewControllerRef(NewSource())),
+					WithConsumerGroupMetaLabels(OwnerAsSourceLabel),
+					WithConsumerGroupLabels(ConsumerSourceLabel),
+					ConsumerGroupReplicas(1),
+					ConsumerGroupReady,
+				),
+			},
+			Key: testKey,
+			WantUpdates: []clientgotesting.UpdateActionImpl{
+				{
+					Object: NewConsumerGroup(
+						WithConsumerGroupName(SourceUUID),
+						WithConsumerGroupNamespace(SourceNamespace),
+						WithConsumerGroupOwnerRef(kmeta.NewControllerRef(NewSource())),
+						WithConsumerGroupMetaLabels(OwnerAsSourceLabel),
+						WithConsumerGroupLabels(ConsumerSourceLabel),
+						ConsumerGroupConsumerSpec(NewConsumerSpec(
+							ConsumerTopics(SourceTopics[0], SourceTopics[1]),
+							ConsumerConfigs(
+								ConsumerGroupIdConfig(SourceConsumerGroup),
+								ConsumerBootstrapServersConfig(SourceBootstrapServers),
+							),
+							ConsumerAuth(NewConsumerSpecAuth()),
+							ConsumerDelivery(
+								NewConsumerSpecDelivery(
+									internals.Ordered,
+									NewConsumerTimeout("PT600S"),
+									NewConsumerRetry(10),
+									NewConsumerBackoffDelay("PT0.3S"),
+									NewConsumerBackoffPolicy(eventingduck.BackoffPolicyExponential),
+								),
+							),
+							ConsumerSubscriber(NewSourceSinkReference()),
+							ConsumerReply(ConsumerNoReply()),
+						)),
+						ConsumerGroupReady,
+					),
+				},
+			},
+			WantStatusUpdates: []clientgotesting.UpdateActionImpl{
+				{
+					Object: NewSource(
+						WithSourceConsumers(1),
+						StatusSourceConsumerGroup(),
+						StatusSourceSinkResolved(""),
+						StatusSourceSelector(),
+					),
+				},
+			},
+		},
+		{
+			Name: "Reconciled normal - existing cg with annotations update",
+			Objects: []runtime.Object{
+				NewSource(WithAutoscalingAnnotationsSource()),
 				NewConsumerGroup(
 					WithConsumerGroupName(SourceUUID),
 					WithConsumerGroupNamespace(SourceNamespace),
@@ -573,6 +682,7 @@ func TestReconcileKind(t *testing.T) {
 						WithConsumerGroupOwnerRef(kmeta.NewControllerRef(NewSource())),
 						WithConsumerGroupMetaLabels(OwnerAsSourceLabel),
 						WithConsumerGroupLabels(ConsumerSourceLabel),
+						WithConsumerGroupAnnotations(ConsumerGroupAnnotations),
 						ConsumerGroupConsumerSpec(NewConsumerSpec(
 							ConsumerTopics(SourceTopics[0], SourceTopics[1]),
 							ConsumerConfigs(
@@ -592,7 +702,6 @@ func TestReconcileKind(t *testing.T) {
 							ConsumerSubscriber(NewSourceSinkReference()),
 							ConsumerReply(ConsumerNoReply()),
 						)),
-						ConsumerGroupReplicas(1),
 						ConsumerGroupReady,
 					),
 				},
@@ -603,6 +712,7 @@ func TestReconcileKind(t *testing.T) {
 						StatusSourceConsumerGroup(),
 						StatusSourceSinkResolved(""),
 						StatusSourceSelector(),
+						WithAutoscalingAnnotationsSource(),
 					),
 				},
 			},
@@ -610,7 +720,7 @@ func TestReconcileKind(t *testing.T) {
 		{
 			Name: "Reconciled normal - existing cg with update but not ready",
 			Objects: []runtime.Object{
-				NewSource(),
+				NewSource(WithSourceConsumers(1)),
 				NewConsumerGroup(
 					WithConsumerGroupName(SourceUUID),
 					WithConsumerGroupNamespace(SourceNamespace),
@@ -649,13 +759,13 @@ func TestReconcileKind(t *testing.T) {
 							ConsumerSubscriber(NewSourceSinkReference()),
 							ConsumerReply(ConsumerNoReply()),
 						)),
-						ConsumerGroupReplicas(1),
 					),
 				},
 			},
 			WantStatusUpdates: []clientgotesting.UpdateActionImpl{
 				{
 					Object: NewSource(
+						WithSourceConsumers(1),
 						StatusSourceConsumerGroupUnknown(),
 						StatusSourceSinkResolved(""),
 						StatusSourceSelector(),
@@ -666,13 +776,14 @@ func TestReconcileKind(t *testing.T) {
 		{
 			Name: "Reconciled normal - existing cg without update",
 			Objects: []runtime.Object{
-				NewSource(),
+				NewSource(WithAutoscalingAnnotationsSource()),
 				NewConsumerGroup(
 					WithConsumerGroupName(SourceUUID),
 					WithConsumerGroupNamespace(SourceNamespace),
 					WithConsumerGroupOwnerRef(kmeta.NewControllerRef(NewSource())),
 					WithConsumerGroupMetaLabels(OwnerAsSourceLabel),
 					WithConsumerGroupLabels(ConsumerSourceLabel),
+					WithConsumerGroupAnnotations(ConsumerGroupAnnotations),
 					ConsumerGroupConsumerSpec(NewConsumerSpec(
 						ConsumerTopics(SourceTopics[0], SourceTopics[1]),
 						ConsumerConfigs(
@@ -703,6 +814,7 @@ func TestReconcileKind(t *testing.T) {
 						StatusSourceConsumerGroup(),
 						StatusSourceSinkResolved(""),
 						StatusSourceSelector(),
+						WithAutoscalingAnnotationsSource(),
 					),
 				},
 			},
@@ -846,10 +958,12 @@ func TestReconcileKind(t *testing.T) {
 	}
 
 	table.Test(t, NewFactory(nil, func(ctx context.Context, listers *Listers, env *config.Env, row *TableRow) controller.Reconciler {
+		ctx, _ = kedaclient.With(ctx)
 
 		reconciler := &Reconciler{
 			ConsumerGroupLister: listers.GetConsumerGroupLister(),
 			InternalsClient:     fakeconsumergroupinformer.Get(ctx),
+			KedaClient:          kedaclient.Get(ctx),
 		}
 
 		r := eventingkafkasourcereconciler.NewReconciler(
diff --git a/control-plane/pkg/reconciler/testing/objects_consumergroup.go b/control-plane/pkg/reconciler/testing/objects_consumergroup.go
index 581708680..bcb283dd3 100644
--- a/control-plane/pkg/reconciler/testing/objects_consumergroup.go
+++ b/control-plane/pkg/reconciler/testing/objects_consumergroup.go
@@ -26,6 +26,7 @@ import (
 	"knative.dev/pkg/apis"
 	duckv1 "knative.dev/pkg/apis/duck/v1"
 
+	"knative.dev/eventing-autoscaler-keda/pkg/reconciler/keda"
 	kafkainternals "knative.dev/eventing-kafka-broker/control-plane/pkg/apis/internals/kafka/eventing/v1alpha1"
 )
 
@@ -67,6 +68,15 @@ var (
 		kafkainternals.UserFacingResourceLabelSelector: "kafkachannel",
 		kafkainternals.KafkaChannelNameLabel:           ChannelName,
 	}
+
+	ConsumerGroupAnnotations = map[string]string{
+		keda.AutoscalingClassAnnotation:               keda.KEDA,
+		keda.AutoscalingMinScaleAnnotation:            "0",
+		keda.AutoscalingMaxScaleAnnotation:            "5",
+		keda.KedaAutoscalingPollingIntervalAnnotation: "30",
+		keda.KedaAutoscalingCooldownPeriodAnnotation:  "300",
+		keda.KedaAutoscalingKafkaLagThreshold:         "10",
+	}
 )
 
 type ConsumerGroupOption func(cg *kafkainternals.ConsumerGroup)
@@ -141,6 +151,12 @@ func WithConsumerGroupOwnerRef(ownerref *metav1.OwnerReference) ConsumerGroupOpt
 	}
 }
 
+func WithConsumerGroupAnnotations(annots map[string]string) ConsumerGroupOption {
+	return func(cg *kafkainternals.ConsumerGroup) {
+		cg.ObjectMeta.Annotations = annots
+	}
+}
+
 func WithConsumerGroupMetaLabels(labels map[string]string) ConsumerGroupOption {
 	return func(cg *kafkainternals.ConsumerGroup) {
 		cg.Labels = labels
diff --git a/control-plane/pkg/reconciler/testing/objects_source.go b/control-plane/pkg/reconciler/testing/objects_source.go
index a4af5bb6d..72c7ec56d 100644
--- a/control-plane/pkg/reconciler/testing/objects_source.go
+++ b/control-plane/pkg/reconciler/testing/objects_source.go
@@ -93,6 +93,22 @@ func WithCloudEventOverrides(overrides *duckv1.CloudEventOverrides) KRShapedOpti
 	}
 }
 
+func WithAutoscalingAnnotationsSource() KRShapedOption {
+	return func(obj duckv1.KRShaped) {
+		ks := obj.(*sources.KafkaSource)
+
+		if ks.Annotations == nil {
+			ks.Annotations = make(map[string]string)
+		}
+
+		for k, v := range ConsumerGroupAnnotations {
+			if _, ok := ks.Annotations[k]; !ok {
+				ks.Annotations[k] = v
+			}
+		}
+	}
+}
+
 func NewSourceSinkObject() *corev1.Service {
 	return NewService()
 }
@@ -128,6 +144,13 @@ func WithSourceSink(d duckv1.Destination) KRShapedOption {
 	}
 }
 
+func WithSourceConsumers(replicas int32) KRShapedOption {
+	return func(obj duckv1.KRShaped) {
+		s := obj.(*sources.KafkaSource)
+		s.Spec.Consumers = pointer.Int32Ptr(replicas)
+	}
+}
+
 func SourceDispatcherPod(namespace string, annotations map[string]string) runtime.Object {
 	return &corev1.Pod{
 		TypeMeta: metav1.TypeMeta{