From a1ff44454aea2933e8bd939c1dc34c7aeaafc1d0 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Tue, 27 Apr 2021 12:49:19 -0400 Subject: [PATCH 01/13] change: Creating gloo upstreams from kube services Signed-off-by: Keerthan Ekbote --- pkg/apis/gloo/v1/register.go | 2 + pkg/apis/gloo/v1/types.go | 32 ++++ pkg/apis/gloo/v1/zz_generated.deepcopy.go | 100 ++++++++++ .../typed/gloo/v1/fake/fake_gloo_client.go | 4 + .../typed/gloo/v1/fake/fake_upstream.go | 130 +++++++++++++ .../typed/gloo/v1/generated_expansion.go | 2 + .../versioned/typed/gloo/v1/gloo_client.go | 5 + .../versioned/typed/gloo/v1/upstream.go | 178 ++++++++++++++++++ .../informers/externalversions/generic.go | 2 + .../externalversions/gloo/v1/interface.go | 7 + .../externalversions/gloo/v1/upstream.go | 90 +++++++++ .../listers/gloo/v1/expansion_generated.go | 8 + pkg/client/listers/gloo/v1/upstream.go | 99 ++++++++++ pkg/router/factory.go | 5 - pkg/router/gloo.go | 49 +++-- 15 files changed, 697 insertions(+), 16 deletions(-) create mode 100644 pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go create mode 100644 pkg/client/clientset/versioned/typed/gloo/v1/upstream.go create mode 100644 pkg/client/informers/externalversions/gloo/v1/upstream.go create mode 100644 pkg/client/listers/gloo/v1/upstream.go diff --git a/pkg/apis/gloo/v1/register.go b/pkg/apis/gloo/v1/register.go index 46c167ae1..4775e12b0 100755 --- a/pkg/apis/gloo/v1/register.go +++ b/pkg/apis/gloo/v1/register.go @@ -30,6 +30,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &RouteTable{}, &RouteTableList{}, + &Upstream{}, + &UpstreamList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/pkg/apis/gloo/v1/types.go b/pkg/apis/gloo/v1/types.go index c9f54abcf..689656d90 100644 --- a/pkg/apis/gloo/v1/types.go +++ b/pkg/apis/gloo/v1/types.go @@ -19,6 +19,28 @@ type RouteTableSpec struct { Routes []Route `json:"routes,omitempty"` } +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Upstream is a specification for a Gloo Upstream resource +type Upstream struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + UpstreamType UpstreamType `json:"upstream_type,omitempty"` +} + +type UpstreamType struct { + Kube KubeUpstream `json:"kube,omitempty"` +} + +type KubeUpstream struct { + ServiceName string `json:"service_name,omitempty""` + ServiceNamespace string `json:"service_namespace,omitempty"` + ServicePort int32 `json:"service_port,omitempty"` + Selector map[string]string `json:"selector,omitempty"` +} + type Route struct { Matchers []Matcher `json:"matchers,omitempty"` Action RouteAction `json:"routeAction,omitempty"` @@ -80,3 +102,13 @@ type RouteTableList struct { Items []RouteTable `json:"items"` } + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// UpstreamList is a list of Upstream resources +type UpstreamList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []Upstream `json:"items"` +} diff --git a/pkg/apis/gloo/v1/zz_generated.deepcopy.go b/pkg/apis/gloo/v1/zz_generated.deepcopy.go index 44a00d9a7..596a0d94a 100644 --- a/pkg/apis/gloo/v1/zz_generated.deepcopy.go +++ b/pkg/apis/gloo/v1/zz_generated.deepcopy.go @@ -57,6 +57,29 @@ func (in *HeaderMatcher) DeepCopy() *HeaderMatcher { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubeUpstream) DeepCopyInto(out *KubeUpstream) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeUpstream. +func (in *KubeUpstream) DeepCopy() *KubeUpstream { + if in == nil { + return nil + } + out := new(KubeUpstream) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Matcher) DeepCopyInto(out *Matcher) { *out = *in @@ -265,6 +288,83 @@ func (in *RouteTableSpec) DeepCopy() *RouteTableSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Upstream) DeepCopyInto(out *Upstream) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.UpstreamType.DeepCopyInto(&out.UpstreamType) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Upstream. +func (in *Upstream) DeepCopy() *Upstream { + if in == nil { + return nil + } + out := new(Upstream) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Upstream) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpstreamList) DeepCopyInto(out *UpstreamList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Upstream, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamList. +func (in *UpstreamList) DeepCopy() *UpstreamList { + if in == nil { + return nil + } + out := new(UpstreamList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *UpstreamList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpstreamType) DeepCopyInto(out *UpstreamType) { + *out = *in + in.Kube.DeepCopyInto(&out.Kube) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamType. +func (in *UpstreamType) DeepCopy() *UpstreamType { + if in == nil { + return nil + } + out := new(UpstreamType) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WeightedDestination) DeepCopyInto(out *WeightedDestination) { *out = *in diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go index f2815d437..17bf2941d 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go @@ -32,6 +32,10 @@ func (c *FakeGatewayV1) RouteTables(namespace string) v1.RouteTableInterface { return &FakeRouteTables{c, namespace} } +func (c *FakeGatewayV1) Upstreams(namespace string) v1.UpstreamInterface { + return &FakeUpstreams{c, namespace} +} + // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. func (c *FakeGatewayV1) RESTClient() rest.Interface { diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go new file mode 100644 index 000000000..4669064f3 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go @@ -0,0 +1,130 @@ +/* +Copyright 2020 The Flux 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" + + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + 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" +) + +// FakeUpstreams implements UpstreamInterface +type FakeUpstreams struct { + Fake *FakeGatewayV1 + ns string +} + +var upstreamsResource = schema.GroupVersionResource{Group: "gateway.solo.io", Version: "v1", Resource: "upstreams"} + +var upstreamsKind = schema.GroupVersionKind{Group: "gateway.solo.io", Version: "v1", Kind: "Upstream"} + +// Get takes name of the upstream, and returns the corresponding upstream object, and an error if there is any. +func (c *FakeUpstreams) Get(ctx context.Context, name string, options v1.GetOptions) (result *gloov1.Upstream, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(upstreamsResource, c.ns, name), &gloov1.Upstream{}) + + if obj == nil { + return nil, err + } + return obj.(*gloov1.Upstream), err +} + +// List takes label and field selectors, and returns the list of Upstreams that match those selectors. +func (c *FakeUpstreams) List(ctx context.Context, opts v1.ListOptions) (result *gloov1.UpstreamList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(upstreamsResource, upstreamsKind, c.ns, opts), &gloov1.UpstreamList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &gloov1.UpstreamList{ListMeta: obj.(*gloov1.UpstreamList).ListMeta} + for _, item := range obj.(*gloov1.UpstreamList).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 upstreams. +func (c *FakeUpstreams) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(upstreamsResource, c.ns, opts)) + +} + +// Create takes the representation of a upstream and creates it. Returns the server's representation of the upstream, and an error, if there is any. +func (c *FakeUpstreams) Create(ctx context.Context, upstream *gloov1.Upstream, opts v1.CreateOptions) (result *gloov1.Upstream, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(upstreamsResource, c.ns, upstream), &gloov1.Upstream{}) + + if obj == nil { + return nil, err + } + return obj.(*gloov1.Upstream), err +} + +// Update takes the representation of a upstream and updates it. Returns the server's representation of the upstream, and an error, if there is any. +func (c *FakeUpstreams) Update(ctx context.Context, upstream *gloov1.Upstream, opts v1.UpdateOptions) (result *gloov1.Upstream, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(upstreamsResource, c.ns, upstream), &gloov1.Upstream{}) + + if obj == nil { + return nil, err + } + return obj.(*gloov1.Upstream), err +} + +// Delete takes name of the upstream and deletes it. Returns an error if one occurs. +func (c *FakeUpstreams) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(upstreamsResource, c.ns, name), &gloov1.Upstream{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeUpstreams) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(upstreamsResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &gloov1.UpstreamList{}) + return err +} + +// Patch applies the patch and returns the patched upstream. +func (c *FakeUpstreams) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *gloov1.Upstream, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(upstreamsResource, c.ns, name, pt, data, subresources...), &gloov1.Upstream{}) + + if obj == nil { + return nil, err + } + return obj.(*gloov1.Upstream), err +} diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go b/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go index 972af2a93..d05389b59 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go @@ -19,3 +19,5 @@ limitations under the License. package v1 type RouteTableExpansion interface{} + +type UpstreamExpansion interface{} diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go b/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go index 10e1fe2a5..3c7f6e7dd 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go @@ -27,6 +27,7 @@ import ( type GatewayV1Interface interface { RESTClient() rest.Interface RouteTablesGetter + UpstreamsGetter } // GatewayV1Client is used to interact with features provided by the gateway.solo.io group. @@ -38,6 +39,10 @@ func (c *GatewayV1Client) RouteTables(namespace string) RouteTableInterface { return newRouteTables(c, namespace) } +func (c *GatewayV1Client) Upstreams(namespace string) UpstreamInterface { + return newUpstreams(c, namespace) +} + // NewForConfig creates a new GatewayV1Client for the given config. func NewForConfig(c *rest.Config) (*GatewayV1Client, error) { config := *c diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/upstream.go b/pkg/client/clientset/versioned/typed/gloo/v1/upstream.go new file mode 100644 index 000000000..c8f9eebc1 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/gloo/v1/upstream.go @@ -0,0 +1,178 @@ +/* +Copyright 2020 The Flux 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 v1 + +import ( + "context" + "time" + + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + scheme "github.com/fluxcd/flagger/pkg/client/clientset/versioned/scheme" + metav1 "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" +) + +// UpstreamsGetter has a method to return a UpstreamInterface. +// A group's client should implement this interface. +type UpstreamsGetter interface { + Upstreams(namespace string) UpstreamInterface +} + +// UpstreamInterface has methods to work with Upstream resources. +type UpstreamInterface interface { + Create(ctx context.Context, upstream *v1.Upstream, opts metav1.CreateOptions) (*v1.Upstream, error) + Update(ctx context.Context, upstream *v1.Upstream, opts metav1.UpdateOptions) (*v1.Upstream, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Upstream, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.UpstreamList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Upstream, err error) + UpstreamExpansion +} + +// upstreams implements UpstreamInterface +type upstreams struct { + client rest.Interface + ns string +} + +// newUpstreams returns a Upstreams +func newUpstreams(c *GatewayV1Client, namespace string) *upstreams { + return &upstreams{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the upstream, and returns the corresponding upstream object, and an error if there is any. +func (c *upstreams) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.Upstream, err error) { + result = &v1.Upstream{} + err = c.client.Get(). + Namespace(c.ns). + Resource("upstreams"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Upstreams that match those selectors. +func (c *upstreams) List(ctx context.Context, opts metav1.ListOptions) (result *v1.UpstreamList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.UpstreamList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("upstreams"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested upstreams. +func (c *upstreams) Watch(ctx context.Context, opts metav1.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("upstreams"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a upstream and creates it. Returns the server's representation of the upstream, and an error, if there is any. +func (c *upstreams) Create(ctx context.Context, upstream *v1.Upstream, opts metav1.CreateOptions) (result *v1.Upstream, err error) { + result = &v1.Upstream{} + err = c.client.Post(). + Namespace(c.ns). + Resource("upstreams"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(upstream). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a upstream and updates it. Returns the server's representation of the upstream, and an error, if there is any. +func (c *upstreams) Update(ctx context.Context, upstream *v1.Upstream, opts metav1.UpdateOptions) (result *v1.Upstream, err error) { + result = &v1.Upstream{} + err = c.client.Put(). + Namespace(c.ns). + Resource("upstreams"). + Name(upstream.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(upstream). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the upstream and deletes it. Returns an error if one occurs. +func (c *upstreams) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("upstreams"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *upstreams) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.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("upstreams"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched upstream. +func (c *upstreams) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Upstream, err error) { + result = &v1.Upstream{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("upstreams"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/pkg/client/informers/externalversions/generic.go b/pkg/client/informers/externalversions/generic.go index 5182a4e12..c503fe85f 100644 --- a/pkg/client/informers/externalversions/generic.go +++ b/pkg/client/informers/externalversions/generic.go @@ -87,6 +87,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource // Group=gateway.solo.io, Version=v1 case v1.SchemeGroupVersion.WithResource("routetables"): return &genericInformer{resource: resource.GroupResource(), informer: f.Gateway().V1().RouteTables().Informer()}, nil + case v1.SchemeGroupVersion.WithResource("upstreams"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Gateway().V1().Upstreams().Informer()}, nil // Group=networking.istio.io, Version=v1alpha3 case v1alpha3.SchemeGroupVersion.WithResource("destinationrules"): diff --git a/pkg/client/informers/externalversions/gloo/v1/interface.go b/pkg/client/informers/externalversions/gloo/v1/interface.go index 1b5a8391a..3e9191be1 100644 --- a/pkg/client/informers/externalversions/gloo/v1/interface.go +++ b/pkg/client/informers/externalversions/gloo/v1/interface.go @@ -26,6 +26,8 @@ import ( type Interface interface { // RouteTables returns a RouteTableInformer. RouteTables() RouteTableInformer + // Upstreams returns a UpstreamInformer. + Upstreams() UpstreamInformer } type version struct { @@ -43,3 +45,8 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList func (v *version) RouteTables() RouteTableInformer { return &routeTableInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } + +// Upstreams returns a UpstreamInformer. +func (v *version) Upstreams() UpstreamInformer { + return &upstreamInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/pkg/client/informers/externalversions/gloo/v1/upstream.go b/pkg/client/informers/externalversions/gloo/v1/upstream.go new file mode 100644 index 000000000..c5b61b885 --- /dev/null +++ b/pkg/client/informers/externalversions/gloo/v1/upstream.go @@ -0,0 +1,90 @@ +/* +Copyright 2020 The Flux 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 informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + versioned "github.com/fluxcd/flagger/pkg/client/clientset/versioned" + internalinterfaces "github.com/fluxcd/flagger/pkg/client/informers/externalversions/internalinterfaces" + v1 "github.com/fluxcd/flagger/pkg/client/listers/gloo/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// UpstreamInformer provides access to a shared informer and lister for +// Upstreams. +type UpstreamInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.UpstreamLister +} + +type upstreamInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewUpstreamInformer constructs a new informer for Upstream type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewUpstreamInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredUpstreamInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredUpstreamInformer constructs a new informer for Upstream type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredUpstreamInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.GatewayV1().Upstreams(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.GatewayV1().Upstreams(namespace).Watch(context.TODO(), options) + }, + }, + &gloov1.Upstream{}, + resyncPeriod, + indexers, + ) +} + +func (f *upstreamInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredUpstreamInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *upstreamInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&gloov1.Upstream{}, f.defaultInformer) +} + +func (f *upstreamInformer) Lister() v1.UpstreamLister { + return v1.NewUpstreamLister(f.Informer().GetIndexer()) +} diff --git a/pkg/client/listers/gloo/v1/expansion_generated.go b/pkg/client/listers/gloo/v1/expansion_generated.go index 4902c03fc..d513f28d0 100644 --- a/pkg/client/listers/gloo/v1/expansion_generated.go +++ b/pkg/client/listers/gloo/v1/expansion_generated.go @@ -25,3 +25,11 @@ type RouteTableListerExpansion interface{} // RouteTableNamespaceListerExpansion allows custom methods to be added to // RouteTableNamespaceLister. type RouteTableNamespaceListerExpansion interface{} + +// UpstreamListerExpansion allows custom methods to be added to +// UpstreamLister. +type UpstreamListerExpansion interface{} + +// UpstreamNamespaceListerExpansion allows custom methods to be added to +// UpstreamNamespaceLister. +type UpstreamNamespaceListerExpansion interface{} diff --git a/pkg/client/listers/gloo/v1/upstream.go b/pkg/client/listers/gloo/v1/upstream.go new file mode 100644 index 000000000..0f7af0c20 --- /dev/null +++ b/pkg/client/listers/gloo/v1/upstream.go @@ -0,0 +1,99 @@ +/* +Copyright 2020 The Flux 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 lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// UpstreamLister helps list Upstreams. +// All objects returned here must be treated as read-only. +type UpstreamLister interface { + // List lists all Upstreams in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.Upstream, err error) + // Upstreams returns an object that can list and get Upstreams. + Upstreams(namespace string) UpstreamNamespaceLister + UpstreamListerExpansion +} + +// upstreamLister implements the UpstreamLister interface. +type upstreamLister struct { + indexer cache.Indexer +} + +// NewUpstreamLister returns a new UpstreamLister. +func NewUpstreamLister(indexer cache.Indexer) UpstreamLister { + return &upstreamLister{indexer: indexer} +} + +// List lists all Upstreams in the indexer. +func (s *upstreamLister) List(selector labels.Selector) (ret []*v1.Upstream, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.Upstream)) + }) + return ret, err +} + +// Upstreams returns an object that can list and get Upstreams. +func (s *upstreamLister) Upstreams(namespace string) UpstreamNamespaceLister { + return upstreamNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// UpstreamNamespaceLister helps list and get Upstreams. +// All objects returned here must be treated as read-only. +type UpstreamNamespaceLister interface { + // List lists all Upstreams in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.Upstream, err error) + // Get retrieves the Upstream from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.Upstream, error) + UpstreamNamespaceListerExpansion +} + +// upstreamNamespaceLister implements the UpstreamNamespaceLister +// interface. +type upstreamNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Upstreams in the indexer for a given namespace. +func (s upstreamNamespaceLister) List(selector labels.Selector) (ret []*v1.Upstream, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.Upstream)) + }) + return ret, err +} + +// Get retrieves the Upstream from the indexer for a given namespace and name. +func (s upstreamNamespaceLister) Get(name string) (*v1.Upstream, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("upstream"), name) + } + return obj.(*v1.Upstream), nil +} diff --git a/pkg/router/factory.go b/pkg/router/factory.go index a9f2fbc48..a1b4a03e9 100644 --- a/pkg/router/factory.go +++ b/pkg/router/factory.go @@ -122,16 +122,11 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf ingressClass: factory.ingressClass, } case strings.HasPrefix(provider, flaggerv1.GlooProvider): - upstreamDiscoveryNs := flaggerv1.GlooProvider + "-system" - if strings.HasPrefix(provider, flaggerv1.GlooProvider+":") { - upstreamDiscoveryNs = strings.TrimPrefix(provider, flaggerv1.GlooProvider+":") - } return &GlooRouter{ logger: factory.logger, flaggerClient: factory.flaggerClient, kubeClient: factory.kubeClient, glooClient: factory.meshClient, - upstreamDiscoveryNs: upstreamDiscoveryNs, } case provider == flaggerv1.NGINXProvider: return &IngressRouter{ diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 3e849be37..dfab730d0 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -39,15 +39,23 @@ type GlooRouter struct { glooClient clientset.Interface flaggerClient clientset.Interface logger *zap.SugaredLogger - upstreamDiscoveryNs string } // Reconcile creates or updates the Gloo Edge route table func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { - apexName, _, _ := canary.GetServiceNames() - canaryName := fmt.Sprintf("%s-%s-canary-%v", canary.Namespace, apexName, canary.Spec.Service.Port) - primaryName := fmt.Sprintf("%s-%s-primary-%v", canary.Namespace, apexName, canary.Spec.Service.Port) - + apexName, primaryName, canaryName := canary.GetServiceNames() + canaryUpstreamName := fmt.Sprintf("%s-%s-canaryUpstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + primaryUpstreamName := fmt.Sprintf("%s-%s-primaryUpstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + canaryUs := getGlooUpstreamForKubeService(canary, canaryUpstreamName, canaryName) + primaryUs := getGlooUpstreamForKubeService(canary, primaryUpstreamName, primaryName) + _, err := gr.glooClient.GatewayV1().Upstreams(canary.Namespace).Create(context.TODO(), canaryUs, metav1.CreateOptions{}) + if err != nil { + return err + } + _, err = gr.glooClient.GatewayV1().Upstreams(canary.Namespace).Create(context.TODO(), primaryUs, metav1.CreateOptions{}) + if err != nil { + return err + } newSpec := gloov1.RouteTableSpec{ Routes: []gloov1.Route{ { @@ -59,8 +67,8 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { { Destination: gloov1.Destination{ Upstream: gloov1.ResourceRef{ - Name: primaryName, - Namespace: gr.upstreamDiscoveryNs, + Name: primaryUpstreamName, + Namespace: canary.Namespace, }, }, Weight: 100, @@ -68,8 +76,8 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { { Destination: gloov1.Destination{ Upstream: gloov1.ResourceRef{ - Name: canaryName, - Namespace: gr.upstreamDiscoveryNs, + Name: canaryUpstreamName, + Namespace: canary.Namespace, }, }, Weight: 0, @@ -196,7 +204,7 @@ func (gr *GlooRouter) SetRoutes( Destination: gloov1.Destination{ Upstream: gloov1.ResourceRef{ Name: primaryName, - Namespace: gr.upstreamDiscoveryNs, + Namespace: canary.Namespace, }, }, Weight: uint32(primaryWeight), @@ -205,7 +213,7 @@ func (gr *GlooRouter) SetRoutes( Destination: gloov1.Destination{ Upstream: gloov1.ResourceRef{ Name: canaryName, - Namespace: gr.upstreamDiscoveryNs, + Namespace: canary.Namespace, }, }, Weight: uint32(canaryWeight), @@ -275,3 +283,22 @@ func getMethods(canary *flaggerv1.Canary) []string { } return methods } + +func getGlooUpstreamForKubeService(canary *flaggerv1.Canary, upstreamName, svcName string) *gloov1.Upstream{ + return &gloov1.Upstream{ + ObjectMeta: metav1.ObjectMeta{ + Name: upstreamName, + Namespace: canary.Namespace, + Labels: canary.Spec.Service.Apex.Labels, + Annotations: canary.Spec.Service.Apex.Annotations, + }, + UpstreamType: gloov1.UpstreamType{ + Kube: gloov1.KubeUpstream{ + ServiceName: svcName, + ServiceNamespace: canary.Namespace, + ServicePort: canary.Spec.Service.Port, + Selector: nil, + }, + }, + } +} From 487432d87386b8546a4fd050b72df90287e72890 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Tue, 27 Apr 2021 13:44:21 -0400 Subject: [PATCH 02/13] change: turned off discovery by default in tests Signed-off-by: Keerthan Ekbote --- test/gloo/install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/test/gloo/install.sh b/test/gloo/install.sh index c640e5fe6..23666fb20 100755 --- a/test/gloo/install.sh +++ b/test/gloo/install.sh @@ -12,7 +12,6 @@ kubectl create ns gloo-system helm repo add gloo https://storage.googleapis.com/solo-public-helm helm upgrade -i gloo gloo/gloo --version ${GLOO_VER} \ --namespace gloo-system \ ---set discovery.enabled=true kubectl -n gloo-system rollout status deployment/gloo kubectl -n gloo-system rollout status deployment/gateway From 3f1af1ec8539079d3629d24c96c41597042e1c86 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Tue, 27 Apr 2021 16:52:04 -0400 Subject: [PATCH 03/13] added comment Signed-off-by: Keerthan Ekbote --- pkg/router/gloo.go | 7 ++++++- test/gloo/install.sh | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index dfab730d0..3c5c89e07 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -46,6 +46,11 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { apexName, primaryName, canaryName := canary.GetServiceNames() canaryUpstreamName := fmt.Sprintf("%s-%s-canaryUpstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) primaryUpstreamName := fmt.Sprintf("%s-%s-primaryUpstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + + // Create upstreams for the canary/primary services created by flagger. + // Previously, we relied on gloo discovery to automaticallycreate these upstreams, but this would no longer work if + // discovery was turned off. + // KubeServiceDestinations can be disabled in gloo configuration, so we don't use those either. canaryUs := getGlooUpstreamForKubeService(canary, canaryUpstreamName, canaryName) primaryUs := getGlooUpstreamForKubeService(canary, primaryUpstreamName, primaryName) _, err := gr.glooClient.GatewayV1().Upstreams(canary.Namespace).Create(context.TODO(), canaryUs, metav1.CreateOptions{}) @@ -285,7 +290,7 @@ func getMethods(canary *flaggerv1.Canary) []string { } func getGlooUpstreamForKubeService(canary *flaggerv1.Canary, upstreamName, svcName string) *gloov1.Upstream{ - return &gloov1.Upstream{ + return &gloov1.Upstream{ ObjectMeta: metav1.ObjectMeta{ Name: upstreamName, Namespace: canary.Namespace, diff --git a/test/gloo/install.sh b/test/gloo/install.sh index 23666fb20..bb33c1994 100755 --- a/test/gloo/install.sh +++ b/test/gloo/install.sh @@ -12,6 +12,7 @@ kubectl create ns gloo-system helm repo add gloo https://storage.googleapis.com/solo-public-helm helm upgrade -i gloo gloo/gloo --version ${GLOO_VER} \ --namespace gloo-system \ +--set discovery.enabled=false kubectl -n gloo-system rollout status deployment/gloo kubectl -n gloo-system rollout status deployment/gateway From d20efe45098f6c9ee64b720d283710b2069fc0a6 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Wed, 28 Apr 2021 09:52:51 -0400 Subject: [PATCH 04/13] make fmt Signed-off-by: Keerthan Ekbote --- pkg/apis/gloo/v1/types.go | 2 +- pkg/router/factory.go | 8 ++++---- pkg/router/gloo.go | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/apis/gloo/v1/types.go b/pkg/apis/gloo/v1/types.go index 689656d90..b5f8f0356 100644 --- a/pkg/apis/gloo/v1/types.go +++ b/pkg/apis/gloo/v1/types.go @@ -37,7 +37,7 @@ type UpstreamType struct { type KubeUpstream struct { ServiceName string `json:"service_name,omitempty""` ServiceNamespace string `json:"service_namespace,omitempty"` - ServicePort int32 `json:"service_port,omitempty"` + ServicePort int32 `json:"service_port,omitempty"` Selector map[string]string `json:"selector,omitempty"` } diff --git a/pkg/router/factory.go b/pkg/router/factory.go index a1b4a03e9..8b7146374 100644 --- a/pkg/router/factory.go +++ b/pkg/router/factory.go @@ -123,10 +123,10 @@ func (factory *Factory) MeshRouter(provider string, labelSelector string) Interf } case strings.HasPrefix(provider, flaggerv1.GlooProvider): return &GlooRouter{ - logger: factory.logger, - flaggerClient: factory.flaggerClient, - kubeClient: factory.kubeClient, - glooClient: factory.meshClient, + logger: factory.logger, + flaggerClient: factory.flaggerClient, + kubeClient: factory.kubeClient, + glooClient: factory.meshClient, } case provider == flaggerv1.NGINXProvider: return &IngressRouter{ diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 3c5c89e07..01bc0de0a 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -35,10 +35,10 @@ import ( // GlooRouter is managing Gloo route tables type GlooRouter struct { - kubeClient kubernetes.Interface - glooClient clientset.Interface - flaggerClient clientset.Interface - logger *zap.SugaredLogger + kubeClient kubernetes.Interface + glooClient clientset.Interface + flaggerClient clientset.Interface + logger *zap.SugaredLogger } // Reconcile creates or updates the Gloo Edge route table @@ -289,7 +289,7 @@ func getMethods(canary *flaggerv1.Canary) []string { return methods } -func getGlooUpstreamForKubeService(canary *flaggerv1.Canary, upstreamName, svcName string) *gloov1.Upstream{ +func getGlooUpstreamForKubeService(canary *flaggerv1.Canary, upstreamName, svcName string) *gloov1.Upstream { return &gloov1.Upstream{ ObjectMeta: metav1.ObjectMeta{ Name: upstreamName, @@ -297,7 +297,7 @@ func getGlooUpstreamForKubeService(canary *flaggerv1.Canary, upstreamName, svcNa Labels: canary.Spec.Service.Apex.Labels, Annotations: canary.Spec.Service.Apex.Annotations, }, - UpstreamType: gloov1.UpstreamType{ + UpstreamType: gloov1.UpstreamType{ Kube: gloov1.KubeUpstream{ ServiceName: svcName, ServiceNamespace: canary.Namespace, From 2935fad54dafc67637d63e14074c7fb9a37e016a Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Thu, 29 Apr 2021 11:43:39 -0400 Subject: [PATCH 05/13] fixed gloo upstream api group Signed-off-by: Keerthan Ekbote --- hack/update-codegen.sh | 2 +- pkg/apis/gloo/{ => gateway}/v1/doc.go | 0 pkg/apis/gloo/{ => gateway}/v1/register.go | 4 +- pkg/apis/gloo/{ => gateway}/v1/types.go | 32 ----- .../{ => gateway}/v1/zz_generated.deepcopy.go | 100 -------------- pkg/apis/gloo/gloo/v1/doc.go | 5 + pkg/apis/gloo/gloo/v1/register.go | 36 +++++ pkg/apis/gloo/gloo/v1/types.go | 37 ++++++ .../gloo/gloo/v1/zz_generated.deepcopy.go | 125 ++++++++++++++++++ pkg/apis/gloo/register.go | 3 +- pkg/client/clientset/versioned/clientset.go | 16 ++- .../versioned/fake/clientset_generated.go | 11 +- .../clientset/versioned/fake/register.go | 4 +- .../clientset/versioned/scheme/register.go | 4 +- .../versioned/typed/gateway/v1/doc.go | 20 +++ .../versioned/typed/gateway/v1/fake/doc.go | 20 +++ .../gateway/v1/fake/fake_gateway_client.go | 40 ++++++ .../v1/fake/fake_routetable.go | 38 +++--- .../typed/gateway/v1/gateway_client.go | 89 +++++++++++++ .../typed/gateway/v1/generated_expansion.go | 21 +++ .../typed/{gloo => gateway}/v1/routetable.go | 2 +- .../typed/gloo/v1/fake/fake_gloo_client.go | 10 +- .../typed/gloo/v1/fake/fake_upstream.go | 8 +- .../typed/gloo/v1/generated_expansion.go | 2 - .../versioned/typed/gloo/v1/gloo_client.go | 33 ++--- .../versioned/typed/gloo/v1/upstream.go | 4 +- .../informers/externalversions/factory.go | 10 +- .../externalversions/gateway/interface.go | 46 +++++++ .../externalversions/gateway/v1/interface.go | 45 +++++++ .../{gloo => gateway}/v1/routetable.go | 8 +- .../informers/externalversions/generic.go | 9 +- .../externalversions/gloo/v1/interface.go | 7 - .../externalversions/gloo/v1/upstream.go | 6 +- .../listers/gateway/v1/expansion_generated.go | 27 ++++ .../{gloo => gateway}/v1/routetable.go | 2 +- .../listers/gloo/v1/expansion_generated.go | 8 -- pkg/client/listers/gloo/v1/upstream.go | 2 +- pkg/router/gloo.go | 113 +++++++++------- pkg/router/gloo_test.go | 8 +- 39 files changed, 677 insertions(+), 280 deletions(-) rename pkg/apis/gloo/{ => gateway}/v1/doc.go (100%) rename pkg/apis/gloo/{ => gateway}/v1/register.go (89%) rename pkg/apis/gloo/{ => gateway}/v1/types.go (71%) rename pkg/apis/gloo/{ => gateway}/v1/zz_generated.deepcopy.go (74%) create mode 100644 pkg/apis/gloo/gloo/v1/doc.go create mode 100755 pkg/apis/gloo/gloo/v1/register.go create mode 100644 pkg/apis/gloo/gloo/v1/types.go create mode 100644 pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go create mode 100644 pkg/client/clientset/versioned/typed/gateway/v1/doc.go create mode 100644 pkg/client/clientset/versioned/typed/gateway/v1/fake/doc.go create mode 100644 pkg/client/clientset/versioned/typed/gateway/v1/fake/fake_gateway_client.go rename pkg/client/clientset/versioned/typed/{gloo => gateway}/v1/fake/fake_routetable.go (78%) create mode 100644 pkg/client/clientset/versioned/typed/gateway/v1/gateway_client.go create mode 100644 pkg/client/clientset/versioned/typed/gateway/v1/generated_expansion.go rename pkg/client/clientset/versioned/typed/{gloo => gateway}/v1/routetable.go (99%) create mode 100644 pkg/client/informers/externalversions/gateway/interface.go create mode 100644 pkg/client/informers/externalversions/gateway/v1/interface.go rename pkg/client/informers/externalversions/{gloo => gateway}/v1/routetable.go (93%) create mode 100644 pkg/client/listers/gateway/v1/expansion_generated.go rename pkg/client/listers/{gloo => gateway}/v1/routetable.go (98%) diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 03e07b5e8..4bd04c717 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -30,7 +30,7 @@ chmod +x ${CODEGEN_PKG}/generate-groups.sh ${CODEGEN_PKG}/generate-groups.sh all \ github.com/fluxcd/flagger/pkg/client github.com/fluxcd/flagger/pkg/apis \ - "flagger:v1beta1 appmesh:v1beta2 appmesh:v1beta1 istio:v1alpha3 smi:v1alpha1 smi:v1alpha2 gloo:v1 projectcontour:v1 traefik:v1alpha1" \ + "flagger:v1beta1 appmesh:v1beta2 appmesh:v1beta1 istio:v1alpha3 smi:v1alpha1 smi:v1alpha2 gloo/gloo:v1 gloo/gateway:v1 projectcontour:v1 traefik:v1alpha1" \ --output-base "${TEMP_DIR}" \ --go-header-file ${SCRIPT_ROOT}/hack/boilerplate.go.txt diff --git a/pkg/apis/gloo/v1/doc.go b/pkg/apis/gloo/gateway/v1/doc.go similarity index 100% rename from pkg/apis/gloo/v1/doc.go rename to pkg/apis/gloo/gateway/v1/doc.go diff --git a/pkg/apis/gloo/v1/register.go b/pkg/apis/gloo/gateway/v1/register.go similarity index 89% rename from pkg/apis/gloo/v1/register.go rename to pkg/apis/gloo/gateway/v1/register.go index 4775e12b0..9b541ed40 100755 --- a/pkg/apis/gloo/v1/register.go +++ b/pkg/apis/gloo/gateway/v1/register.go @@ -8,7 +8,7 @@ import ( ) // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: gloo.GroupName, Version: "v1"} +var SchemeGroupVersion = schema.GroupVersion{Group: gloo.GatewayGroupName, Version: "v1"} // Kind takes an unqualified kind and returns back a Group qualified GroupKind func Kind(kind string) schema.GroupKind { @@ -30,8 +30,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &RouteTable{}, &RouteTableList{}, - &Upstream{}, - &UpstreamList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/pkg/apis/gloo/v1/types.go b/pkg/apis/gloo/gateway/v1/types.go similarity index 71% rename from pkg/apis/gloo/v1/types.go rename to pkg/apis/gloo/gateway/v1/types.go index b5f8f0356..c9f54abcf 100644 --- a/pkg/apis/gloo/v1/types.go +++ b/pkg/apis/gloo/gateway/v1/types.go @@ -19,28 +19,6 @@ type RouteTableSpec struct { Routes []Route `json:"routes,omitempty"` } -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// Upstream is a specification for a Gloo Upstream resource -type Upstream struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - UpstreamType UpstreamType `json:"upstream_type,omitempty"` -} - -type UpstreamType struct { - Kube KubeUpstream `json:"kube,omitempty"` -} - -type KubeUpstream struct { - ServiceName string `json:"service_name,omitempty""` - ServiceNamespace string `json:"service_namespace,omitempty"` - ServicePort int32 `json:"service_port,omitempty"` - Selector map[string]string `json:"selector,omitempty"` -} - type Route struct { Matchers []Matcher `json:"matchers,omitempty"` Action RouteAction `json:"routeAction,omitempty"` @@ -102,13 +80,3 @@ type RouteTableList struct { Items []RouteTable `json:"items"` } - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// UpstreamList is a list of Upstream resources -type UpstreamList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []Upstream `json:"items"` -} diff --git a/pkg/apis/gloo/v1/zz_generated.deepcopy.go b/pkg/apis/gloo/gateway/v1/zz_generated.deepcopy.go similarity index 74% rename from pkg/apis/gloo/v1/zz_generated.deepcopy.go rename to pkg/apis/gloo/gateway/v1/zz_generated.deepcopy.go index 596a0d94a..44a00d9a7 100644 --- a/pkg/apis/gloo/v1/zz_generated.deepcopy.go +++ b/pkg/apis/gloo/gateway/v1/zz_generated.deepcopy.go @@ -57,29 +57,6 @@ func (in *HeaderMatcher) DeepCopy() *HeaderMatcher { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeUpstream) DeepCopyInto(out *KubeUpstream) { - *out = *in - if in.Selector != nil { - in, out := &in.Selector, &out.Selector - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeUpstream. -func (in *KubeUpstream) DeepCopy() *KubeUpstream { - if in == nil { - return nil - } - out := new(KubeUpstream) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Matcher) DeepCopyInto(out *Matcher) { *out = *in @@ -288,83 +265,6 @@ func (in *RouteTableSpec) DeepCopy() *RouteTableSpec { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Upstream) DeepCopyInto(out *Upstream) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.UpstreamType.DeepCopyInto(&out.UpstreamType) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Upstream. -func (in *Upstream) DeepCopy() *Upstream { - if in == nil { - return nil - } - out := new(Upstream) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Upstream) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *UpstreamList) DeepCopyInto(out *UpstreamList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Upstream, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamList. -func (in *UpstreamList) DeepCopy() *UpstreamList { - if in == nil { - return nil - } - out := new(UpstreamList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *UpstreamList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *UpstreamType) DeepCopyInto(out *UpstreamType) { - *out = *in - in.Kube.DeepCopyInto(&out.Kube) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamType. -func (in *UpstreamType) DeepCopy() *UpstreamType { - if in == nil { - return nil - } - out := new(UpstreamType) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WeightedDestination) DeepCopyInto(out *WeightedDestination) { *out = *in diff --git a/pkg/apis/gloo/gloo/v1/doc.go b/pkg/apis/gloo/gloo/v1/doc.go new file mode 100644 index 000000000..0c6413321 --- /dev/null +++ b/pkg/apis/gloo/gloo/v1/doc.go @@ -0,0 +1,5 @@ +// +k8s:deepcopy-gen=package + +// Package v1 is the v1 version of the API. +// +groupName=gloo.solo.io +package v1 diff --git a/pkg/apis/gloo/gloo/v1/register.go b/pkg/apis/gloo/gloo/v1/register.go new file mode 100755 index 000000000..75d3bfc1e --- /dev/null +++ b/pkg/apis/gloo/gloo/v1/register.go @@ -0,0 +1,36 @@ +package v1 + +import ( + "github.com/fluxcd/flagger/pkg/apis/gloo" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: gloo.GlooGroupName, Version: "v1"} + +// Kind takes an unqualified kind and returns back a Group qualified GroupKind +func Kind(kind string) schema.GroupKind { + return SchemeGroupVersion.WithKind(kind).GroupKind() +} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + AddToScheme = SchemeBuilder.AddToScheme +) + +// Adds the list of known types to Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &Upstream{}, + &UpstreamList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/pkg/apis/gloo/gloo/v1/types.go b/pkg/apis/gloo/gloo/v1/types.go new file mode 100644 index 000000000..5a592e2c7 --- /dev/null +++ b/pkg/apis/gloo/gloo/v1/types.go @@ -0,0 +1,37 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Upstream is a specification for a Gloo Upstream resource +type Upstream struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec UpstreamSpec `json:"spec"` +} + +type UpstreamSpec struct { + Kube KubeUpstream `json:"kube,omitempty""` +} + +type KubeUpstream struct { + ServiceName string `json:"service_name,omitempty""` + ServiceNamespace string `json:"service_namespace,omitempty"` + ServicePort int32 `json:"service_port,omitempty"` + Selector map[string]string `json:"selector,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// UpstreamList is a list of Upstream resources +type UpstreamList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []Upstream `json:"items"` +} diff --git a/pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go b/pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go new file mode 100644 index 000000000..002cbbbec --- /dev/null +++ b/pkg/apis/gloo/gloo/v1/zz_generated.deepcopy.go @@ -0,0 +1,125 @@ +// +build !ignore_autogenerated + +/* +Copyright 2020 The Flux 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 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubeUpstream) DeepCopyInto(out *KubeUpstream) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeUpstream. +func (in *KubeUpstream) DeepCopy() *KubeUpstream { + if in == nil { + return nil + } + out := new(KubeUpstream) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Upstream) DeepCopyInto(out *Upstream) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Upstream. +func (in *Upstream) DeepCopy() *Upstream { + if in == nil { + return nil + } + out := new(Upstream) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Upstream) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpstreamList) DeepCopyInto(out *UpstreamList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Upstream, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamList. +func (in *UpstreamList) DeepCopy() *UpstreamList { + if in == nil { + return nil + } + out := new(UpstreamList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *UpstreamList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpstreamSpec) DeepCopyInto(out *UpstreamSpec) { + *out = *in + in.Kube.DeepCopyInto(&out.Kube) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpstreamSpec. +func (in *UpstreamSpec) DeepCopy() *UpstreamSpec { + if in == nil { + return nil + } + out := new(UpstreamSpec) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/gloo/register.go b/pkg/apis/gloo/register.go index 0d7175074..723e95226 100644 --- a/pkg/apis/gloo/register.go +++ b/pkg/apis/gloo/register.go @@ -1,5 +1,6 @@ package gloo const ( - GroupName = "gateway.solo.io" + GlooGroupName = "gloo.solo.io" + GatewayGroupName = "gateway.solo.io" ) diff --git a/pkg/client/clientset/versioned/clientset.go b/pkg/client/clientset/versioned/clientset.go index 4ec16141e..21fc1e8dc 100644 --- a/pkg/client/clientset/versioned/clientset.go +++ b/pkg/client/clientset/versioned/clientset.go @@ -24,7 +24,8 @@ import ( appmeshv1beta1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/appmesh/v1beta1" appmeshv1beta2 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/appmesh/v1beta2" flaggerv1beta1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/flagger/v1beta1" - gatewayv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gloo/v1" + gatewayv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gateway/v1" + gloov1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gloo/v1" networkingv1alpha3 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/istio/v1alpha3" projectcontourv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/projectcontour/v1" splitv1alpha1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/smi/v1alpha1" @@ -41,6 +42,7 @@ type Interface interface { AppmeshV1beta1() appmeshv1beta1.AppmeshV1beta1Interface FlaggerV1beta1() flaggerv1beta1.FlaggerV1beta1Interface GatewayV1() gatewayv1.GatewayV1Interface + GlooV1() gloov1.GlooV1Interface NetworkingV1alpha3() networkingv1alpha3.NetworkingV1alpha3Interface ProjectcontourV1() projectcontourv1.ProjectcontourV1Interface SplitV1alpha1() splitv1alpha1.SplitV1alpha1Interface @@ -56,6 +58,7 @@ type Clientset struct { appmeshV1beta1 *appmeshv1beta1.AppmeshV1beta1Client flaggerV1beta1 *flaggerv1beta1.FlaggerV1beta1Client gatewayV1 *gatewayv1.GatewayV1Client + glooV1 *gloov1.GlooV1Client networkingV1alpha3 *networkingv1alpha3.NetworkingV1alpha3Client projectcontourV1 *projectcontourv1.ProjectcontourV1Client splitV1alpha1 *splitv1alpha1.SplitV1alpha1Client @@ -83,6 +86,11 @@ func (c *Clientset) GatewayV1() gatewayv1.GatewayV1Interface { return c.gatewayV1 } +// GlooV1 retrieves the GlooV1Client +func (c *Clientset) GlooV1() gloov1.GlooV1Interface { + return c.glooV1 +} + // NetworkingV1alpha3 retrieves the NetworkingV1alpha3Client func (c *Clientset) NetworkingV1alpha3() networkingv1alpha3.NetworkingV1alpha3Interface { return c.networkingV1alpha3 @@ -145,6 +153,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.glooV1, err = gloov1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.networkingV1alpha3, err = networkingv1alpha3.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -181,6 +193,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { cs.appmeshV1beta1 = appmeshv1beta1.NewForConfigOrDie(c) cs.flaggerV1beta1 = flaggerv1beta1.NewForConfigOrDie(c) cs.gatewayV1 = gatewayv1.NewForConfigOrDie(c) + cs.glooV1 = gloov1.NewForConfigOrDie(c) cs.networkingV1alpha3 = networkingv1alpha3.NewForConfigOrDie(c) cs.projectcontourV1 = projectcontourv1.NewForConfigOrDie(c) cs.splitV1alpha1 = splitv1alpha1.NewForConfigOrDie(c) @@ -198,6 +211,7 @@ func New(c rest.Interface) *Clientset { cs.appmeshV1beta1 = appmeshv1beta1.New(c) cs.flaggerV1beta1 = flaggerv1beta1.New(c) cs.gatewayV1 = gatewayv1.New(c) + cs.glooV1 = gloov1.New(c) cs.networkingV1alpha3 = networkingv1alpha3.New(c) cs.projectcontourV1 = projectcontourv1.New(c) cs.splitV1alpha1 = splitv1alpha1.New(c) diff --git a/pkg/client/clientset/versioned/fake/clientset_generated.go b/pkg/client/clientset/versioned/fake/clientset_generated.go index 2edd507e1..db12f2915 100644 --- a/pkg/client/clientset/versioned/fake/clientset_generated.go +++ b/pkg/client/clientset/versioned/fake/clientset_generated.go @@ -26,8 +26,10 @@ import ( fakeappmeshv1beta2 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/appmesh/v1beta2/fake" flaggerv1beta1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/flagger/v1beta1" fakeflaggerv1beta1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/flagger/v1beta1/fake" - gatewayv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gloo/v1" - fakegatewayv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gloo/v1/fake" + gatewayv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gateway/v1" + fakegatewayv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gateway/v1/fake" + gloov1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gloo/v1" + fakegloov1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gloo/v1/fake" networkingv1alpha3 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/istio/v1alpha3" fakenetworkingv1alpha3 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/istio/v1alpha3/fake" projectcontourv1 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/projectcontour/v1" @@ -112,6 +114,11 @@ func (c *Clientset) GatewayV1() gatewayv1.GatewayV1Interface { return &fakegatewayv1.FakeGatewayV1{Fake: &c.Fake} } +// GlooV1 retrieves the GlooV1Client +func (c *Clientset) GlooV1() gloov1.GlooV1Interface { + return &fakegloov1.FakeGlooV1{Fake: &c.Fake} +} + // NetworkingV1alpha3 retrieves the NetworkingV1alpha3Client func (c *Clientset) NetworkingV1alpha3() networkingv1alpha3.NetworkingV1alpha3Interface { return &fakenetworkingv1alpha3.FakeNetworkingV1alpha3{Fake: &c.Fake} diff --git a/pkg/client/clientset/versioned/fake/register.go b/pkg/client/clientset/versioned/fake/register.go index 4551c697c..c169aafd4 100644 --- a/pkg/client/clientset/versioned/fake/register.go +++ b/pkg/client/clientset/versioned/fake/register.go @@ -22,7 +22,8 @@ import ( appmeshv1beta1 "github.com/fluxcd/flagger/pkg/apis/appmesh/v1beta1" appmeshv1beta2 "github.com/fluxcd/flagger/pkg/apis/appmesh/v1beta2" flaggerv1beta1 "github.com/fluxcd/flagger/pkg/apis/flagger/v1beta1" - gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" networkingv1alpha3 "github.com/fluxcd/flagger/pkg/apis/istio/v1alpha3" projectcontourv1 "github.com/fluxcd/flagger/pkg/apis/projectcontour/v1" splitv1alpha1 "github.com/fluxcd/flagger/pkg/apis/smi/v1alpha1" @@ -43,6 +44,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{ appmeshv1beta1.AddToScheme, flaggerv1beta1.AddToScheme, gatewayv1.AddToScheme, + gloov1.AddToScheme, networkingv1alpha3.AddToScheme, projectcontourv1.AddToScheme, splitv1alpha1.AddToScheme, diff --git a/pkg/client/clientset/versioned/scheme/register.go b/pkg/client/clientset/versioned/scheme/register.go index 069b7f0fc..86c372d50 100644 --- a/pkg/client/clientset/versioned/scheme/register.go +++ b/pkg/client/clientset/versioned/scheme/register.go @@ -22,7 +22,8 @@ import ( appmeshv1beta1 "github.com/fluxcd/flagger/pkg/apis/appmesh/v1beta1" appmeshv1beta2 "github.com/fluxcd/flagger/pkg/apis/appmesh/v1beta2" flaggerv1beta1 "github.com/fluxcd/flagger/pkg/apis/flagger/v1beta1" - gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" networkingv1alpha3 "github.com/fluxcd/flagger/pkg/apis/istio/v1alpha3" projectcontourv1 "github.com/fluxcd/flagger/pkg/apis/projectcontour/v1" splitv1alpha1 "github.com/fluxcd/flagger/pkg/apis/smi/v1alpha1" @@ -43,6 +44,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{ appmeshv1beta1.AddToScheme, flaggerv1beta1.AddToScheme, gatewayv1.AddToScheme, + gloov1.AddToScheme, networkingv1alpha3.AddToScheme, projectcontourv1.AddToScheme, splitv1alpha1.AddToScheme, diff --git a/pkg/client/clientset/versioned/typed/gateway/v1/doc.go b/pkg/client/clientset/versioned/typed/gateway/v1/doc.go new file mode 100644 index 000000000..49093caf4 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/gateway/v1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2020 The Flux 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 v1 diff --git a/pkg/client/clientset/versioned/typed/gateway/v1/fake/doc.go b/pkg/client/clientset/versioned/typed/gateway/v1/fake/doc.go new file mode 100644 index 000000000..1ccd91197 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/gateway/v1/fake/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 2020 The Flux 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/pkg/client/clientset/versioned/typed/gateway/v1/fake/fake_gateway_client.go b/pkg/client/clientset/versioned/typed/gateway/v1/fake/fake_gateway_client.go new file mode 100644 index 000000000..833ebf3b7 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/gateway/v1/fake/fake_gateway_client.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Flux 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 "github.com/fluxcd/flagger/pkg/client/clientset/versioned/typed/gateway/v1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakeGatewayV1 struct { + *testing.Fake +} + +func (c *FakeGatewayV1) RouteTables(namespace string) v1.RouteTableInterface { + return &FakeRouteTables{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeGatewayV1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_routetable.go b/pkg/client/clientset/versioned/typed/gateway/v1/fake/fake_routetable.go similarity index 78% rename from pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_routetable.go rename to pkg/client/clientset/versioned/typed/gateway/v1/fake/fake_routetable.go index 0d9d62179..09b92a569 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_routetable.go +++ b/pkg/client/clientset/versioned/typed/gateway/v1/fake/fake_routetable.go @@ -21,7 +21,7 @@ package fake import ( "context" - gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -41,20 +41,20 @@ var routetablesResource = schema.GroupVersionResource{Group: "gateway.solo.io", var routetablesKind = schema.GroupVersionKind{Group: "gateway.solo.io", Version: "v1", Kind: "RouteTable"} // Get takes name of the routeTable, and returns the corresponding routeTable object, and an error if there is any. -func (c *FakeRouteTables) Get(ctx context.Context, name string, options v1.GetOptions) (result *gloov1.RouteTable, err error) { +func (c *FakeRouteTables) Get(ctx context.Context, name string, options v1.GetOptions) (result *gatewayv1.RouteTable, err error) { obj, err := c.Fake. - Invokes(testing.NewGetAction(routetablesResource, c.ns, name), &gloov1.RouteTable{}) + Invokes(testing.NewGetAction(routetablesResource, c.ns, name), &gatewayv1.RouteTable{}) if obj == nil { return nil, err } - return obj.(*gloov1.RouteTable), err + return obj.(*gatewayv1.RouteTable), err } // List takes label and field selectors, and returns the list of RouteTables that match those selectors. -func (c *FakeRouteTables) List(ctx context.Context, opts v1.ListOptions) (result *gloov1.RouteTableList, err error) { +func (c *FakeRouteTables) List(ctx context.Context, opts v1.ListOptions) (result *gatewayv1.RouteTableList, err error) { obj, err := c.Fake. - Invokes(testing.NewListAction(routetablesResource, routetablesKind, c.ns, opts), &gloov1.RouteTableList{}) + Invokes(testing.NewListAction(routetablesResource, routetablesKind, c.ns, opts), &gatewayv1.RouteTableList{}) if obj == nil { return nil, err @@ -64,8 +64,8 @@ func (c *FakeRouteTables) List(ctx context.Context, opts v1.ListOptions) (result if label == nil { label = labels.Everything() } - list := &gloov1.RouteTableList{ListMeta: obj.(*gloov1.RouteTableList).ListMeta} - for _, item := range obj.(*gloov1.RouteTableList).Items { + list := &gatewayv1.RouteTableList{ListMeta: obj.(*gatewayv1.RouteTableList).ListMeta} + for _, item := range obj.(*gatewayv1.RouteTableList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) } @@ -81,31 +81,31 @@ func (c *FakeRouteTables) Watch(ctx context.Context, opts v1.ListOptions) (watch } // Create takes the representation of a routeTable and creates it. Returns the server's representation of the routeTable, and an error, if there is any. -func (c *FakeRouteTables) Create(ctx context.Context, routeTable *gloov1.RouteTable, opts v1.CreateOptions) (result *gloov1.RouteTable, err error) { +func (c *FakeRouteTables) Create(ctx context.Context, routeTable *gatewayv1.RouteTable, opts v1.CreateOptions) (result *gatewayv1.RouteTable, err error) { obj, err := c.Fake. - Invokes(testing.NewCreateAction(routetablesResource, c.ns, routeTable), &gloov1.RouteTable{}) + Invokes(testing.NewCreateAction(routetablesResource, c.ns, routeTable), &gatewayv1.RouteTable{}) if obj == nil { return nil, err } - return obj.(*gloov1.RouteTable), err + return obj.(*gatewayv1.RouteTable), err } // Update takes the representation of a routeTable and updates it. Returns the server's representation of the routeTable, and an error, if there is any. -func (c *FakeRouteTables) Update(ctx context.Context, routeTable *gloov1.RouteTable, opts v1.UpdateOptions) (result *gloov1.RouteTable, err error) { +func (c *FakeRouteTables) Update(ctx context.Context, routeTable *gatewayv1.RouteTable, opts v1.UpdateOptions) (result *gatewayv1.RouteTable, err error) { obj, err := c.Fake. - Invokes(testing.NewUpdateAction(routetablesResource, c.ns, routeTable), &gloov1.RouteTable{}) + Invokes(testing.NewUpdateAction(routetablesResource, c.ns, routeTable), &gatewayv1.RouteTable{}) if obj == nil { return nil, err } - return obj.(*gloov1.RouteTable), err + return obj.(*gatewayv1.RouteTable), err } // Delete takes name of the routeTable and deletes it. Returns an error if one occurs. func (c *FakeRouteTables) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(routetablesResource, c.ns, name), &gloov1.RouteTable{}) + Invokes(testing.NewDeleteAction(routetablesResource, c.ns, name), &gatewayv1.RouteTable{}) return err } @@ -114,17 +114,17 @@ func (c *FakeRouteTables) Delete(ctx context.Context, name string, opts v1.Delet func (c *FakeRouteTables) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { action := testing.NewDeleteCollectionAction(routetablesResource, c.ns, listOpts) - _, err := c.Fake.Invokes(action, &gloov1.RouteTableList{}) + _, err := c.Fake.Invokes(action, &gatewayv1.RouteTableList{}) return err } // Patch applies the patch and returns the patched routeTable. -func (c *FakeRouteTables) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *gloov1.RouteTable, err error) { +func (c *FakeRouteTables) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *gatewayv1.RouteTable, err error) { obj, err := c.Fake. - Invokes(testing.NewPatchSubresourceAction(routetablesResource, c.ns, name, pt, data, subresources...), &gloov1.RouteTable{}) + Invokes(testing.NewPatchSubresourceAction(routetablesResource, c.ns, name, pt, data, subresources...), &gatewayv1.RouteTable{}) if obj == nil { return nil, err } - return obj.(*gloov1.RouteTable), err + return obj.(*gatewayv1.RouteTable), err } diff --git a/pkg/client/clientset/versioned/typed/gateway/v1/gateway_client.go b/pkg/client/clientset/versioned/typed/gateway/v1/gateway_client.go new file mode 100644 index 000000000..fef0b47df --- /dev/null +++ b/pkg/client/clientset/versioned/typed/gateway/v1/gateway_client.go @@ -0,0 +1,89 @@ +/* +Copyright 2020 The Flux 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 v1 + +import ( + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" + "github.com/fluxcd/flagger/pkg/client/clientset/versioned/scheme" + rest "k8s.io/client-go/rest" +) + +type GatewayV1Interface interface { + RESTClient() rest.Interface + RouteTablesGetter +} + +// GatewayV1Client is used to interact with features provided by the gateway.solo.io group. +type GatewayV1Client struct { + restClient rest.Interface +} + +func (c *GatewayV1Client) RouteTables(namespace string) RouteTableInterface { + return newRouteTables(c, namespace) +} + +// NewForConfig creates a new GatewayV1Client for the given config. +func NewForConfig(c *rest.Config) (*GatewayV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &GatewayV1Client{client}, nil +} + +// NewForConfigOrDie creates a new GatewayV1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *GatewayV1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new GatewayV1Client for the given RESTClient. +func New(c rest.Interface) *GatewayV1Client { + return &GatewayV1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1.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 *GatewayV1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/pkg/client/clientset/versioned/typed/gateway/v1/generated_expansion.go b/pkg/client/clientset/versioned/typed/gateway/v1/generated_expansion.go new file mode 100644 index 000000000..972af2a93 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/gateway/v1/generated_expansion.go @@ -0,0 +1,21 @@ +/* +Copyright 2020 The Flux 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 v1 + +type RouteTableExpansion interface{} diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/routetable.go b/pkg/client/clientset/versioned/typed/gateway/v1/routetable.go similarity index 99% rename from pkg/client/clientset/versioned/typed/gloo/v1/routetable.go rename to pkg/client/clientset/versioned/typed/gateway/v1/routetable.go index 11936cbfd..695022a8b 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/routetable.go +++ b/pkg/client/clientset/versioned/typed/gateway/v1/routetable.go @@ -22,7 +22,7 @@ import ( "context" "time" - v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" scheme "github.com/fluxcd/flagger/pkg/client/clientset/versioned/scheme" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go index 17bf2941d..1f016be59 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_gloo_client.go @@ -24,21 +24,17 @@ import ( testing "k8s.io/client-go/testing" ) -type FakeGatewayV1 struct { +type FakeGlooV1 struct { *testing.Fake } -func (c *FakeGatewayV1) RouteTables(namespace string) v1.RouteTableInterface { - return &FakeRouteTables{c, namespace} -} - -func (c *FakeGatewayV1) Upstreams(namespace string) v1.UpstreamInterface { +func (c *FakeGlooV1) Upstreams(namespace string) v1.UpstreamInterface { return &FakeUpstreams{c, namespace} } // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *FakeGatewayV1) RESTClient() rest.Interface { +func (c *FakeGlooV1) RESTClient() rest.Interface { var ret *rest.RESTClient return ret } diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go index 4669064f3..c9c67f988 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/fake/fake_upstream.go @@ -21,7 +21,7 @@ package fake import ( "context" - gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -32,13 +32,13 @@ import ( // FakeUpstreams implements UpstreamInterface type FakeUpstreams struct { - Fake *FakeGatewayV1 + Fake *FakeGlooV1 ns string } -var upstreamsResource = schema.GroupVersionResource{Group: "gateway.solo.io", Version: "v1", Resource: "upstreams"} +var upstreamsResource = schema.GroupVersionResource{Group: "gloo.solo.io", Version: "v1", Resource: "upstreams"} -var upstreamsKind = schema.GroupVersionKind{Group: "gateway.solo.io", Version: "v1", Kind: "Upstream"} +var upstreamsKind = schema.GroupVersionKind{Group: "gloo.solo.io", Version: "v1", Kind: "Upstream"} // Get takes name of the upstream, and returns the corresponding upstream object, and an error if there is any. func (c *FakeUpstreams) Get(ctx context.Context, name string, options v1.GetOptions) (result *gloov1.Upstream, err error) { diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go b/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go index d05389b59..fe87f3f6c 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/generated_expansion.go @@ -18,6 +18,4 @@ limitations under the License. package v1 -type RouteTableExpansion interface{} - type UpstreamExpansion interface{} diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go b/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go index 3c7f6e7dd..7a73bfe6d 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/gloo_client.go @@ -19,32 +19,27 @@ limitations under the License. package v1 import ( - v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" "github.com/fluxcd/flagger/pkg/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" ) -type GatewayV1Interface interface { +type GlooV1Interface interface { RESTClient() rest.Interface - RouteTablesGetter UpstreamsGetter } -// GatewayV1Client is used to interact with features provided by the gateway.solo.io group. -type GatewayV1Client struct { +// GlooV1Client is used to interact with features provided by the gloo.solo.io group. +type GlooV1Client struct { restClient rest.Interface } -func (c *GatewayV1Client) RouteTables(namespace string) RouteTableInterface { - return newRouteTables(c, namespace) -} - -func (c *GatewayV1Client) Upstreams(namespace string) UpstreamInterface { +func (c *GlooV1Client) Upstreams(namespace string) UpstreamInterface { return newUpstreams(c, namespace) } -// NewForConfig creates a new GatewayV1Client for the given config. -func NewForConfig(c *rest.Config) (*GatewayV1Client, error) { +// NewForConfig creates a new GlooV1Client for the given config. +func NewForConfig(c *rest.Config) (*GlooV1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -53,12 +48,12 @@ func NewForConfig(c *rest.Config) (*GatewayV1Client, error) { if err != nil { return nil, err } - return &GatewayV1Client{client}, nil + return &GlooV1Client{client}, nil } -// NewForConfigOrDie creates a new GatewayV1Client for the given config and +// NewForConfigOrDie creates a new GlooV1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *GatewayV1Client { +func NewForConfigOrDie(c *rest.Config) *GlooV1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -66,9 +61,9 @@ func NewForConfigOrDie(c *rest.Config) *GatewayV1Client { return client } -// New creates a new GatewayV1Client for the given RESTClient. -func New(c rest.Interface) *GatewayV1Client { - return &GatewayV1Client{c} +// New creates a new GlooV1Client for the given RESTClient. +func New(c rest.Interface) *GlooV1Client { + return &GlooV1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -86,7 +81,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *GatewayV1Client) RESTClient() rest.Interface { +func (c *GlooV1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/pkg/client/clientset/versioned/typed/gloo/v1/upstream.go b/pkg/client/clientset/versioned/typed/gloo/v1/upstream.go index c8f9eebc1..8d4f2a503 100644 --- a/pkg/client/clientset/versioned/typed/gloo/v1/upstream.go +++ b/pkg/client/clientset/versioned/typed/gloo/v1/upstream.go @@ -22,7 +22,7 @@ import ( "context" "time" - v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" scheme "github.com/fluxcd/flagger/pkg/client/clientset/versioned/scheme" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" @@ -56,7 +56,7 @@ type upstreams struct { } // newUpstreams returns a Upstreams -func newUpstreams(c *GatewayV1Client, namespace string) *upstreams { +func newUpstreams(c *GlooV1Client, namespace string) *upstreams { return &upstreams{ client: c.RESTClient(), ns: namespace, diff --git a/pkg/client/informers/externalversions/factory.go b/pkg/client/informers/externalversions/factory.go index c744ac0e9..a876cbe4b 100644 --- a/pkg/client/informers/externalversions/factory.go +++ b/pkg/client/informers/externalversions/factory.go @@ -26,6 +26,7 @@ import ( versioned "github.com/fluxcd/flagger/pkg/client/clientset/versioned" appmesh "github.com/fluxcd/flagger/pkg/client/informers/externalversions/appmesh" flagger "github.com/fluxcd/flagger/pkg/client/informers/externalversions/flagger" + gateway "github.com/fluxcd/flagger/pkg/client/informers/externalversions/gateway" gloo "github.com/fluxcd/flagger/pkg/client/informers/externalversions/gloo" internalinterfaces "github.com/fluxcd/flagger/pkg/client/informers/externalversions/internalinterfaces" istio "github.com/fluxcd/flagger/pkg/client/informers/externalversions/istio" @@ -180,7 +181,8 @@ type SharedInformerFactory interface { Appmesh() appmesh.Interface Flagger() flagger.Interface - Gateway() gloo.Interface + Gateway() gateway.Interface + Gloo() gloo.Interface Networking() istio.Interface Projectcontour() projectcontour.Interface Split() smi.Interface @@ -195,7 +197,11 @@ func (f *sharedInformerFactory) Flagger() flagger.Interface { return flagger.New(f, f.namespace, f.tweakListOptions) } -func (f *sharedInformerFactory) Gateway() gloo.Interface { +func (f *sharedInformerFactory) Gateway() gateway.Interface { + return gateway.New(f, f.namespace, f.tweakListOptions) +} + +func (f *sharedInformerFactory) Gloo() gloo.Interface { return gloo.New(f, f.namespace, f.tweakListOptions) } diff --git a/pkg/client/informers/externalversions/gateway/interface.go b/pkg/client/informers/externalversions/gateway/interface.go new file mode 100644 index 000000000..ba529a0e6 --- /dev/null +++ b/pkg/client/informers/externalversions/gateway/interface.go @@ -0,0 +1,46 @@ +/* +Copyright 2020 The Flux 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 informer-gen. DO NOT EDIT. + +package gateway + +import ( + v1 "github.com/fluxcd/flagger/pkg/client/informers/externalversions/gateway/v1" + internalinterfaces "github.com/fluxcd/flagger/pkg/client/informers/externalversions/internalinterfaces" +) + +// Interface provides access to each of this group's versions. +type Interface interface { + // V1 provides access to shared informers for resources in V1. + V1() v1.Interface +} + +type group struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// V1 returns a new v1.Interface. +func (g *group) V1() v1.Interface { + return v1.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/pkg/client/informers/externalversions/gateway/v1/interface.go b/pkg/client/informers/externalversions/gateway/v1/interface.go new file mode 100644 index 000000000..1b5a8391a --- /dev/null +++ b/pkg/client/informers/externalversions/gateway/v1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright 2020 The Flux 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 informer-gen. DO NOT EDIT. + +package v1 + +import ( + internalinterfaces "github.com/fluxcd/flagger/pkg/client/informers/externalversions/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // RouteTables returns a RouteTableInformer. + RouteTables() RouteTableInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// RouteTables returns a RouteTableInformer. +func (v *version) RouteTables() RouteTableInformer { + return &routeTableInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/pkg/client/informers/externalversions/gloo/v1/routetable.go b/pkg/client/informers/externalversions/gateway/v1/routetable.go similarity index 93% rename from pkg/client/informers/externalversions/gloo/v1/routetable.go rename to pkg/client/informers/externalversions/gateway/v1/routetable.go index 38cafeaa3..c86d190a3 100644 --- a/pkg/client/informers/externalversions/gloo/v1/routetable.go +++ b/pkg/client/informers/externalversions/gateway/v1/routetable.go @@ -22,10 +22,10 @@ import ( "context" time "time" - gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" versioned "github.com/fluxcd/flagger/pkg/client/clientset/versioned" internalinterfaces "github.com/fluxcd/flagger/pkg/client/informers/externalversions/internalinterfaces" - v1 "github.com/fluxcd/flagger/pkg/client/listers/gloo/v1" + v1 "github.com/fluxcd/flagger/pkg/client/listers/gateway/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -71,7 +71,7 @@ func NewFilteredRouteTableInformer(client versioned.Interface, namespace string, return client.GatewayV1().RouteTables(namespace).Watch(context.TODO(), options) }, }, - &gloov1.RouteTable{}, + &gatewayv1.RouteTable{}, resyncPeriod, indexers, ) @@ -82,7 +82,7 @@ func (f *routeTableInformer) defaultInformer(client versioned.Interface, resyncP } func (f *routeTableInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&gloov1.RouteTable{}, f.defaultInformer) + return f.factory.InformerFor(&gatewayv1.RouteTable{}, f.defaultInformer) } func (f *routeTableInformer) Lister() v1.RouteTableLister { diff --git a/pkg/client/informers/externalversions/generic.go b/pkg/client/informers/externalversions/generic.go index c503fe85f..d2ea37711 100644 --- a/pkg/client/informers/externalversions/generic.go +++ b/pkg/client/informers/externalversions/generic.go @@ -24,7 +24,8 @@ import ( v1beta1 "github.com/fluxcd/flagger/pkg/apis/appmesh/v1beta1" v1beta2 "github.com/fluxcd/flagger/pkg/apis/appmesh/v1beta2" flaggerv1beta1 "github.com/fluxcd/flagger/pkg/apis/flagger/v1beta1" - v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" v1alpha3 "github.com/fluxcd/flagger/pkg/apis/istio/v1alpha3" projectcontourv1 "github.com/fluxcd/flagger/pkg/apis/projectcontour/v1" v1alpha1 "github.com/fluxcd/flagger/pkg/apis/smi/v1alpha1" @@ -87,8 +88,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource // Group=gateway.solo.io, Version=v1 case v1.SchemeGroupVersion.WithResource("routetables"): return &genericInformer{resource: resource.GroupResource(), informer: f.Gateway().V1().RouteTables().Informer()}, nil - case v1.SchemeGroupVersion.WithResource("upstreams"): - return &genericInformer{resource: resource.GroupResource(), informer: f.Gateway().V1().Upstreams().Informer()}, nil + + // Group=gloo.solo.io, Version=v1 + case gloov1.SchemeGroupVersion.WithResource("upstreams"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Gloo().V1().Upstreams().Informer()}, nil // Group=networking.istio.io, Version=v1alpha3 case v1alpha3.SchemeGroupVersion.WithResource("destinationrules"): diff --git a/pkg/client/informers/externalversions/gloo/v1/interface.go b/pkg/client/informers/externalversions/gloo/v1/interface.go index 3e9191be1..266c93d41 100644 --- a/pkg/client/informers/externalversions/gloo/v1/interface.go +++ b/pkg/client/informers/externalversions/gloo/v1/interface.go @@ -24,8 +24,6 @@ import ( // Interface provides access to all the informers in this group version. type Interface interface { - // RouteTables returns a RouteTableInformer. - RouteTables() RouteTableInformer // Upstreams returns a UpstreamInformer. Upstreams() UpstreamInformer } @@ -41,11 +39,6 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } -// RouteTables returns a RouteTableInformer. -func (v *version) RouteTables() RouteTableInformer { - return &routeTableInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} -} - // Upstreams returns a UpstreamInformer. func (v *version) Upstreams() UpstreamInformer { return &upstreamInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} diff --git a/pkg/client/informers/externalversions/gloo/v1/upstream.go b/pkg/client/informers/externalversions/gloo/v1/upstream.go index c5b61b885..819b893b8 100644 --- a/pkg/client/informers/externalversions/gloo/v1/upstream.go +++ b/pkg/client/informers/externalversions/gloo/v1/upstream.go @@ -22,7 +22,7 @@ import ( "context" time "time" - gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" versioned "github.com/fluxcd/flagger/pkg/client/clientset/versioned" internalinterfaces "github.com/fluxcd/flagger/pkg/client/informers/externalversions/internalinterfaces" v1 "github.com/fluxcd/flagger/pkg/client/listers/gloo/v1" @@ -62,13 +62,13 @@ func NewFilteredUpstreamInformer(client versioned.Interface, namespace string, r if tweakListOptions != nil { tweakListOptions(&options) } - return client.GatewayV1().Upstreams(namespace).List(context.TODO(), options) + return client.GlooV1().Upstreams(namespace).List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.GatewayV1().Upstreams(namespace).Watch(context.TODO(), options) + return client.GlooV1().Upstreams(namespace).Watch(context.TODO(), options) }, }, &gloov1.Upstream{}, diff --git a/pkg/client/listers/gateway/v1/expansion_generated.go b/pkg/client/listers/gateway/v1/expansion_generated.go new file mode 100644 index 000000000..4902c03fc --- /dev/null +++ b/pkg/client/listers/gateway/v1/expansion_generated.go @@ -0,0 +1,27 @@ +/* +Copyright 2020 The Flux 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 lister-gen. DO NOT EDIT. + +package v1 + +// RouteTableListerExpansion allows custom methods to be added to +// RouteTableLister. +type RouteTableListerExpansion interface{} + +// RouteTableNamespaceListerExpansion allows custom methods to be added to +// RouteTableNamespaceLister. +type RouteTableNamespaceListerExpansion interface{} diff --git a/pkg/client/listers/gloo/v1/routetable.go b/pkg/client/listers/gateway/v1/routetable.go similarity index 98% rename from pkg/client/listers/gloo/v1/routetable.go rename to pkg/client/listers/gateway/v1/routetable.go index 50526d7be..9db84cca8 100644 --- a/pkg/client/listers/gloo/v1/routetable.go +++ b/pkg/client/listers/gateway/v1/routetable.go @@ -19,7 +19,7 @@ limitations under the License. package v1 import ( - v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/client/listers/gloo/v1/expansion_generated.go b/pkg/client/listers/gloo/v1/expansion_generated.go index d513f28d0..0eb3cbc28 100644 --- a/pkg/client/listers/gloo/v1/expansion_generated.go +++ b/pkg/client/listers/gloo/v1/expansion_generated.go @@ -18,14 +18,6 @@ limitations under the License. package v1 -// RouteTableListerExpansion allows custom methods to be added to -// RouteTableLister. -type RouteTableListerExpansion interface{} - -// RouteTableNamespaceListerExpansion allows custom methods to be added to -// RouteTableNamespaceLister. -type RouteTableNamespaceListerExpansion interface{} - // UpstreamListerExpansion allows custom methods to be added to // UpstreamLister. type UpstreamListerExpansion interface{} diff --git a/pkg/client/listers/gloo/v1/upstream.go b/pkg/client/listers/gloo/v1/upstream.go index 0f7af0c20..c4f50968a 100644 --- a/pkg/client/listers/gloo/v1/upstream.go +++ b/pkg/client/listers/gloo/v1/upstream.go @@ -19,7 +19,7 @@ limitations under the License. package v1 import ( - v1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + v1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/tools/cache" diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 01bc0de0a..3ad19ae1c 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -20,7 +20,8 @@ import ( "context" "fmt" - gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" + gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" + gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "go.uber.org/zap" @@ -44,34 +45,47 @@ type GlooRouter struct { // Reconcile creates or updates the Gloo Edge route table func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { apexName, primaryName, canaryName := canary.GetServiceNames() - canaryUpstreamName := fmt.Sprintf("%s-%s-canaryUpstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) - primaryUpstreamName := fmt.Sprintf("%s-%s-primaryUpstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + canaryUpstreamName := fmt.Sprintf("%s-%s-canaryupstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + primaryUpstreamName := fmt.Sprintf("%s-%s-primaryupstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + upstreamClient := gr.glooClient.GlooV1().Upstreams(canary.Namespace) // Create upstreams for the canary/primary services created by flagger. // Previously, we relied on gloo discovery to automaticallycreate these upstreams, but this would no longer work if // discovery was turned off. // KubeServiceDestinations can be disabled in gloo configuration, so we don't use those either. - canaryUs := getGlooUpstreamForKubeService(canary, canaryUpstreamName, canaryName) - primaryUs := getGlooUpstreamForKubeService(canary, primaryUpstreamName, primaryName) - _, err := gr.glooClient.GatewayV1().Upstreams(canary.Namespace).Create(context.TODO(), canaryUs, metav1.CreateOptions{}) - if err != nil { - return err + _, err := upstreamClient.Get(context.TODO(), canaryUpstreamName, metav1.GetOptions{}) + if errors.IsNotFound(err){ + canaryUs := getGlooUpstreamForKubeService(canary, canaryUpstreamName, canaryName) + _, err := gr.glooClient.GlooV1().Upstreams(canary.Namespace).Create(context.TODO(), canaryUs, metav1.CreateOptions{}) + if err != nil { + return fmt.Errorf("upstream %s.%s create query error: %w", canaryUpstreamName, canary.Namespace, err) + } + } else if err != nil { + return fmt.Errorf("upstream %s.%s get query error: %w", canaryUpstreamName, canary.Namespace, err) } - _, err = gr.glooClient.GatewayV1().Upstreams(canary.Namespace).Create(context.TODO(), primaryUs, metav1.CreateOptions{}) - if err != nil { - return err + + _, err = upstreamClient.Get(context.TODO(), primaryUpstreamName, metav1.GetOptions{}) + if errors.IsNotFound(err) { + primaryUs := getGlooUpstreamForKubeService(canary, primaryUpstreamName, primaryName) + _, err := gr.glooClient.GlooV1().Upstreams(canary.Namespace).Create(context.TODO(), primaryUs, metav1.CreateOptions{}) + if err != nil { + return fmt.Errorf("upstream %s.%s create query error: %w", primaryUpstreamName, canary.Namespace, err) + } + }else if err != nil { + return fmt.Errorf("upstream %s.%s get query error: %w", primaryUpstreamName, canary.Namespace, err) } - newSpec := gloov1.RouteTableSpec{ - Routes: []gloov1.Route{ + + newSpec := gatewayv1.RouteTableSpec{ + Routes: []gatewayv1.Route{ { InheritablePathMatchers: true, Matchers: getMatchers(canary), - Action: gloov1.RouteAction{ - Destination: gloov1.MultiDestination{ - Destinations: []gloov1.WeightedDestination{ + Action: gatewayv1.RouteAction{ + Destination: gatewayv1.MultiDestination{ + Destinations: []gatewayv1.WeightedDestination{ { - Destination: gloov1.Destination{ - Upstream: gloov1.ResourceRef{ + Destination: gatewayv1.Destination{ + Upstream: gatewayv1.ResourceRef{ Name: primaryUpstreamName, Namespace: canary.Namespace, }, @@ -79,8 +93,8 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { Weight: 100, }, { - Destination: gloov1.Destination{ - Upstream: gloov1.ResourceRef{ + Destination: gatewayv1.Destination{ + Upstream: gatewayv1.ResourceRef{ Name: canaryUpstreamName, Namespace: canary.Namespace, }, @@ -96,8 +110,7 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { routeTable, err := gr.glooClient.GatewayV1().RouteTables(canary.Namespace).Get(context.TODO(), apexName, metav1.GetOptions{}) if errors.IsNotFound(err) { - - routeTable = &gloov1.RouteTable{ + routeTable = &gatewayv1.RouteTable{ ObjectMeta: metav1.ObjectMeta{ Name: apexName, Namespace: canary.Namespace, @@ -128,7 +141,7 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { if diff := cmp.Diff( newSpec, routeTable.Spec, - cmpopts.IgnoreFields(gloov1.WeightedDestination{}, "Weight"), + cmpopts.IgnoreFields(gatewayv1.WeightedDestination{}, "Weight"), ); diff != "" { clone := routeTable.DeepCopy() clone.Spec = newSpec @@ -185,8 +198,8 @@ func (gr *GlooRouter) SetRoutes( _ bool, ) error { apexName, _, _ := canary.GetServiceNames() - canaryName := fmt.Sprintf("%s-%s-canary-%v", canary.Namespace, apexName, canary.Spec.Service.Port) - primaryName := fmt.Sprintf("%s-%s-primary-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + canaryName := fmt.Sprintf("%s-%s-canaryupstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) + primaryName := fmt.Sprintf("%s-%s-primaryupstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) if primaryWeight == 0 && canaryWeight == 0 { return fmt.Errorf("RoutingRule %s.%s update failed: no valid weights", apexName, canary.Namespace) @@ -197,17 +210,17 @@ func (gr *GlooRouter) SetRoutes( return fmt.Errorf("RouteTable %s.%s query error: %w", apexName, canary.Namespace, err) } - routeTable.Spec = gloov1.RouteTableSpec{ - Routes: []gloov1.Route{ + routeTable.Spec = gatewayv1.RouteTableSpec{ + Routes: []gatewayv1.Route{ { InheritablePathMatchers: true, Matchers: getMatchers(canary), - Action: gloov1.RouteAction{ - Destination: gloov1.MultiDestination{ - Destinations: []gloov1.WeightedDestination{ + Action: gatewayv1.RouteAction{ + Destination: gatewayv1.MultiDestination{ + Destinations: []gatewayv1.WeightedDestination{ { - Destination: gloov1.Destination{ - Upstream: gloov1.ResourceRef{ + Destination: gatewayv1.Destination{ + Upstream: gatewayv1.ResourceRef{ Name: primaryName, Namespace: canary.Namespace, }, @@ -215,8 +228,8 @@ func (gr *GlooRouter) SetRoutes( Weight: uint32(primaryWeight), }, { - Destination: gloov1.Destination{ - Upstream: gloov1.ResourceRef{ + Destination: gatewayv1.Destination{ + Upstream: gatewayv1.ResourceRef{ Name: canaryName, Namespace: canary.Namespace, }, @@ -241,7 +254,7 @@ func (gr *GlooRouter) Finalize(_ *flaggerv1.Canary) error { return nil } -func getMatchers(canary *flaggerv1.Canary) []gloov1.Matcher { +func getMatchers(canary *flaggerv1.Canary) []gatewayv1.Matcher { headerMatchers := getHeaderMatchers(canary) methods := getMethods(canary) @@ -250,7 +263,7 @@ func getMatchers(canary *flaggerv1.Canary) []gloov1.Matcher { return nil } - return []gloov1.Matcher{ + return []gatewayv1.Matcher{ { Headers: headerMatchers, Methods: methods, @@ -258,16 +271,16 @@ func getMatchers(canary *flaggerv1.Canary) []gloov1.Matcher { } } -func getHeaderMatchers(canary *flaggerv1.Canary) []gloov1.HeaderMatcher { - var headerMatchers []gloov1.HeaderMatcher +func getHeaderMatchers(canary *flaggerv1.Canary) []gatewayv1.HeaderMatcher { + var headerMatchers []gatewayv1.HeaderMatcher for _, match := range canary.GetAnalysis().Match { for s, stringMatch := range match.Headers { - h := gloov1.HeaderMatcher{ + h := gatewayv1.HeaderMatcher{ Name: s, Value: stringMatch.Exact, } if stringMatch.Regex != "" { - h = gloov1.HeaderMatcher{ + h = gatewayv1.HeaderMatcher{ Name: s, Value: stringMatch.Regex, Regex: true, @@ -292,18 +305,16 @@ func getMethods(canary *flaggerv1.Canary) []string { func getGlooUpstreamForKubeService(canary *flaggerv1.Canary, upstreamName, svcName string) *gloov1.Upstream { return &gloov1.Upstream{ ObjectMeta: metav1.ObjectMeta{ - Name: upstreamName, - Namespace: canary.Namespace, - Labels: canary.Spec.Service.Apex.Labels, - Annotations: canary.Spec.Service.Apex.Annotations, + Name: upstreamName, + Namespace: canary.Namespace, }, - UpstreamType: gloov1.UpstreamType{ - Kube: gloov1.KubeUpstream{ - ServiceName: svcName, - ServiceNamespace: canary.Namespace, - ServicePort: canary.Spec.Service.Port, - Selector: nil, + Spec: gloov1.UpstreamSpec{ + Kube: gloov1.KubeUpstream{ + ServiceName: svcName, + ServiceNamespace: canary.Namespace, + ServicePort: canary.Spec.Service.Port, + Selector: nil, + }, }, - }, } } diff --git a/pkg/router/gloo_test.go b/pkg/router/gloo_test.go index dcf1a6c4c..c2e045f5a 100644 --- a/pkg/router/gloo_test.go +++ b/pkg/router/gloo_test.go @@ -21,11 +21,11 @@ import ( "fmt" "testing" + "github.com/fluxcd/flagger/pkg/apis/gloo" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/v1" ) func TestGlooRouter_Sync(t *testing.T) { @@ -94,8 +94,8 @@ func TestGlooRouter_SetRoutes(t *testing.T) { rt, err := router.glooClient.GatewayV1().RouteTables("default").Get(context.TODO(), "podinfo", metav1.GetOptions{}) require.NoError(t, err) - var pRoute gloov1.WeightedDestination - var cRoute gloov1.WeightedDestination + var pRoute gloo.WeightedDestination + var cRoute gloo.WeightedDestination canaryName := fmt.Sprintf("%s-%s-canary-%v", mocks.canary.Namespace, mocks.canary.Spec.TargetRef.Name, mocks.canary.Spec.Service.Port) primaryName := fmt.Sprintf("%s-%s-primary-%v", mocks.canary.Namespace, mocks.canary.Spec.TargetRef.Name, mocks.canary.Spec.Service.Port) From 51936bdc89b802c8f4553366af0551080e89d1f6 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Thu, 29 Apr 2021 12:19:52 -0400 Subject: [PATCH 06/13] changed upstream names in tests Signed-off-by: Keerthan Ekbote --- pkg/router/gloo.go | 2 +- pkg/router/gloo_test.go | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 3ad19ae1c..49536d6ba 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -166,7 +166,7 @@ func (gr *GlooRouter) GetRoutes(canary *flaggerv1.Canary) ( err error, ) { apexName := canary.Spec.TargetRef.Name - primaryName := fmt.Sprintf("%s-%s-primary-%v", canary.Namespace, canary.Spec.TargetRef.Name, canary.Spec.Service.Port) + primaryName := fmt.Sprintf("%s-%s-primaryupstream-%v", canary.Namespace, canary.Spec.TargetRef.Name, canary.Spec.Service.Port) routeTable, err := gr.glooClient.GatewayV1().RouteTables(canary.Namespace).Get(context.TODO(), apexName, metav1.GetOptions{}) if err != nil { diff --git a/pkg/router/gloo_test.go b/pkg/router/gloo_test.go index c2e045f5a..264aec6a7 100644 --- a/pkg/router/gloo_test.go +++ b/pkg/router/gloo_test.go @@ -19,10 +19,9 @@ package router import ( "context" "fmt" + gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" "testing" - "github.com/fluxcd/flagger/pkg/apis/gloo" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -94,10 +93,10 @@ func TestGlooRouter_SetRoutes(t *testing.T) { rt, err := router.glooClient.GatewayV1().RouteTables("default").Get(context.TODO(), "podinfo", metav1.GetOptions{}) require.NoError(t, err) - var pRoute gloo.WeightedDestination - var cRoute gloo.WeightedDestination - canaryName := fmt.Sprintf("%s-%s-canary-%v", mocks.canary.Namespace, mocks.canary.Spec.TargetRef.Name, mocks.canary.Spec.Service.Port) - primaryName := fmt.Sprintf("%s-%s-primary-%v", mocks.canary.Namespace, mocks.canary.Spec.TargetRef.Name, mocks.canary.Spec.Service.Port) + var pRoute gatewayv1.WeightedDestination + var cRoute gatewayv1.WeightedDestination + canaryName := fmt.Sprintf("%s-%s-canaryupstream-%v", mocks.canary.Namespace, mocks.canary.Spec.TargetRef.Name, mocks.canary.Spec.Service.Port) + primaryName := fmt.Sprintf("%s-%s-primaryupstream-%v", mocks.canary.Namespace, mocks.canary.Spec.TargetRef.Name, mocks.canary.Spec.Service.Port) for _, dest := range rt.Spec.Routes[0].Action.Destination.Destinations { if dest.Destination.Upstream.Name == primaryName { From fd778be943aa4d329083f518758ebafaa78e121b Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Thu, 29 Apr 2021 19:12:01 -0400 Subject: [PATCH 07/13] updated prom queries to new envoy clusters Signed-off-by: Keerthan Ekbote --- pkg/metrics/observers/gloo.go | 6 +-- pkg/router/gloo.go | 95 +++++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 40 deletions(-) diff --git a/pkg/metrics/observers/gloo.go b/pkg/metrics/observers/gloo.go index 716c5c1f3..4de0e48d0 100644 --- a/pkg/metrics/observers/gloo.go +++ b/pkg/metrics/observers/gloo.go @@ -31,7 +31,7 @@ var glooQueries = map[string]string{ sum( rate( envoy_cluster_upstream_rq{ - envoy_cluster_name=~"{{ namespace }}-{{ target }}-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", + envoy_cluster_name=~"{{ namespace }}-{{ target }}-canaryupstream-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", envoy_response_code!~"5.*" }[{{ interval }}] ) @@ -40,7 +40,7 @@ var glooQueries = map[string]string{ sum( rate( envoy_cluster_upstream_rq{ - envoy_cluster_name=~"{{ namespace }}-{{ target }}-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", + envoy_cluster_name=~"{{ namespace }}-{{ target }}-canaryupstream-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[{{ interval }}] ) ) @@ -51,7 +51,7 @@ var glooQueries = map[string]string{ sum( rate( envoy_cluster_upstream_rq_time_bucket{ - envoy_cluster_name=~"{{ namespace }}-{{ target }}-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", + envoy_cluster_name=~"{{ namespace }}-{{ target }}-canaryupstream-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[{{ interval }}] ) ) by (le) diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 49536d6ba..e38d02b21 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -19,6 +19,7 @@ package router import ( "context" "fmt" + corev1 "k8s.io/api/core/v1" gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" gloov1 "github.com/fluxcd/flagger/pkg/apis/gloo/gloo/v1" @@ -44,37 +45,24 @@ type GlooRouter struct { // Reconcile creates or updates the Gloo Edge route table func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { - apexName, primaryName, canaryName := canary.GetServiceNames() + apexName, _, _ := canary.GetServiceNames() canaryUpstreamName := fmt.Sprintf("%s-%s-canaryupstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) primaryUpstreamName := fmt.Sprintf("%s-%s-primaryupstream-%v", canary.Namespace, apexName, canary.Spec.Service.Port) - upstreamClient := gr.glooClient.GlooV1().Upstreams(canary.Namespace) // Create upstreams for the canary/primary services created by flagger. // Previously, we relied on gloo discovery to automaticallycreate these upstreams, but this would no longer work if // discovery was turned off. // KubeServiceDestinations can be disabled in gloo configuration, so we don't use those either. - _, err := upstreamClient.Get(context.TODO(), canaryUpstreamName, metav1.GetOptions{}) - if errors.IsNotFound(err){ - canaryUs := getGlooUpstreamForKubeService(canary, canaryUpstreamName, canaryName) - _, err := gr.glooClient.GlooV1().Upstreams(canary.Namespace).Create(context.TODO(), canaryUs, metav1.CreateOptions{}) - if err != nil { - return fmt.Errorf("upstream %s.%s create query error: %w", canaryUpstreamName, canary.Namespace, err) - } - } else if err != nil { - return fmt.Errorf("upstream %s.%s get query error: %w", canaryUpstreamName, canary.Namespace, err) + err := gr.createFlaggerUpstream(canary, primaryUpstreamName, false) + if err != nil { + return fmt.Errorf("error creating flagger primary upstream: %w", err) } - - _, err = upstreamClient.Get(context.TODO(), primaryUpstreamName, metav1.GetOptions{}) - if errors.IsNotFound(err) { - primaryUs := getGlooUpstreamForKubeService(canary, primaryUpstreamName, primaryName) - _, err := gr.glooClient.GlooV1().Upstreams(canary.Namespace).Create(context.TODO(), primaryUs, metav1.CreateOptions{}) - if err != nil { - return fmt.Errorf("upstream %s.%s create query error: %w", primaryUpstreamName, canary.Namespace, err) - } - }else if err != nil { - return fmt.Errorf("upstream %s.%s get query error: %w", primaryUpstreamName, canary.Namespace, err) + err = gr.createFlaggerUpstream(canary, canaryUpstreamName, true) + if err != nil { + return fmt.Errorf("error creating flagger canary upstream: %w", err) } + newSpec := gatewayv1.RouteTableSpec{ Routes: []gatewayv1.Route{ { @@ -254,6 +242,54 @@ func (gr *GlooRouter) Finalize(_ *flaggerv1.Canary) error { return nil } +func (gr *GlooRouter) createFlaggerUpstream(canary *flaggerv1.Canary, upstreamName string, isCanary bool) error{ + _, primaryName, canaryName := canary.GetServiceNames() + upstreamClient := gr.glooClient.GlooV1().Upstreams(canary.Namespace) + svcName := primaryName + if isCanary{ + svcName = canaryName + } + svc, err := gr.kubeClient.CoreV1().Services(canary.Namespace).Get(context.TODO(), svcName, metav1.GetOptions{}) + if err != nil{ + return fmt.Errorf("service %s.%s get query error: %w", svcName, canary.Namespace, err) + } + _, err = upstreamClient.Get(context.TODO(), upstreamName, metav1.GetOptions{}) + if errors.IsNotFound(err) { + canaryUs := gr.getGlooUpstreamKubeService(canary, svc, upstreamName) + _, err := gr.glooClient.GlooV1().Upstreams(canary.Namespace).Create(context.TODO(), canaryUs, metav1.CreateOptions{}) + if err != nil { + return fmt.Errorf("upstream %s.%s create query error: %w", upstreamName, canary.Namespace, err) + } + } else if err != nil { + return fmt.Errorf("upstream %s.%s get query error: %w", upstreamName, canary.Namespace, err) + } + return nil +} + +func (gr *GlooRouter) getGlooUpstreamKubeService(canary *flaggerv1.Canary, svc *corev1.Service, upstreamName string) *gloov1.Upstream { + return &gloov1.Upstream{ + ObjectMeta: metav1.ObjectMeta{ + Name: upstreamName, + Namespace: canary.Namespace, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(canary, schema.GroupVersionKind{ + Group: flaggerv1.SchemeGroupVersion.Group, + Version: flaggerv1.SchemeGroupVersion.Version, + Kind: flaggerv1.CanaryKind, + }), + }, + }, + Spec: gloov1.UpstreamSpec{ + Kube: gloov1.KubeUpstream{ + ServiceName: svc.GetName(), + ServiceNamespace: canary.Namespace, + ServicePort: canary.Spec.Service.Port, + Selector: svc.Spec.Selector, + }, + }, + } +} + func getMatchers(canary *flaggerv1.Canary) []gatewayv1.Matcher { headerMatchers := getHeaderMatchers(canary) @@ -302,19 +338,4 @@ func getMethods(canary *flaggerv1.Canary) []string { return methods } -func getGlooUpstreamForKubeService(canary *flaggerv1.Canary, upstreamName, svcName string) *gloov1.Upstream { - return &gloov1.Upstream{ - ObjectMeta: metav1.ObjectMeta{ - Name: upstreamName, - Namespace: canary.Namespace, - }, - Spec: gloov1.UpstreamSpec{ - Kube: gloov1.KubeUpstream{ - ServiceName: svcName, - ServiceNamespace: canary.Namespace, - ServicePort: canary.Spec.Service.Port, - Selector: nil, - }, - }, - } -} + From d8c8b90a956afbd0eabcfe379fdb8705464612a9 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Fri, 30 Apr 2021 09:50:18 -0400 Subject: [PATCH 08/13] make fmt Signed-off-by: Keerthan Ekbote --- pkg/router/gloo.go | 10 ++++------ pkg/router/gloo_test.go | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index e38d02b21..9edb5a6d8 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -19,6 +19,7 @@ package router import ( "context" "fmt" + corev1 "k8s.io/api/core/v1" gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" @@ -62,7 +63,6 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { return fmt.Errorf("error creating flagger canary upstream: %w", err) } - newSpec := gatewayv1.RouteTableSpec{ Routes: []gatewayv1.Route{ { @@ -242,15 +242,15 @@ func (gr *GlooRouter) Finalize(_ *flaggerv1.Canary) error { return nil } -func (gr *GlooRouter) createFlaggerUpstream(canary *flaggerv1.Canary, upstreamName string, isCanary bool) error{ +func (gr *GlooRouter) createFlaggerUpstream(canary *flaggerv1.Canary, upstreamName string, isCanary bool) error { _, primaryName, canaryName := canary.GetServiceNames() upstreamClient := gr.glooClient.GlooV1().Upstreams(canary.Namespace) svcName := primaryName - if isCanary{ + if isCanary { svcName = canaryName } svc, err := gr.kubeClient.CoreV1().Services(canary.Namespace).Get(context.TODO(), svcName, metav1.GetOptions{}) - if err != nil{ + if err != nil { return fmt.Errorf("service %s.%s get query error: %w", svcName, canary.Namespace, err) } _, err = upstreamClient.Get(context.TODO(), upstreamName, metav1.GetOptions{}) @@ -337,5 +337,3 @@ func getMethods(canary *flaggerv1.Canary) []string { } return methods } - - diff --git a/pkg/router/gloo_test.go b/pkg/router/gloo_test.go index 264aec6a7..0b5267f0b 100644 --- a/pkg/router/gloo_test.go +++ b/pkg/router/gloo_test.go @@ -19,9 +19,10 @@ package router import ( "context" "fmt" - gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" "testing" + gatewayv1 "github.com/fluxcd/flagger/pkg/apis/gloo/gateway/v1" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" From f0f44c9d3575692cf19357355b26ebc482d057dc Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Wed, 5 May 2021 11:17:25 -0400 Subject: [PATCH 09/13] updated gloo unit tests Signed-off-by: Keerthan Ekbote --- pkg/router/gloo_test.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/router/gloo_test.go b/pkg/router/gloo_test.go index 0b5267f0b..a62acdbdc 100644 --- a/pkg/router/gloo_test.go +++ b/pkg/router/gloo_test.go @@ -36,9 +36,17 @@ func TestGlooRouter_Sync(t *testing.T) { glooClient: mocks.meshClient, kubeClient: mocks.kubeClient, } - + svcRouter := &KubernetesDefaultRouter{ + kubeClient: mocks.kubeClient, + flaggerClient: mocks.flaggerClient, + logger: mocks.logger, + } + err := svcRouter.Initialize(mocks.canary) + require.NoError(t, err) + err = svcRouter.Reconcile(mocks.canary) + require.NoError(t, err) // init - err := router.Reconcile(mocks.canary) + err = router.Reconcile(mocks.canary) require.NoError(t, err) // test insert From 99b3775926dff4bcbf35692773d38b405f7943c6 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Wed, 5 May 2021 11:21:43 -0400 Subject: [PATCH 10/13] fixed typo in gloo/v1/types.go Signed-off-by: Keerthan Ekbote --- pkg/apis/gloo/gloo/v1/types.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/apis/gloo/gloo/v1/types.go b/pkg/apis/gloo/gloo/v1/types.go index 5a592e2c7..38fde7daa 100644 --- a/pkg/apis/gloo/gloo/v1/types.go +++ b/pkg/apis/gloo/gloo/v1/types.go @@ -16,11 +16,11 @@ type Upstream struct { } type UpstreamSpec struct { - Kube KubeUpstream `json:"kube,omitempty""` + Kube KubeUpstream `json:"kube,omitempty"` } type KubeUpstream struct { - ServiceName string `json:"service_name,omitempty""` + ServiceName string `json:"service_name,omitempty"` ServiceNamespace string `json:"service_namespace,omitempty"` ServicePort int32 `json:"service_port,omitempty"` Selector map[string]string `json:"selector,omitempty"` From fdc8dd879514ec7fa4f3d8ac53f795efd7294e16 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Wed, 5 May 2021 11:29:14 -0400 Subject: [PATCH 11/13] fixed observers test Signed-off-by: Keerthan Ekbote --- pkg/metrics/observers/gloo_test.go | 4 ++-- pkg/router/gloo_test.go | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pkg/metrics/observers/gloo_test.go b/pkg/metrics/observers/gloo_test.go index 830e3a7d1..7c413db7b 100644 --- a/pkg/metrics/observers/gloo_test.go +++ b/pkg/metrics/observers/gloo_test.go @@ -30,7 +30,7 @@ import ( ) func TestGlooObserver_GetRequestSuccessRate(t *testing.T) { - expected := ` sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", envoy_response_code!~"5.*" }[1m] ) ) / sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[1m] ) ) * 100` + expected := ` sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default-podinfo-canaryupstream-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", envoy_response_code!~"5.*" }[1m] ) ) / sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default-podinfo-canaryupstream-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[1m] ) ) * 100` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] @@ -64,7 +64,7 @@ func TestGlooObserver_GetRequestSuccessRate(t *testing.T) { } func TestGlooObserver_GetRequestDuration(t *testing.T) { - expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ envoy_cluster_name=~"default-podinfo-canary-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[1m] ) ) by (le) )` + expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ envoy_cluster_name=~"default-podinfo-canaryupstream-[0-9a-zA-Z-]+_[0-9a-zA-Z-]+", }[1m] ) ) by (le) )` ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { promql := r.URL.Query()["query"][0] diff --git a/pkg/router/gloo_test.go b/pkg/router/gloo_test.go index a62acdbdc..a6c321d5b 100644 --- a/pkg/router/gloo_test.go +++ b/pkg/router/gloo_test.go @@ -85,8 +85,17 @@ func TestGlooRouter_SetRoutes(t *testing.T) { glooClient: mocks.meshClient, kubeClient: mocks.kubeClient, } + svcRouter := &KubernetesDefaultRouter{ + kubeClient: mocks.kubeClient, + flaggerClient: mocks.flaggerClient, + logger: mocks.logger, + } + err := svcRouter.Initialize(mocks.canary) + require.NoError(t, err) + err = svcRouter.Reconcile(mocks.canary) + require.NoError(t, err) - err := router.Reconcile(mocks.canary) + err = router.Reconcile(mocks.canary) require.NoError(t, err) _, _, _, err = router.GetRoutes(mocks.canary) @@ -147,8 +156,17 @@ func TestGlooRouter_GetRoutes(t *testing.T) { glooClient: mocks.meshClient, kubeClient: mocks.kubeClient, } + svcRouter := &KubernetesDefaultRouter{ + kubeClient: mocks.kubeClient, + flaggerClient: mocks.flaggerClient, + logger: mocks.logger, + } + err := svcRouter.Initialize(mocks.canary) + require.NoError(t, err) + err = svcRouter.Reconcile(mocks.canary) + require.NoError(t, err) - err := router.Reconcile(mocks.canary) + err = router.Reconcile(mocks.canary) require.NoError(t, err) p, c, m, err := router.GetRoutes(mocks.canary) From 51605d9e04ad72dcf5e0758c6fcad65f23d93335 Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Thu, 6 May 2021 10:26:33 -0400 Subject: [PATCH 12/13] Updated docs Signed-off-by: Keerthan Ekbote --- charts/flagger/README.md | 2 +- docs/gitbook/tutorials/gloo-progressive-delivery.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/charts/flagger/README.md b/charts/flagger/README.md index 51ac698a1..98a51cc3c 100644 --- a/charts/flagger/README.md +++ b/charts/flagger/README.md @@ -68,7 +68,7 @@ $ helm upgrade -i flagger flagger/flagger \ --set prometheus.install=true ``` -To install Flagger and Prometheus for **Gloo** (requires Gloo discovery enabled): +To install Flagger and Prometheus for **Gloo** (no longer requires Gloo discovery): ```console $ helm upgrade -i flagger flagger/flagger \ diff --git a/docs/gitbook/tutorials/gloo-progressive-delivery.md b/docs/gitbook/tutorials/gloo-progressive-delivery.md index 72b21e07b..8d9e1d633 100644 --- a/docs/gitbook/tutorials/gloo-progressive-delivery.md +++ b/docs/gitbook/tutorials/gloo-progressive-delivery.md @@ -174,6 +174,8 @@ service/podinfo service/podinfo-canary service/podinfo-primary routetables.gateway.solo.io/podinfo +upstreams.gloo.solo.io/test-podinfo-canaryupstream-80 +upstreams.gloo.solo.io/test-podinfo-primaryupstream-80 ``` When the bootstrap finishes Flagger will set the canary status to initialized: From 06c4151ec4af44389b6143098532948e8546033e Mon Sep 17 00:00:00 2001 From: Keerthan Ekbote Date: Thu, 6 May 2021 13:00:23 -0400 Subject: [PATCH 13/13] change port numbers in gloo progressive delivery docs Signed-off-by: Keerthan Ekbote --- docs/gitbook/tutorials/gloo-progressive-delivery.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/gitbook/tutorials/gloo-progressive-delivery.md b/docs/gitbook/tutorials/gloo-progressive-delivery.md index 8d9e1d633..fd92ce8ff 100644 --- a/docs/gitbook/tutorials/gloo-progressive-delivery.md +++ b/docs/gitbook/tutorials/gloo-progressive-delivery.md @@ -174,8 +174,8 @@ service/podinfo service/podinfo-canary service/podinfo-primary routetables.gateway.solo.io/podinfo -upstreams.gloo.solo.io/test-podinfo-canaryupstream-80 -upstreams.gloo.solo.io/test-podinfo-primaryupstream-80 +upstreams.gloo.solo.io/test-podinfo-canaryupstream-9898 +upstreams.gloo.solo.io/test-podinfo-primaryupstream-9898 ``` When the bootstrap finishes Flagger will set the canary status to initialized: