From bb352763671517082baea66ab8f0a61ca7be1265 Mon Sep 17 00:00:00 2001 From: oliver Date: Fri, 30 Jul 2021 18:11:58 +0800 Subject: [PATCH 1/3] feat: route crd add plugin_config_id/timeout fields --- pkg/kube/apisix/apis/config/v1/types.go | 8 ++++--- pkg/kube/apisix/apis/config/v2alpha1/types.go | 9 +++++++ pkg/kube/apisix/apis/config/v2beta1/types.go | 9 +++++++ pkg/kube/translation/apisix_route.go | 18 ++++++++++++++ pkg/types/apisix/v1/types.go | 24 ++++++++++--------- samples/deploy/crd/v1beta1/ApisixRoute.yaml | 11 +++++++++ 6 files changed, 65 insertions(+), 14 deletions(-) diff --git a/pkg/kube/apisix/apis/config/v1/types.go b/pkg/kube/apisix/apis/config/v1/types.go index a8b91816a4c..a535791c309 100644 --- a/pkg/kube/apisix/apis/config/v1/types.go +++ b/pkg/kube/apisix/apis/config/v1/types.go @@ -55,9 +55,11 @@ type Http struct { // Path defines an URI based route rule. type Path struct { - Path string `json:"path,omitempty" yaml:"path,omitempty"` - Backend Backend `json:"backend,omitempty" yaml:"backend,omitempty"` - Plugins []Plugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` + Path string `json:"path,omitempty" yaml:"path,omitempty"` + Backend Backend `json:"backend,omitempty" yaml:"backend,omitempty"` + Timeout *UpstreamTimeout `json:"timeout,omitempty" yaml:"timeout,omitempty"` + Plugins []Plugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` + PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` } // Backend defines an upstream, it should be an existing Kubernetes Service. diff --git a/pkg/kube/apisix/apis/config/v2alpha1/types.go b/pkg/kube/apisix/apis/config/v2alpha1/types.go index f5d08c2e983..17121a46d50 100644 --- a/pkg/kube/apisix/apis/config/v2alpha1/types.go +++ b/pkg/kube/apisix/apis/config/v2alpha1/types.go @@ -90,6 +90,7 @@ type ApisixRouteHTTP struct { // same URI path (for path matching), route with // higher priority will take effect. Priority int `json:"priority,omitempty" yaml:"priority,omitempty"` + Timeout *UpstreamTimeout `json:"timeout,omitempty" yaml:"timeout,omitempty"` Match *ApisixRouteHTTPMatch `json:"match,omitempty" yaml:"match,omitempty"` // Deprecated: Backend will be removed in the future, use Backends instead. Backend *ApisixRouteHTTPBackend `json:"backend" yaml:"backend"` @@ -99,6 +100,7 @@ type ApisixRouteHTTP struct { Backends []*ApisixRouteHTTPBackend `json:"backends" yaml:"backends"` Websocket bool `json:"websocket" yaml:"websocket"` Plugins []*ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` + PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` Authentication *ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"` } @@ -195,6 +197,13 @@ type ApisixRouteHTTPPlugin struct { // any plugins. type ApisixRouteHTTPPluginConfig map[string]interface{} +// UpstreamTimeout is settings for the read, send and connect to the upstream. +type UpstreamTimeout struct { + Connect metav1.Duration `json:"connect,omitempty" yaml:"connect,omitempty"` + Send metav1.Duration `json:"send,omitempty" yaml:"send,omitempty"` + Read metav1.Duration `json:"read,omitempty" yaml:"read,omitempty"` +} + // ApisixRouteAuthentication is the authentication-related // configuration in ApisixRoute. type ApisixRouteAuthentication struct { diff --git a/pkg/kube/apisix/apis/config/v2beta1/types.go b/pkg/kube/apisix/apis/config/v2beta1/types.go index 21eb5f66bf3..c27232022e2 100644 --- a/pkg/kube/apisix/apis/config/v2beta1/types.go +++ b/pkg/kube/apisix/apis/config/v2beta1/types.go @@ -45,6 +45,13 @@ type ApisixRouteSpec struct { Stream []ApisixRouteStream `json:"stream,omitempty" yaml:"stream,omitempty"` } +// UpstreamTimeout is settings for the read, send and connect to the upstream. +type UpstreamTimeout struct { + Connect metav1.Duration `json:"connect,omitempty" yaml:"connect,omitempty"` + Send metav1.Duration `json:"send,omitempty" yaml:"send,omitempty"` + Read metav1.Duration `json:"read,omitempty" yaml:"read,omitempty"` +} + // ApisixRouteHTTP represents a single route in for HTTP traffic. type ApisixRouteHTTP struct { // The rule name, cannot be empty. @@ -53,6 +60,7 @@ type ApisixRouteHTTP struct { // same URI path (for path matching), route with // higher priority will take effect. Priority int `json:"priority,omitempty" yaml:"priority,omitempty"` + Timeout *UpstreamTimeout `json:"timeout,omitempty" yaml:"timeout,omitempty"` Match ApisixRouteHTTPMatch `json:"match,omitempty" yaml:"match,omitempty"` // Deprecated: Backend will be removed in the future, use Backends instead. Backend v2alpha1.ApisixRouteHTTPBackend `json:"backend" yaml:"backend"` @@ -62,6 +70,7 @@ type ApisixRouteHTTP struct { Backends []v2alpha1.ApisixRouteHTTPBackend `json:"backends" yaml:"backends"` Websocket bool `json:"websocket" yaml:"websocket"` Plugins []ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` + PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` Authentication ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"` } diff --git a/pkg/kube/translation/apisix_route.go b/pkg/kube/translation/apisix_route.go index 3cd4c765ae6..ebef83e09c1 100644 --- a/pkg/kube/translation/apisix_route.go +++ b/pkg/kube/translation/apisix_route.go @@ -304,6 +304,22 @@ func (t *translator) translateHTTPRoute(ctx *TranslateContext, ar *configv2alpha return err } + timeout := &apisixv1.UpstreamTimeout{ + Connect: apisixv1.DefaultUpstreamTimeout, + Read: apisixv1.DefaultUpstreamTimeout, + Send: apisixv1.DefaultUpstreamTimeout, + } + if part.Timeout != nil { + if part.Timeout.Connect.Duration > 0 { + timeout.Connect = int(part.Timeout.Connect.Seconds()) + } + if part.Timeout.Read.Duration > 0 { + timeout.Read = int(part.Timeout.Read.Seconds()) + } + if part.Timeout.Send.Duration > 0 { + timeout.Send = int(part.Timeout.Send.Seconds()) + } + } pluginMap := make(apisixv1.Plugins) // 2.add route plugins for _, plugin := range part.Plugins { @@ -362,6 +378,8 @@ func (t *translator) translateHTTPRoute(ctx *TranslateContext, ar *configv2alpha route.UpstreamId = id.GenID(upstreamName) route.EnableWebsocket = part.Websocket route.Plugins = pluginMap + route.PluginConfigID = part.PluginConfigID + route.Timeout = timeout if len(backends) > 0 { weight := _defaultWeight diff --git a/pkg/types/apisix/v1/types.go b/pkg/types/apisix/v1/types.go index 9c273339c0f..0e13758a513 100644 --- a/pkg/types/apisix/v1/types.go +++ b/pkg/types/apisix/v1/types.go @@ -84,17 +84,19 @@ type Metadata struct { type Route struct { Metadata `json:",inline" yaml:",inline"` - Host string `json:"host,omitempty" yaml:"host,omitempty"` - Hosts []string `json:"hosts,omitempty" yaml:"hosts,omitempty"` - Uri string `json:"uri,omitempty" yaml:"uri,omitempty"` - Priority int `json:"priority,omitempty" yaml:"priority,omitempty"` - Vars Vars `json:"vars,omitempty" yaml:"vars,omitempty"` - Uris []string `json:"uris,omitempty" yaml:"uris,omitempty"` - Methods []string `json:"methods,omitempty" yaml:"methods,omitempty"` - EnableWebsocket bool `json:"enable_websocket,omitempty" yaml:"enable_websocket,omitempty"` - RemoteAddrs []string `json:"remote_addrs,omitempty" yaml:"remote_addrs,omitempty"` - UpstreamId string `json:"upstream_id,omitempty" yaml:"upstream_id,omitempty"` - Plugins Plugins `json:"plugins,omitempty" yaml:"plugins,omitempty"` + Host string `json:"host,omitempty" yaml:"host,omitempty"` + Hosts []string `json:"hosts,omitempty" yaml:"hosts,omitempty"` + Uri string `json:"uri,omitempty" yaml:"uri,omitempty"` + Priority int `json:"priority,omitempty" yaml:"priority,omitempty"` + Timeout *UpstreamTimeout `json:"timeout,omitempty" yaml:"timeout,omitempty"` + Vars Vars `json:"vars,omitempty" yaml:"vars,omitempty"` + Uris []string `json:"uris,omitempty" yaml:"uris,omitempty"` + Methods []string `json:"methods,omitempty" yaml:"methods,omitempty"` + EnableWebsocket bool `json:"enable_websocket,omitempty" yaml:"enable_websocket,omitempty"` + RemoteAddrs []string `json:"remote_addrs,omitempty" yaml:"remote_addrs,omitempty"` + UpstreamId string `json:"upstream_id,omitempty" yaml:"upstream_id,omitempty"` + Plugins Plugins `json:"plugins,omitempty" yaml:"plugins,omitempty"` + PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` } // Vars represents the route match expressions of APISIX. diff --git a/samples/deploy/crd/v1beta1/ApisixRoute.yaml b/samples/deploy/crd/v1beta1/ApisixRoute.yaml index bb63b39b125..3c983c5567b 100644 --- a/samples/deploy/crd/v1beta1/ApisixRoute.yaml +++ b/samples/deploy/crd/v1beta1/ApisixRoute.yaml @@ -86,6 +86,15 @@ spec: minLength: 1 priority: type: integer + timeout: + type: object + properties: + connect: + type: string + send: + type: string + read: + type: string match: type: object required: @@ -215,6 +224,8 @@ spec: required: - name - enable + plugin_config_id: + type: string authentication: type: object properties: From f387ceed3212510954523dd06bf0c03d13025c14 Mon Sep 17 00:00:00 2001 From: oliver Date: Fri, 30 Jul 2021 19:04:52 +0800 Subject: [PATCH 2/3] fix types generated --- .../apis/config/v1/zz_generated.deepcopy.go | 5 ++++ .../config/v2alpha1/zz_generated.deepcopy.go | 24 +++++++++++++++++++ .../config/v2beta1/zz_generated.deepcopy.go | 24 +++++++++++++++++++ pkg/types/apisix/v1/zz_generated.deepcopy.go | 5 ++++ 4 files changed, 58 insertions(+) diff --git a/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go b/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go index c0f4d329137..2dfed52e249 100644 --- a/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go +++ b/pkg/kube/apisix/apis/config/v1/zz_generated.deepcopy.go @@ -610,6 +610,11 @@ func (in *PassiveHealthCheckUnhealthy) DeepCopy() *PassiveHealthCheckUnhealthy { func (in *Path) DeepCopyInto(out *Path) { *out = *in out.Backend = in.Backend + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(UpstreamTimeout) + **out = **in + } if in.Plugins != nil { in, out := &in.Plugins, &out.Plugins *out = make([]Plugin, len(*in)) diff --git a/pkg/kube/apisix/apis/config/v2alpha1/zz_generated.deepcopy.go b/pkg/kube/apisix/apis/config/v2alpha1/zz_generated.deepcopy.go index 107459ba892..b6d05cefb16 100644 --- a/pkg/kube/apisix/apis/config/v2alpha1/zz_generated.deepcopy.go +++ b/pkg/kube/apisix/apis/config/v2alpha1/zz_generated.deepcopy.go @@ -435,6 +435,11 @@ func (in *ApisixRouteAuthenticationKeyAuth) DeepCopy() *ApisixRouteAuthenticatio // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApisixRouteHTTP) DeepCopyInto(out *ApisixRouteHTTP) { *out = *in + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(UpstreamTimeout) + **out = **in + } if in.Match != nil { in, out := &in.Match, &out.Match *out = new(ApisixRouteHTTPMatch) @@ -758,3 +763,22 @@ func (in *ApisixStatus) DeepCopy() *ApisixStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpstreamTimeout) DeepCopyInto(out *UpstreamTimeout) { + *out = *in + out.Connect = in.Connect + out.Send = in.Send + out.Read = in.Read + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamTimeout. +func (in *UpstreamTimeout) DeepCopy() *UpstreamTimeout { + if in == nil { + return nil + } + out := new(UpstreamTimeout) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/kube/apisix/apis/config/v2beta1/zz_generated.deepcopy.go b/pkg/kube/apisix/apis/config/v2beta1/zz_generated.deepcopy.go index f064c5e2429..e835ddfebd1 100644 --- a/pkg/kube/apisix/apis/config/v2beta1/zz_generated.deepcopy.go +++ b/pkg/kube/apisix/apis/config/v2beta1/zz_generated.deepcopy.go @@ -89,6 +89,11 @@ func (in *ApisixRouteAuthenticationKeyAuth) DeepCopy() *ApisixRouteAuthenticatio // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApisixRouteHTTP) DeepCopyInto(out *ApisixRouteHTTP) { *out = *in + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(UpstreamTimeout) + **out = **in + } in.Match.DeepCopyInto(&out.Match) in.Backend.DeepCopyInto(&out.Backend) if in.Backends != nil { @@ -329,3 +334,22 @@ func (in *ApisixStatus) DeepCopy() *ApisixStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpstreamTimeout) DeepCopyInto(out *UpstreamTimeout) { + *out = *in + out.Connect = in.Connect + out.Send = in.Send + out.Read = in.Read + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamTimeout. +func (in *UpstreamTimeout) DeepCopy() *UpstreamTimeout { + if in == nil { + return nil + } + out := new(UpstreamTimeout) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/types/apisix/v1/zz_generated.deepcopy.go b/pkg/types/apisix/v1/zz_generated.deepcopy.go index 64fcdba36bc..0ca8e2c9d1a 100644 --- a/pkg/types/apisix/v1/zz_generated.deepcopy.go +++ b/pkg/types/apisix/v1/zz_generated.deepcopy.go @@ -235,6 +235,11 @@ func (in *Route) DeepCopyInto(out *Route) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(UpstreamTimeout) + **out = **in + } if in.Vars != nil { in, out := &in.Vars, &out.Vars *out = make(Vars, len(*in)) From 7b00277992928429bf26bd62d49f70ac013b16dd Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 18 Aug 2021 15:33:25 +0800 Subject: [PATCH 3/3] remove plugin_config_id field --- pkg/kube/apisix/apis/config/v1/types.go | 9 ++++----- pkg/kube/apisix/apis/config/v2alpha1/types.go | 1 - pkg/kube/apisix/apis/config/v2beta1/types.go | 1 - pkg/kube/translation/apisix_route.go | 1 - pkg/types/apisix/v1/types.go | 1 - samples/deploy/crd/v1beta1/ApisixRoute.yaml | 2 -- 6 files changed, 4 insertions(+), 11 deletions(-) diff --git a/pkg/kube/apisix/apis/config/v1/types.go b/pkg/kube/apisix/apis/config/v1/types.go index a535791c309..3eea11af834 100644 --- a/pkg/kube/apisix/apis/config/v1/types.go +++ b/pkg/kube/apisix/apis/config/v1/types.go @@ -55,11 +55,10 @@ type Http struct { // Path defines an URI based route rule. type Path struct { - Path string `json:"path,omitempty" yaml:"path,omitempty"` - Backend Backend `json:"backend,omitempty" yaml:"backend,omitempty"` - Timeout *UpstreamTimeout `json:"timeout,omitempty" yaml:"timeout,omitempty"` - Plugins []Plugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` - PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` + Path string `json:"path,omitempty" yaml:"path,omitempty"` + Backend Backend `json:"backend,omitempty" yaml:"backend,omitempty"` + Timeout *UpstreamTimeout `json:"timeout,omitempty" yaml:"timeout,omitempty"` + Plugins []Plugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` } // Backend defines an upstream, it should be an existing Kubernetes Service. diff --git a/pkg/kube/apisix/apis/config/v2alpha1/types.go b/pkg/kube/apisix/apis/config/v2alpha1/types.go index 17121a46d50..ff5b6628b14 100644 --- a/pkg/kube/apisix/apis/config/v2alpha1/types.go +++ b/pkg/kube/apisix/apis/config/v2alpha1/types.go @@ -100,7 +100,6 @@ type ApisixRouteHTTP struct { Backends []*ApisixRouteHTTPBackend `json:"backends" yaml:"backends"` Websocket bool `json:"websocket" yaml:"websocket"` Plugins []*ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` - PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` Authentication *ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"` } diff --git a/pkg/kube/apisix/apis/config/v2beta1/types.go b/pkg/kube/apisix/apis/config/v2beta1/types.go index c27232022e2..7bed6aaf552 100644 --- a/pkg/kube/apisix/apis/config/v2beta1/types.go +++ b/pkg/kube/apisix/apis/config/v2beta1/types.go @@ -70,7 +70,6 @@ type ApisixRouteHTTP struct { Backends []v2alpha1.ApisixRouteHTTPBackend `json:"backends" yaml:"backends"` Websocket bool `json:"websocket" yaml:"websocket"` Plugins []ApisixRouteHTTPPlugin `json:"plugins,omitempty" yaml:"plugins,omitempty"` - PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` Authentication ApisixRouteAuthentication `json:"authentication,omitempty" yaml:"authentication,omitempty"` } diff --git a/pkg/kube/translation/apisix_route.go b/pkg/kube/translation/apisix_route.go index ebef83e09c1..9f717276766 100644 --- a/pkg/kube/translation/apisix_route.go +++ b/pkg/kube/translation/apisix_route.go @@ -378,7 +378,6 @@ func (t *translator) translateHTTPRoute(ctx *TranslateContext, ar *configv2alpha route.UpstreamId = id.GenID(upstreamName) route.EnableWebsocket = part.Websocket route.Plugins = pluginMap - route.PluginConfigID = part.PluginConfigID route.Timeout = timeout if len(backends) > 0 { diff --git a/pkg/types/apisix/v1/types.go b/pkg/types/apisix/v1/types.go index 0e13758a513..64dfa1eadc2 100644 --- a/pkg/types/apisix/v1/types.go +++ b/pkg/types/apisix/v1/types.go @@ -96,7 +96,6 @@ type Route struct { RemoteAddrs []string `json:"remote_addrs,omitempty" yaml:"remote_addrs,omitempty"` UpstreamId string `json:"upstream_id,omitempty" yaml:"upstream_id,omitempty"` Plugins Plugins `json:"plugins,omitempty" yaml:"plugins,omitempty"` - PluginConfigID string `json:"plugin_config_id,omitempty" yaml:"plugin_config_id,omitempty"` } // Vars represents the route match expressions of APISIX. diff --git a/samples/deploy/crd/v1beta1/ApisixRoute.yaml b/samples/deploy/crd/v1beta1/ApisixRoute.yaml index 3c983c5567b..aeea23396c4 100644 --- a/samples/deploy/crd/v1beta1/ApisixRoute.yaml +++ b/samples/deploy/crd/v1beta1/ApisixRoute.yaml @@ -224,8 +224,6 @@ spec: required: - name - enable - plugin_config_id: - type: string authentication: type: object properties: