You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by to...@apache.org on 2021/05/28 02:17:53 UTC

[apisix-ingress-controller] branch master updated: feat: apisixconsumer translator (#474)

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

tokers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/master by this push:
     new 23e5ebd  feat: apisixconsumer translator (#474)
23e5ebd is described below

commit 23e5ebdb837cf581db94a613e02e292167d52eae
Author: Alex Zhang <zc...@gmail.com>
AuthorDate: Fri May 28 10:17:44 2021 +0800

    feat: apisixconsumer translator (#474)
---
 pkg/ingress/controller.go                    |   2 +-
 pkg/kube/translation/apisix_consumer.go      |  47 ++++++++
 pkg/kube/translation/apisix_consumer_test.go |  74 +++++++++++++
 pkg/kube/translation/plugin.go               |  50 +++++++++
 pkg/kube/translation/plugin_test.go          | 154 ++++++++++++++++++++++++++-
 pkg/kube/translation/translator.go           |   5 +-
 pkg/types/apisix/v1/plugin_types.go          |  26 +++++
 pkg/types/apisix/v1/types.go                 |  23 ++++
 pkg/types/apisix/v1/zz_generated.deepcopy.go |  77 +++++++++++---
 9 files changed, 440 insertions(+), 18 deletions(-)

diff --git a/pkg/ingress/controller.go b/pkg/ingress/controller.go
index 9914c02..c283034 100644
--- a/pkg/ingress/controller.go
+++ b/pkg/ingress/controller.go
@@ -435,7 +435,7 @@ func (c *Controller) namespaceWatching(key string) (ok bool) {
 	}
 	ns, _, err := cache.SplitMetaNamespaceKey(key)
 	if err != nil {
-		// Ignore resource with invalid key.
+		// Ignore resource pkg/types/apisix/v1/plugin_types.gowith invalid key.
 		ok = false
 		log.Warnf("resource %s was ignored since: %s", key, err)
 		return
diff --git a/pkg/kube/translation/apisix_consumer.go b/pkg/kube/translation/apisix_consumer.go
new file mode 100644
index 0000000..67672c6
--- /dev/null
+++ b/pkg/kube/translation/apisix_consumer.go
@@ -0,0 +1,47 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package translation
+
+import (
+	"fmt"
+
+	configv2alpha1 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2alpha1"
+	apisixv1 "github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
+)
+
+func (t *translator) TranslateApisixConsumer(ac *configv2alpha1.ApisixConsumer) (*apisixv1.Consumer, error) {
+	// As the CRD schema ensures that only one authN can be configured,
+	// so here the order is no matter.
+
+	plugins := make(apisixv1.Plugins)
+	if ac.Spec.AuthParameter.KeyAuth != nil {
+		cfg, err := t.translateConsumerKeyAuthPlugin(ac.Namespace, ac.Spec.AuthParameter.KeyAuth)
+		if err != nil {
+			return nil, fmt.Errorf("invalid key auth config: %s", err)
+		}
+		plugins["key-auth"] = cfg
+	} else if ac.Spec.AuthParameter.BasicAuth != nil {
+		cfg, err := t.translateConsumerBasicAuthPlugin(ac.Namespace, ac.Spec.AuthParameter.BasicAuth)
+		if err != nil {
+			return nil, fmt.Errorf("invalid basic auth config: %s", err)
+		}
+		plugins["basic-auth"] = cfg
+	}
+
+	consumer := apisixv1.NewDefaultConsumer()
+	consumer.Username = apisixv1.ComposeConsumerName(ac.Namespace, ac.Name)
+	consumer.Plugins = plugins
+	return consumer, nil
+}
diff --git a/pkg/kube/translation/apisix_consumer_test.go b/pkg/kube/translation/apisix_consumer_test.go
new file mode 100644
index 0000000..cf1c796
--- /dev/null
+++ b/pkg/kube/translation/apisix_consumer_test.go
@@ -0,0 +1,74 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package translation
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	configv2alpha1 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2alpha1"
+	apisixv1 "github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
+)
+
+func TestTranslateApisixConsumer(t *testing.T) {
+	ac := &configv2alpha1.ApisixConsumer{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "jack",
+			Namespace: "qa",
+		},
+		Spec: configv2alpha1.ApisixConsumerSpec{
+			AuthParameter: configv2alpha1.ApisixConsumerAuthParameter{
+				BasicAuth: &configv2alpha1.ApisixConsumerBasicAuth{
+					Value: &configv2alpha1.ApisixConsumerBasicAuthValue{
+						Username: "jack",
+						Password: "jacknice",
+					},
+				},
+			},
+		},
+	}
+	consumer, err := (&translator{}).TranslateApisixConsumer(ac)
+	assert.Nil(t, err)
+	assert.Len(t, consumer.Plugins, 1)
+	cfg := consumer.Plugins["basic-auth"].(*apisixv1.BasicAuthConsumerConfig)
+	assert.Equal(t, cfg.Username, "jack")
+	assert.Equal(t, cfg.Password, "jacknice")
+
+	ac = &configv2alpha1.ApisixConsumer{
+		ObjectMeta: metav1.ObjectMeta{
+			Name:      "jack",
+			Namespace: "qa",
+		},
+		Spec: configv2alpha1.ApisixConsumerSpec{
+			AuthParameter: configv2alpha1.ApisixConsumerAuthParameter{
+				KeyAuth: &configv2alpha1.ApisixConsumerKeyAuth{
+					Value: &configv2alpha1.ApisixConsumerKeyAuthValue{
+						Key: "qwerty",
+					},
+				},
+			},
+		},
+	}
+	consumer, err = (&translator{}).TranslateApisixConsumer(ac)
+	assert.Nil(t, err)
+	assert.Len(t, consumer.Plugins, 1)
+	cfg2 := consumer.Plugins["key-auth"].(*apisixv1.KeyAuthConsumerConfig)
+	assert.Equal(t, cfg2.Key, "qwerty")
+
+	// No test test cases for secret references as we already test them
+	// in plugin_test.go.
+}
diff --git a/pkg/kube/translation/plugin.go b/pkg/kube/translation/plugin.go
index 9e14356..d58379d 100644
--- a/pkg/kube/translation/plugin.go
+++ b/pkg/kube/translation/plugin.go
@@ -15,10 +15,18 @@
 package translation
 
 import (
+	"errors"
+
 	configv2alpha1 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2alpha1"
 	apisixv1 "github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
 )
 
+var (
+	_errKeyNotFoundOrInvalid      = errors.New("key \"key\" not found or invalid in secret")
+	_errUsernameNotFoundOrInvalid = errors.New("key \"username\" not found or invalid in secret")
+	_errPasswordNotFoundOrInvalid = errors.New("key \"password\" not found or invalid in secret")
+)
+
 func (t *translator) translateTrafficSplitPlugin(ctx *TranslateContext, ar *configv2alpha1.ApisixRoute, defaultBackendWeight int,
 	backends []*configv2alpha1.ApisixRouteHTTPBackend) (*apisixv1.TrafficSplitConfig, error) {
 	var (
@@ -60,3 +68,45 @@ func (t *translator) translateTrafficSplitPlugin(ctx *TranslateContext, ar *conf
 	}
 	return tsCfg, nil
 }
+
+func (t *translator) translateConsumerKeyAuthPlugin(consumerNamespace string, cfg *configv2alpha1.ApisixConsumerKeyAuth) (*apisixv1.KeyAuthConsumerConfig, error) {
+	if cfg.Value != nil {
+		return &apisixv1.KeyAuthConsumerConfig{Key: cfg.Value.Key}, nil
+	}
+
+	sec, err := t.SecretLister.Secrets(consumerNamespace).Get(cfg.SecretRef.Name)
+	if err != nil {
+		return nil, err
+	}
+	raw, ok := sec.Data["key"]
+	if !ok || len(raw) == 0 {
+		return nil, _errKeyNotFoundOrInvalid
+	}
+	return &apisixv1.KeyAuthConsumerConfig{Key: string(raw)}, nil
+}
+
+func (t *translator) translateConsumerBasicAuthPlugin(consumerNamespace string, cfg *configv2alpha1.ApisixConsumerBasicAuth) (*apisixv1.BasicAuthConsumerConfig, error) {
+	if cfg.Value != nil {
+		return &apisixv1.BasicAuthConsumerConfig{
+			Username: cfg.Value.Username,
+			Password: cfg.Value.Password,
+		}, nil
+	}
+
+	sec, err := t.SecretLister.Secrets(consumerNamespace).Get(cfg.SecretRef.Name)
+	if err != nil {
+		return nil, err
+	}
+	raw1, ok := sec.Data["username"]
+	if !ok || len(raw1) == 0 {
+		return nil, _errUsernameNotFoundOrInvalid
+	}
+	raw2, ok := sec.Data["password"]
+	if !ok || len(raw2) == 0 {
+		return nil, _errPasswordNotFoundOrInvalid
+	}
+	return &apisixv1.BasicAuthConsumerConfig{
+		Username: string(raw1),
+		Password: string(raw2),
+	}, nil
+}
diff --git a/pkg/kube/translation/plugin_test.go b/pkg/kube/translation/plugin_test.go
index 172429a..c249be6 100644
--- a/pkg/kube/translation/plugin_test.go
+++ b/pkg/kube/translation/plugin_test.go
@@ -18,8 +18,6 @@ import (
 	"context"
 	"testing"
 
-	"github.com/apache/apisix-ingress-controller/pkg/id"
-
 	"github.com/stretchr/testify/assert"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -28,6 +26,7 @@ import (
 	"k8s.io/client-go/kubernetes/fake"
 	"k8s.io/client-go/tools/cache"
 
+	"github.com/apache/apisix-ingress-controller/pkg/id"
 	configv2alpha1 "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/apis/config/v2alpha1"
 	apisixfake "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/client/clientset/versioned/fake"
 	apisixinformers "github.com/apache/apisix-ingress-controller/pkg/kube/apisix/client/informers/externalversions"
@@ -533,3 +532,154 @@ func TestTranslateTrafficSplitPluginBadCases(t *testing.T) {
 	assert.Nil(t, cfg)
 	assert.Equal(t, err.Error(), "conflict headless service and backend resolve granularity")
 }
+
+func TestTranslateConsumerKeyAuthPluginWithInPlaceValue(t *testing.T) {
+	keyAuth := &configv2alpha1.ApisixConsumerKeyAuth{
+		Value: &configv2alpha1.ApisixConsumerKeyAuthValue{Key: "abc"},
+	}
+	cfg, err := (&translator{}).translateConsumerKeyAuthPlugin("default", keyAuth)
+	assert.Nil(t, err)
+	assert.Equal(t, cfg.Key, "abc")
+}
+
+func TestTranslateConsumerKeyAuthWithSecretRef(t *testing.T) {
+	sec := &corev1.Secret{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: "abc-key-auth",
+		},
+		Data: map[string][]byte{
+			"key": []byte("abc"),
+		},
+	}
+	client := fake.NewSimpleClientset()
+	informersFactory := informers.NewSharedInformerFactory(client, 0)
+	secretInformer := informersFactory.Core().V1().Secrets().Informer()
+	secretLister := informersFactory.Core().V1().Secrets().Lister()
+	processCh := make(chan struct{})
+	stopCh := make(chan struct{})
+	secretInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
+		AddFunc: func(_ interface{}) {
+			processCh <- struct{}{}
+		},
+		UpdateFunc: func(_, _ interface{}) {
+			processCh <- struct{}{}
+		},
+	})
+	go secretInformer.Run(stopCh)
+
+	tr := &translator{
+		&TranslatorOptions{
+			SecretLister: secretLister,
+		},
+	}
+	_, err := client.CoreV1().Secrets("default").Create(context.Background(), sec, metav1.CreateOptions{})
+	assert.Nil(t, err)
+
+	<-processCh
+
+	keyAuth := &configv2alpha1.ApisixConsumerKeyAuth{
+		SecretRef: &corev1.LocalObjectReference{Name: "abc-key-auth"},
+	}
+	cfg, err := tr.translateConsumerKeyAuthPlugin("default", keyAuth)
+	assert.Nil(t, err)
+	assert.Equal(t, cfg.Key, "abc")
+
+	cfg, err = tr.translateConsumerKeyAuthPlugin("default2", keyAuth)
+	assert.Nil(t, cfg)
+	assert.Contains(t, err.Error(), "not found")
+
+	delete(sec.Data, "key")
+	_, err = client.CoreV1().Secrets("default").Update(context.Background(), sec, metav1.UpdateOptions{})
+	assert.Nil(t, err)
+	<-processCh
+
+	cfg, err = tr.translateConsumerKeyAuthPlugin("default", keyAuth)
+	assert.Nil(t, cfg)
+	assert.Equal(t, err, _errKeyNotFoundOrInvalid)
+
+	close(processCh)
+	close(stopCh)
+}
+
+func TestTranslateConsumerBasicAuthPluginWithInPlaceValue(t *testing.T) {
+	basicAuth := &configv2alpha1.ApisixConsumerBasicAuth{
+		Value: &configv2alpha1.ApisixConsumerBasicAuthValue{
+			Username: "jack",
+			Password: "jacknice",
+		},
+	}
+	cfg, err := (&translator{}).translateConsumerBasicAuthPlugin("default", basicAuth)
+	assert.Nil(t, err)
+	assert.Equal(t, cfg.Username, "jack")
+	assert.Equal(t, cfg.Password, "jacknice")
+}
+
+func TestTranslateConsumerBasicAuthWithSecretRef(t *testing.T) {
+	sec := &corev1.Secret{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: "jack-basic-auth",
+		},
+		Data: map[string][]byte{
+			"username": []byte("jack"),
+			"password": []byte("jacknice"),
+		},
+	}
+	client := fake.NewSimpleClientset()
+	informersFactory := informers.NewSharedInformerFactory(client, 0)
+	secretInformer := informersFactory.Core().V1().Secrets().Informer()
+	secretLister := informersFactory.Core().V1().Secrets().Lister()
+	processCh := make(chan struct{})
+	stopCh := make(chan struct{})
+	secretInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
+		AddFunc: func(_ interface{}) {
+			processCh <- struct{}{}
+		},
+		UpdateFunc: func(_, _ interface{}) {
+			processCh <- struct{}{}
+		},
+	})
+	go secretInformer.Run(stopCh)
+
+	tr := &translator{
+		&TranslatorOptions{
+			SecretLister: secretLister,
+		},
+	}
+	_, err := client.CoreV1().Secrets("default").Create(context.Background(), sec, metav1.CreateOptions{})
+	assert.Nil(t, err)
+
+	<-processCh
+
+	basicAuth := &configv2alpha1.ApisixConsumerBasicAuth{
+		SecretRef: &corev1.LocalObjectReference{Name: "jack-basic-auth"},
+	}
+	cfg, err := tr.translateConsumerBasicAuthPlugin("default", basicAuth)
+	assert.Nil(t, err)
+	assert.Equal(t, cfg.Username, "jack")
+	assert.Equal(t, cfg.Password, "jacknice")
+
+	cfg, err = tr.translateConsumerBasicAuthPlugin("default2", basicAuth)
+	assert.Nil(t, cfg)
+	assert.Contains(t, err.Error(), "not found")
+
+	delete(sec.Data, "password")
+	_, err = client.CoreV1().Secrets("default").Update(context.Background(), sec, metav1.UpdateOptions{})
+	assert.Nil(t, err)
+	<-processCh
+
+	cfg, err = tr.translateConsumerBasicAuthPlugin("default", basicAuth)
+	assert.Nil(t, cfg)
+	assert.Equal(t, err, _errPasswordNotFoundOrInvalid)
+
+	delete(sec.Data, "username")
+	_, err = client.CoreV1().Secrets("default").Update(context.Background(), sec, metav1.UpdateOptions{})
+	assert.Nil(t, err)
+	<-processCh
+
+	cfg, err = tr.translateConsumerBasicAuthPlugin("default", basicAuth)
+	assert.Nil(t, cfg)
+	assert.Equal(t, err, _errUsernameNotFoundOrInvalid)
+
+	close(processCh)
+	close(stopCh)
+}
diff --git a/pkg/kube/translation/translator.go b/pkg/kube/translation/translator.go
index 9742d2a..5b6c753 100644
--- a/pkg/kube/translation/translator.go
+++ b/pkg/kube/translation/translator.go
@@ -68,7 +68,10 @@ type Translator interface {
 	TranslateSSL(*configv1.ApisixTls) (*apisixv1.Ssl, error)
 	// TranslateClusterConfig translates the configv2alpha1.ApisixClusterConfig object into the APISIX
 	// Global Rule resource.
-	TranslateClusterConfig(config *configv2alpha1.ApisixClusterConfig) (*apisixv1.GlobalRule, error)
+	TranslateClusterConfig(*configv2alpha1.ApisixClusterConfig) (*apisixv1.GlobalRule, error)
+	// TranslateApisixConsumer translates the configv2alpha1.APisixConsumer object into the APISIX Consumer
+	// resource.
+	TranslateApisixConsumer(*configv2alpha1.ApisixConsumer) (*apisixv1.Consumer, error)
 }
 
 // TranslatorOptions contains options to help Translator
diff --git a/pkg/types/apisix/v1/plugin_types.go b/pkg/types/apisix/v1/plugin_types.go
index a9f505f..11e5788 100644
--- a/pkg/types/apisix/v1/plugin_types.go
+++ b/pkg/types/apisix/v1/plugin_types.go
@@ -49,6 +49,32 @@ type CorsConfig struct {
 	AllowHeaders string `json:"allow_headers,omitempty"`
 }
 
+// KeyAuthConsumerConfig is the rule config for key-auth plugin
+// used in Consumer object.
+// +k8s:deepcopy-gen=true
+type KeyAuthConsumerConfig struct {
+	Key string `json:"key"`
+}
+
+// KeyAuthRouteConfig is the rule config for key-auth plugin
+// used in Route object.
+type KeyAuthRouteConfig struct {
+	Header string `json:"header,omitempty"`
+}
+
+// BasicAuthConsumerConfig is the rule config for basic-auth plugin
+// used in Consumer object.
+// +k8s:deepcopy-gen=true
+type BasicAuthConsumerConfig struct {
+	Username string `json:"username"`
+	Password string `json:"password"`
+}
+
+// BasicAuthRouteConfig is the rule config for basic-auth plugin
+// used in Route object.
+// +k8s:deepcopy-gen=true
+type BasicAuthRouteConfig struct{}
+
 // RewriteConfig is the rule config for proxy-rewrite plugin.
 // +k8s:deepcopy-gen=true
 type RewriteConfig struct {
diff --git a/pkg/types/apisix/v1/types.go b/pkg/types/apisix/v1/types.go
index 153e97d..393b461 100644
--- a/pkg/types/apisix/v1/types.go
+++ b/pkg/types/apisix/v1/types.go
@@ -369,6 +369,16 @@ func NewDefaultStreamRoute() *StreamRoute {
 	}
 }
 
+// NewDefaultConsumer returns an empty Consumer with default values.
+func NewDefaultConsumer() *Consumer {
+	return &Consumer{
+		Desc: "Created by apisix-ingress-controller, DO NOT modify it manually",
+		Labels: map[string]string{
+			"managed-by": "apisix-ingress-controller",
+		},
+	}
+}
+
 // ComposeUpstreamName uses namespace, name and port info to compose
 // the upstream name.
 func ComposeUpstreamName(namespace, name string, port int32) string {
@@ -421,3 +431,16 @@ func ComposeStreamRouteName(namespace, name string, rule string) string {
 
 	return buf.String()
 }
+
+// ComposeConsumerName uses namespace and name of ApisixConsumer to compose
+// the Consumer name.
+func ComposeConsumerName(namespace, name string) string {
+	p := make([]byte, 0, len(namespace)+len(name)+1)
+	buf := bytes.NewBuffer(p)
+
+	buf.WriteString(namespace)
+	buf.WriteString("_")
+	buf.WriteString(name)
+
+	return buf.String()
+}
diff --git a/pkg/types/apisix/v1/zz_generated.deepcopy.go b/pkg/types/apisix/v1/zz_generated.deepcopy.go
index b75a91d..c798922 100644
--- a/pkg/types/apisix/v1/zz_generated.deepcopy.go
+++ b/pkg/types/apisix/v1/zz_generated.deepcopy.go
@@ -1,25 +1,58 @@
 // +build !ignore_autogenerated
 
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+/*
+Copyright The Kubernetes 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 deepcopy-gen. DO NOT EDIT.
 
 package v1
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *BasicAuthConsumerConfig) DeepCopyInto(out *BasicAuthConsumerConfig) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuthConsumerConfig.
+func (in *BasicAuthConsumerConfig) DeepCopy() *BasicAuthConsumerConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(BasicAuthConsumerConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *BasicAuthRouteConfig) DeepCopyInto(out *BasicAuthRouteConfig) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuthRouteConfig.
+func (in *BasicAuthRouteConfig) DeepCopy() *BasicAuthRouteConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(BasicAuthRouteConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Consumer) DeepCopyInto(out *Consumer) {
 	*out = *in
 	if in.Labels != nil {
@@ -103,6 +136,22 @@ func (in *IPRestrictConfig) DeepCopy() *IPRestrictConfig {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *KeyAuthConsumerConfig) DeepCopyInto(out *KeyAuthConsumerConfig) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeyAuthConsumerConfig.
+func (in *KeyAuthConsumerConfig) DeepCopy() *KeyAuthConsumerConfig {
+	if in == nil {
+		return nil
+	}
+	out := new(KeyAuthConsumerConfig)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *Metadata) DeepCopyInto(out *Metadata) {
 	*out = *in
 	if in.Labels != nil {