From 4faa6939f76f9d3825949e807f31db697d861bd7 Mon Sep 17 00:00:00 2001 From: AiRanthem Date: Tue, 14 Jan 2025 15:30:45 +0800 Subject: [PATCH] release 0.6.0 Signed-off-by: AiRanthem --- client/clientset/versioned/clientset.go | 3 +- .../typed/rollouts/v1alpha1/batchrelease.go | 195 +++ .../v1alpha1/fake/fake_batchrelease.go | 142 ++ .../v1alpha1/fake/fake_rollouthistory.go | 142 ++ .../v1alpha1/fake/fake_rollouts_client.go | 8 + .../rollouts/v1alpha1/generated_expansion.go | 4 + .../typed/rollouts/v1alpha1/rollouthistory.go | 195 +++ .../rollouts/v1alpha1/rollouts_client.go | 10 + client/informers/externalversions/factory.go | 79 +- client/informers/externalversions/generic.go | 4 + .../rollouts/v1alpha1/batchrelease.go | 90 ++ .../rollouts/v1alpha1/interface.go | 14 + .../rollouts/v1alpha1/rollouthistory.go | 90 ++ .../listers/rollouts/v1alpha1/batchrelease.go | 99 ++ .../rollouts/v1alpha1/expansion_generated.go | 16 + .../rollouts/v1alpha1/rollouthistory.go | 99 ++ go.mod | 35 +- go.sum | 248 +-- pkg/rollouts/openapi_generated.go | 1413 ++++++++++++++++- pkg/rollouts/violation_exceptions.list | 9 +- rollouts/v1alpha1/batchrelease_plan_types.go | 157 ++ rollouts/v1alpha1/batchrelease_types.go | 59 + rollouts/v1alpha1/conversion.go | 477 ++++++ rollouts/v1alpha1/deployment_types.go | 105 ++ rollouts/v1alpha1/groupversion_info.go | 3 +- rollouts/v1alpha1/rollouthistory_types.go | 151 ++ rollouts/v1alpha1/trafficrouting_types.go | 2 +- rollouts/v1alpha1/zz_generated.deepcopy.go | 479 +++++- rollouts/v1beta1/batchrelease_plan_types.go | 16 +- rollouts/v1beta1/deployment_types.go | 14 +- rollouts/v1beta1/groupversion_info.go | 2 +- rollouts/v1beta1/rollout_types.go | 331 +++- rollouts/v1beta1/trafficrouting.go | 1 + rollouts/v1beta1/zz_generated.deepcopy.go | 100 +- .../openkruise_rollouts_kustomize_schema.json | 981 +++++++++++- 35 files changed, 5447 insertions(+), 326 deletions(-) create mode 100644 client/clientset/versioned/typed/rollouts/v1alpha1/batchrelease.go create mode 100644 client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_batchrelease.go create mode 100644 client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouthistory.go create mode 100644 client/clientset/versioned/typed/rollouts/v1alpha1/rollouthistory.go create mode 100644 client/informers/externalversions/rollouts/v1alpha1/batchrelease.go create mode 100644 client/informers/externalversions/rollouts/v1alpha1/rollouthistory.go create mode 100644 client/listers/rollouts/v1alpha1/batchrelease.go create mode 100644 client/listers/rollouts/v1alpha1/rollouthistory.go create mode 100644 rollouts/v1alpha1/batchrelease_plan_types.go create mode 100644 rollouts/v1alpha1/batchrelease_types.go create mode 100644 rollouts/v1alpha1/conversion.go create mode 100644 rollouts/v1alpha1/deployment_types.go create mode 100644 rollouts/v1alpha1/rollouthistory_types.go diff --git a/client/clientset/versioned/clientset.go b/client/clientset/versioned/clientset.go index 388f0be..56d11c3 100644 --- a/client/clientset/versioned/clientset.go +++ b/client/clientset/versioned/clientset.go @@ -35,8 +35,7 @@ type Interface interface { RolloutsV1beta1() rolloutsv1beta1.RolloutsV1beta1Interface } -// Clientset contains the clients for groups. Each group has exactly one -// version included in a Clientset. +// Clientset contains the clients for groups. type Clientset struct { *discovery.DiscoveryClient rolloutsV1alpha1 *rolloutsv1alpha1.RolloutsV1alpha1Client diff --git a/client/clientset/versioned/typed/rollouts/v1alpha1/batchrelease.go b/client/clientset/versioned/typed/rollouts/v1alpha1/batchrelease.go new file mode 100644 index 0000000..0451fa2 --- /dev/null +++ b/client/clientset/versioned/typed/rollouts/v1alpha1/batchrelease.go @@ -0,0 +1,195 @@ +/* +Copyright 2024 The Kruise Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + "time" + + scheme "github.com/openkruise/kruise-rollout-api/client/clientset/versioned/scheme" + v1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// BatchReleasesGetter has a method to return a BatchReleaseInterface. +// A group's client should implement this interface. +type BatchReleasesGetter interface { + BatchReleases(namespace string) BatchReleaseInterface +} + +// BatchReleaseInterface has methods to work with BatchRelease resources. +type BatchReleaseInterface interface { + Create(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.CreateOptions) (*v1alpha1.BatchRelease, error) + Update(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.UpdateOptions) (*v1alpha1.BatchRelease, error) + UpdateStatus(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.UpdateOptions) (*v1alpha1.BatchRelease, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.BatchRelease, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.BatchReleaseList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.BatchRelease, err error) + BatchReleaseExpansion +} + +// batchReleases implements BatchReleaseInterface +type batchReleases struct { + client rest.Interface + ns string +} + +// newBatchReleases returns a BatchReleases +func newBatchReleases(c *RolloutsV1alpha1Client, namespace string) *batchReleases { + return &batchReleases{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the batchRelease, and returns the corresponding batchRelease object, and an error if there is any. +func (c *batchReleases) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.BatchRelease, err error) { + result = &v1alpha1.BatchRelease{} + err = c.client.Get(). + Namespace(c.ns). + Resource("batchreleases"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of BatchReleases that match those selectors. +func (c *batchReleases) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.BatchReleaseList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.BatchReleaseList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("batchreleases"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested batchReleases. +func (c *batchReleases) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("batchreleases"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a batchRelease and creates it. Returns the server's representation of the batchRelease, and an error, if there is any. +func (c *batchReleases) Create(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.CreateOptions) (result *v1alpha1.BatchRelease, err error) { + result = &v1alpha1.BatchRelease{} + err = c.client.Post(). + Namespace(c.ns). + Resource("batchreleases"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(batchRelease). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a batchRelease and updates it. Returns the server's representation of the batchRelease, and an error, if there is any. +func (c *batchReleases) Update(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.UpdateOptions) (result *v1alpha1.BatchRelease, err error) { + result = &v1alpha1.BatchRelease{} + err = c.client.Put(). + Namespace(c.ns). + Resource("batchreleases"). + Name(batchRelease.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(batchRelease). + Do(ctx). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *batchReleases) UpdateStatus(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.UpdateOptions) (result *v1alpha1.BatchRelease, err error) { + result = &v1alpha1.BatchRelease{} + err = c.client.Put(). + Namespace(c.ns). + Resource("batchreleases"). + Name(batchRelease.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(batchRelease). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the batchRelease and deletes it. Returns an error if one occurs. +func (c *batchReleases) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("batchreleases"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *batchReleases) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("batchreleases"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched batchRelease. +func (c *batchReleases) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.BatchRelease, err error) { + result = &v1alpha1.BatchRelease{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("batchreleases"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_batchrelease.go b/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_batchrelease.go new file mode 100644 index 0000000..f2d275a --- /dev/null +++ b/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_batchrelease.go @@ -0,0 +1,142 @@ +/* +Copyright 2024 The Kruise 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" + + v1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + 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" +) + +// FakeBatchReleases implements BatchReleaseInterface +type FakeBatchReleases struct { + Fake *FakeRolloutsV1alpha1 + ns string +} + +var batchreleasesResource = schema.GroupVersionResource{Group: "rollouts.kruise.io", Version: "v1alpha1", Resource: "batchreleases"} + +var batchreleasesKind = schema.GroupVersionKind{Group: "rollouts.kruise.io", Version: "v1alpha1", Kind: "BatchRelease"} + +// Get takes name of the batchRelease, and returns the corresponding batchRelease object, and an error if there is any. +func (c *FakeBatchReleases) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.BatchRelease, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(batchreleasesResource, c.ns, name), &v1alpha1.BatchRelease{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BatchRelease), err +} + +// List takes label and field selectors, and returns the list of BatchReleases that match those selectors. +func (c *FakeBatchReleases) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.BatchReleaseList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(batchreleasesResource, batchreleasesKind, c.ns, opts), &v1alpha1.BatchReleaseList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.BatchReleaseList{ListMeta: obj.(*v1alpha1.BatchReleaseList).ListMeta} + for _, item := range obj.(*v1alpha1.BatchReleaseList).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 batchReleases. +func (c *FakeBatchReleases) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(batchreleasesResource, c.ns, opts)) + +} + +// Create takes the representation of a batchRelease and creates it. Returns the server's representation of the batchRelease, and an error, if there is any. +func (c *FakeBatchReleases) Create(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.CreateOptions) (result *v1alpha1.BatchRelease, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(batchreleasesResource, c.ns, batchRelease), &v1alpha1.BatchRelease{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BatchRelease), err +} + +// Update takes the representation of a batchRelease and updates it. Returns the server's representation of the batchRelease, and an error, if there is any. +func (c *FakeBatchReleases) Update(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.UpdateOptions) (result *v1alpha1.BatchRelease, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(batchreleasesResource, c.ns, batchRelease), &v1alpha1.BatchRelease{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BatchRelease), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeBatchReleases) UpdateStatus(ctx context.Context, batchRelease *v1alpha1.BatchRelease, opts v1.UpdateOptions) (*v1alpha1.BatchRelease, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(batchreleasesResource, "status", c.ns, batchRelease), &v1alpha1.BatchRelease{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BatchRelease), err +} + +// Delete takes name of the batchRelease and deletes it. Returns an error if one occurs. +func (c *FakeBatchReleases) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteActionWithOptions(batchreleasesResource, c.ns, name, opts), &v1alpha1.BatchRelease{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeBatchReleases) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(batchreleasesResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &v1alpha1.BatchReleaseList{}) + return err +} + +// Patch applies the patch and returns the patched batchRelease. +func (c *FakeBatchReleases) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.BatchRelease, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(batchreleasesResource, c.ns, name, pt, data, subresources...), &v1alpha1.BatchRelease{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.BatchRelease), err +} diff --git a/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouthistory.go b/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouthistory.go new file mode 100644 index 0000000..deb943b --- /dev/null +++ b/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouthistory.go @@ -0,0 +1,142 @@ +/* +Copyright 2024 The Kruise 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" + + v1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + 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" +) + +// FakeRolloutHistories implements RolloutHistoryInterface +type FakeRolloutHistories struct { + Fake *FakeRolloutsV1alpha1 + ns string +} + +var rollouthistoriesResource = schema.GroupVersionResource{Group: "rollouts.kruise.io", Version: "v1alpha1", Resource: "rollouthistories"} + +var rollouthistoriesKind = schema.GroupVersionKind{Group: "rollouts.kruise.io", Version: "v1alpha1", Kind: "RolloutHistory"} + +// Get takes name of the rolloutHistory, and returns the corresponding rolloutHistory object, and an error if there is any. +func (c *FakeRolloutHistories) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.RolloutHistory, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(rollouthistoriesResource, c.ns, name), &v1alpha1.RolloutHistory{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.RolloutHistory), err +} + +// List takes label and field selectors, and returns the list of RolloutHistories that match those selectors. +func (c *FakeRolloutHistories) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.RolloutHistoryList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(rollouthistoriesResource, rollouthistoriesKind, c.ns, opts), &v1alpha1.RolloutHistoryList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.RolloutHistoryList{ListMeta: obj.(*v1alpha1.RolloutHistoryList).ListMeta} + for _, item := range obj.(*v1alpha1.RolloutHistoryList).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 rolloutHistories. +func (c *FakeRolloutHistories) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(rollouthistoriesResource, c.ns, opts)) + +} + +// Create takes the representation of a rolloutHistory and creates it. Returns the server's representation of the rolloutHistory, and an error, if there is any. +func (c *FakeRolloutHistories) Create(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.CreateOptions) (result *v1alpha1.RolloutHistory, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(rollouthistoriesResource, c.ns, rolloutHistory), &v1alpha1.RolloutHistory{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.RolloutHistory), err +} + +// Update takes the representation of a rolloutHistory and updates it. Returns the server's representation of the rolloutHistory, and an error, if there is any. +func (c *FakeRolloutHistories) Update(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.UpdateOptions) (result *v1alpha1.RolloutHistory, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(rollouthistoriesResource, c.ns, rolloutHistory), &v1alpha1.RolloutHistory{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.RolloutHistory), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeRolloutHistories) UpdateStatus(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.UpdateOptions) (*v1alpha1.RolloutHistory, error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateSubresourceAction(rollouthistoriesResource, "status", c.ns, rolloutHistory), &v1alpha1.RolloutHistory{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.RolloutHistory), err +} + +// Delete takes name of the rolloutHistory and deletes it. Returns an error if one occurs. +func (c *FakeRolloutHistories) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteActionWithOptions(rollouthistoriesResource, c.ns, name, opts), &v1alpha1.RolloutHistory{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeRolloutHistories) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(rollouthistoriesResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &v1alpha1.RolloutHistoryList{}) + return err +} + +// Patch applies the patch and returns the patched rolloutHistory. +func (c *FakeRolloutHistories) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.RolloutHistory, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(rollouthistoriesResource, c.ns, name, pt, data, subresources...), &v1alpha1.RolloutHistory{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.RolloutHistory), err +} diff --git a/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouts_client.go b/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouts_client.go index 3379935..0cbd13e 100644 --- a/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouts_client.go +++ b/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollouts_client.go @@ -28,10 +28,18 @@ type FakeRolloutsV1alpha1 struct { *testing.Fake } +func (c *FakeRolloutsV1alpha1) BatchReleases(namespace string) v1alpha1.BatchReleaseInterface { + return &FakeBatchReleases{c, namespace} +} + func (c *FakeRolloutsV1alpha1) Rollouts(namespace string) v1alpha1.RolloutInterface { return &FakeRollouts{c, namespace} } +func (c *FakeRolloutsV1alpha1) RolloutHistories(namespace string) v1alpha1.RolloutHistoryInterface { + return &FakeRolloutHistories{c, namespace} +} + func (c *FakeRolloutsV1alpha1) TrafficRoutings(namespace string) v1alpha1.TrafficRoutingInterface { return &FakeTrafficRoutings{c, namespace} } diff --git a/client/clientset/versioned/typed/rollouts/v1alpha1/generated_expansion.go b/client/clientset/versioned/typed/rollouts/v1alpha1/generated_expansion.go index 1f96f49..85f1eea 100644 --- a/client/clientset/versioned/typed/rollouts/v1alpha1/generated_expansion.go +++ b/client/clientset/versioned/typed/rollouts/v1alpha1/generated_expansion.go @@ -18,6 +18,10 @@ limitations under the License. package v1alpha1 +type BatchReleaseExpansion interface{} + type RolloutExpansion interface{} +type RolloutHistoryExpansion interface{} + type TrafficRoutingExpansion interface{} diff --git a/client/clientset/versioned/typed/rollouts/v1alpha1/rollouthistory.go b/client/clientset/versioned/typed/rollouts/v1alpha1/rollouthistory.go new file mode 100644 index 0000000..61f2d65 --- /dev/null +++ b/client/clientset/versioned/typed/rollouts/v1alpha1/rollouthistory.go @@ -0,0 +1,195 @@ +/* +Copyright 2024 The Kruise Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + "time" + + scheme "github.com/openkruise/kruise-rollout-api/client/clientset/versioned/scheme" + v1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// RolloutHistoriesGetter has a method to return a RolloutHistoryInterface. +// A group's client should implement this interface. +type RolloutHistoriesGetter interface { + RolloutHistories(namespace string) RolloutHistoryInterface +} + +// RolloutHistoryInterface has methods to work with RolloutHistory resources. +type RolloutHistoryInterface interface { + Create(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.CreateOptions) (*v1alpha1.RolloutHistory, error) + Update(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.UpdateOptions) (*v1alpha1.RolloutHistory, error) + UpdateStatus(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.UpdateOptions) (*v1alpha1.RolloutHistory, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.RolloutHistory, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.RolloutHistoryList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.RolloutHistory, err error) + RolloutHistoryExpansion +} + +// rolloutHistories implements RolloutHistoryInterface +type rolloutHistories struct { + client rest.Interface + ns string +} + +// newRolloutHistories returns a RolloutHistories +func newRolloutHistories(c *RolloutsV1alpha1Client, namespace string) *rolloutHistories { + return &rolloutHistories{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the rolloutHistory, and returns the corresponding rolloutHistory object, and an error if there is any. +func (c *rolloutHistories) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.RolloutHistory, err error) { + result = &v1alpha1.RolloutHistory{} + err = c.client.Get(). + Namespace(c.ns). + Resource("rollouthistories"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of RolloutHistories that match those selectors. +func (c *rolloutHistories) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.RolloutHistoryList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.RolloutHistoryList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("rollouthistories"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested rolloutHistories. +func (c *rolloutHistories) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("rollouthistories"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a rolloutHistory and creates it. Returns the server's representation of the rolloutHistory, and an error, if there is any. +func (c *rolloutHistories) Create(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.CreateOptions) (result *v1alpha1.RolloutHistory, err error) { + result = &v1alpha1.RolloutHistory{} + err = c.client.Post(). + Namespace(c.ns). + Resource("rollouthistories"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(rolloutHistory). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a rolloutHistory and updates it. Returns the server's representation of the rolloutHistory, and an error, if there is any. +func (c *rolloutHistories) Update(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.UpdateOptions) (result *v1alpha1.RolloutHistory, err error) { + result = &v1alpha1.RolloutHistory{} + err = c.client.Put(). + Namespace(c.ns). + Resource("rollouthistories"). + Name(rolloutHistory.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(rolloutHistory). + Do(ctx). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *rolloutHistories) UpdateStatus(ctx context.Context, rolloutHistory *v1alpha1.RolloutHistory, opts v1.UpdateOptions) (result *v1alpha1.RolloutHistory, err error) { + result = &v1alpha1.RolloutHistory{} + err = c.client.Put(). + Namespace(c.ns). + Resource("rollouthistories"). + Name(rolloutHistory.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(rolloutHistory). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the rolloutHistory and deletes it. Returns an error if one occurs. +func (c *rolloutHistories) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("rollouthistories"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *rolloutHistories) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("rollouthistories"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched rolloutHistory. +func (c *rolloutHistories) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.RolloutHistory, err error) { + result = &v1alpha1.RolloutHistory{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("rollouthistories"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/client/clientset/versioned/typed/rollouts/v1alpha1/rollouts_client.go b/client/clientset/versioned/typed/rollouts/v1alpha1/rollouts_client.go index 56bee75..273a849 100644 --- a/client/clientset/versioned/typed/rollouts/v1alpha1/rollouts_client.go +++ b/client/clientset/versioned/typed/rollouts/v1alpha1/rollouts_client.go @@ -28,7 +28,9 @@ import ( type RolloutsV1alpha1Interface interface { RESTClient() rest.Interface + BatchReleasesGetter RolloutsGetter + RolloutHistoriesGetter TrafficRoutingsGetter } @@ -37,10 +39,18 @@ type RolloutsV1alpha1Client struct { restClient rest.Interface } +func (c *RolloutsV1alpha1Client) BatchReleases(namespace string) BatchReleaseInterface { + return newBatchReleases(c, namespace) +} + func (c *RolloutsV1alpha1Client) Rollouts(namespace string) RolloutInterface { return newRollouts(c, namespace) } +func (c *RolloutsV1alpha1Client) RolloutHistories(namespace string) RolloutHistoryInterface { + return newRolloutHistories(c, namespace) +} + func (c *RolloutsV1alpha1Client) TrafficRoutings(namespace string) TrafficRoutingInterface { return newTrafficRoutings(c, namespace) } diff --git a/client/informers/externalversions/factory.go b/client/informers/externalversions/factory.go index ec1da01..66ec43a 100644 --- a/client/informers/externalversions/factory.go +++ b/client/informers/externalversions/factory.go @@ -47,6 +47,11 @@ type sharedInformerFactory struct { // startedInformers is used for tracking which informers have been started. // This allows Start() to be called multiple times safely. startedInformers map[reflect.Type]bool + // wg tracks how many goroutines were started. + wg sync.WaitGroup + // shuttingDown is true when Shutdown has been called. It may still be running + // because it needs to wait for goroutines. + shuttingDown bool } // WithCustomResyncConfig sets a custom resync period for the specified informer types. @@ -107,20 +112,39 @@ func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResy return factory } -// Start initializes all requested informers. func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) { f.lock.Lock() defer f.lock.Unlock() + if f.shuttingDown { + return + } + for informerType, informer := range f.informers { if !f.startedInformers[informerType] { - go informer.Run(stopCh) + f.wg.Add(1) + // We need a new variable in each loop iteration, + // otherwise the goroutine would use the loop variable + // and that keeps changing. + informer := informer + go func() { + defer f.wg.Done() + informer.Run(stopCh) + }() f.startedInformers[informerType] = true } } } -// WaitForCacheSync waits for all started informers' cache were synced. +func (f *sharedInformerFactory) Shutdown() { + f.lock.Lock() + f.shuttingDown = true + f.lock.Unlock() + + // Will return immediately if there is nothing to wait for. + f.wg.Wait() +} + func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool { informers := func() map[reflect.Type]cache.SharedIndexInformer { f.lock.Lock() @@ -167,11 +191,58 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal // SharedInformerFactory provides shared informers for resources in all known // API group versions. +// +// It is typically used like this: +// +// ctx, cancel := context.Background() +// defer cancel() +// factory := NewSharedInformerFactory(client, resyncPeriod) +// defer factory.WaitForStop() // Returns immediately if nothing was started. +// genericInformer := factory.ForResource(resource) +// typedInformer := factory.SomeAPIGroup().V1().SomeType() +// factory.Start(ctx.Done()) // Start processing these informers. +// synced := factory.WaitForCacheSync(ctx.Done()) +// for v, ok := range synced { +// if !ok { +// fmt.Fprintf(os.Stderr, "caches failed to sync: %v", v) +// return +// } +// } +// +// // Creating informers can also be created after Start, but then +// // Start must be called again: +// anotherGenericInformer := factory.ForResource(resource) +// factory.Start(ctx.Done()) type SharedInformerFactory interface { internalinterfaces.SharedInformerFactory - ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + + // Start initializes all requested informers. They are handled in goroutines + // which run until the stop channel gets closed. + Start(stopCh <-chan struct{}) + + // Shutdown marks a factory as shutting down. At that point no new + // informers can be started anymore and Start will return without + // doing anything. + // + // In addition, Shutdown blocks until all goroutines have terminated. For that + // to happen, the close channel(s) that they were started with must be closed, + // either before Shutdown gets called or while it is waiting. + // + // Shutdown may be called multiple times, even concurrently. All such calls will + // block until all goroutines have terminated. + Shutdown() + + // WaitForCacheSync blocks until all started informers' caches were synced + // or the stop channel gets closed. WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool + // ForResource gives generic access to a shared informer of the matching type. + ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + + // InternalInformerFor returns the SharedIndexInformer for obj using an internal + // client. + InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer + Rollouts() rollouts.Interface } diff --git a/client/informers/externalversions/generic.go b/client/informers/externalversions/generic.go index d00d150..8420d41 100644 --- a/client/informers/externalversions/generic.go +++ b/client/informers/externalversions/generic.go @@ -54,8 +54,12 @@ func (f *genericInformer) Lister() cache.GenericLister { func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { // Group=rollouts.kruise.io, Version=v1alpha1 + case v1alpha1.SchemeGroupVersion.WithResource("batchreleases"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Rollouts().V1alpha1().BatchReleases().Informer()}, nil case v1alpha1.SchemeGroupVersion.WithResource("rollouts"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rollouts().V1alpha1().Rollouts().Informer()}, nil + case v1alpha1.SchemeGroupVersion.WithResource("rollouthistories"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Rollouts().V1alpha1().RolloutHistories().Informer()}, nil case v1alpha1.SchemeGroupVersion.WithResource("trafficroutings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rollouts().V1alpha1().TrafficRoutings().Informer()}, nil diff --git a/client/informers/externalversions/rollouts/v1alpha1/batchrelease.go b/client/informers/externalversions/rollouts/v1alpha1/batchrelease.go new file mode 100644 index 0000000..a7436d7 --- /dev/null +++ b/client/informers/externalversions/rollouts/v1alpha1/batchrelease.go @@ -0,0 +1,90 @@ +/* +Copyright 2024 The Kruise 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 v1alpha1 + +import ( + "context" + time "time" + + versioned "github.com/openkruise/kruise-rollout-api/client/clientset/versioned" + internalinterfaces "github.com/openkruise/kruise-rollout-api/client/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/openkruise/kruise-rollout-api/client/listers/rollouts/v1alpha1" + rolloutsv1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + v1 "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" +) + +// BatchReleaseInformer provides access to a shared informer and lister for +// BatchReleases. +type BatchReleaseInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.BatchReleaseLister +} + +type batchReleaseInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewBatchReleaseInformer constructs a new informer for BatchRelease 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 NewBatchReleaseInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredBatchReleaseInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredBatchReleaseInformer constructs a new informer for BatchRelease 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 NewFilteredBatchReleaseInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.RolloutsV1alpha1().BatchReleases(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.RolloutsV1alpha1().BatchReleases(namespace).Watch(context.TODO(), options) + }, + }, + &rolloutsv1alpha1.BatchRelease{}, + resyncPeriod, + indexers, + ) +} + +func (f *batchReleaseInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredBatchReleaseInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *batchReleaseInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&rolloutsv1alpha1.BatchRelease{}, f.defaultInformer) +} + +func (f *batchReleaseInformer) Lister() v1alpha1.BatchReleaseLister { + return v1alpha1.NewBatchReleaseLister(f.Informer().GetIndexer()) +} diff --git a/client/informers/externalversions/rollouts/v1alpha1/interface.go b/client/informers/externalversions/rollouts/v1alpha1/interface.go index 86f1f83..f8af5e2 100644 --- a/client/informers/externalversions/rollouts/v1alpha1/interface.go +++ b/client/informers/externalversions/rollouts/v1alpha1/interface.go @@ -24,8 +24,12 @@ import ( // Interface provides access to all the informers in this group version. type Interface interface { + // BatchReleases returns a BatchReleaseInformer. + BatchReleases() BatchReleaseInformer // Rollouts returns a RolloutInformer. Rollouts() RolloutInformer + // RolloutHistories returns a RolloutHistoryInformer. + RolloutHistories() RolloutHistoryInformer // TrafficRoutings returns a TrafficRoutingInformer. TrafficRoutings() TrafficRoutingInformer } @@ -41,11 +45,21 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } +// BatchReleases returns a BatchReleaseInformer. +func (v *version) BatchReleases() BatchReleaseInformer { + return &batchReleaseInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} + // Rollouts returns a RolloutInformer. func (v *version) Rollouts() RolloutInformer { return &rolloutInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } +// RolloutHistories returns a RolloutHistoryInformer. +func (v *version) RolloutHistories() RolloutHistoryInformer { + return &rolloutHistoryInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} + // TrafficRoutings returns a TrafficRoutingInformer. func (v *version) TrafficRoutings() TrafficRoutingInformer { return &trafficRoutingInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} diff --git a/client/informers/externalversions/rollouts/v1alpha1/rollouthistory.go b/client/informers/externalversions/rollouts/v1alpha1/rollouthistory.go new file mode 100644 index 0000000..fc1e585 --- /dev/null +++ b/client/informers/externalversions/rollouts/v1alpha1/rollouthistory.go @@ -0,0 +1,90 @@ +/* +Copyright 2024 The Kruise 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 v1alpha1 + +import ( + "context" + time "time" + + versioned "github.com/openkruise/kruise-rollout-api/client/clientset/versioned" + internalinterfaces "github.com/openkruise/kruise-rollout-api/client/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/openkruise/kruise-rollout-api/client/listers/rollouts/v1alpha1" + rolloutsv1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + v1 "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" +) + +// RolloutHistoryInformer provides access to a shared informer and lister for +// RolloutHistories. +type RolloutHistoryInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.RolloutHistoryLister +} + +type rolloutHistoryInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewRolloutHistoryInformer constructs a new informer for RolloutHistory 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 NewRolloutHistoryInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredRolloutHistoryInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredRolloutHistoryInformer constructs a new informer for RolloutHistory 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 NewFilteredRolloutHistoryInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.RolloutsV1alpha1().RolloutHistories(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.RolloutsV1alpha1().RolloutHistories(namespace).Watch(context.TODO(), options) + }, + }, + &rolloutsv1alpha1.RolloutHistory{}, + resyncPeriod, + indexers, + ) +} + +func (f *rolloutHistoryInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredRolloutHistoryInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *rolloutHistoryInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&rolloutsv1alpha1.RolloutHistory{}, f.defaultInformer) +} + +func (f *rolloutHistoryInformer) Lister() v1alpha1.RolloutHistoryLister { + return v1alpha1.NewRolloutHistoryLister(f.Informer().GetIndexer()) +} diff --git a/client/listers/rollouts/v1alpha1/batchrelease.go b/client/listers/rollouts/v1alpha1/batchrelease.go new file mode 100644 index 0000000..18a9ab5 --- /dev/null +++ b/client/listers/rollouts/v1alpha1/batchrelease.go @@ -0,0 +1,99 @@ +/* +Copyright 2024 The Kruise 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 v1alpha1 + +import ( + v1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// BatchReleaseLister helps list BatchReleases. +// All objects returned here must be treated as read-only. +type BatchReleaseLister interface { + // List lists all BatchReleases in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.BatchRelease, err error) + // BatchReleases returns an object that can list and get BatchReleases. + BatchReleases(namespace string) BatchReleaseNamespaceLister + BatchReleaseListerExpansion +} + +// batchReleaseLister implements the BatchReleaseLister interface. +type batchReleaseLister struct { + indexer cache.Indexer +} + +// NewBatchReleaseLister returns a new BatchReleaseLister. +func NewBatchReleaseLister(indexer cache.Indexer) BatchReleaseLister { + return &batchReleaseLister{indexer: indexer} +} + +// List lists all BatchReleases in the indexer. +func (s *batchReleaseLister) List(selector labels.Selector) (ret []*v1alpha1.BatchRelease, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.BatchRelease)) + }) + return ret, err +} + +// BatchReleases returns an object that can list and get BatchReleases. +func (s *batchReleaseLister) BatchReleases(namespace string) BatchReleaseNamespaceLister { + return batchReleaseNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// BatchReleaseNamespaceLister helps list and get BatchReleases. +// All objects returned here must be treated as read-only. +type BatchReleaseNamespaceLister interface { + // List lists all BatchReleases in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.BatchRelease, err error) + // Get retrieves the BatchRelease from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1alpha1.BatchRelease, error) + BatchReleaseNamespaceListerExpansion +} + +// batchReleaseNamespaceLister implements the BatchReleaseNamespaceLister +// interface. +type batchReleaseNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all BatchReleases in the indexer for a given namespace. +func (s batchReleaseNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.BatchRelease, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.BatchRelease)) + }) + return ret, err +} + +// Get retrieves the BatchRelease from the indexer for a given namespace and name. +func (s batchReleaseNamespaceLister) Get(name string) (*v1alpha1.BatchRelease, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("batchrelease"), name) + } + return obj.(*v1alpha1.BatchRelease), nil +} diff --git a/client/listers/rollouts/v1alpha1/expansion_generated.go b/client/listers/rollouts/v1alpha1/expansion_generated.go index a612cc4..a2c1c4a 100644 --- a/client/listers/rollouts/v1alpha1/expansion_generated.go +++ b/client/listers/rollouts/v1alpha1/expansion_generated.go @@ -18,6 +18,14 @@ limitations under the License. package v1alpha1 +// BatchReleaseListerExpansion allows custom methods to be added to +// BatchReleaseLister. +type BatchReleaseListerExpansion interface{} + +// BatchReleaseNamespaceListerExpansion allows custom methods to be added to +// BatchReleaseNamespaceLister. +type BatchReleaseNamespaceListerExpansion interface{} + // RolloutListerExpansion allows custom methods to be added to // RolloutLister. type RolloutListerExpansion interface{} @@ -26,6 +34,14 @@ type RolloutListerExpansion interface{} // RolloutNamespaceLister. type RolloutNamespaceListerExpansion interface{} +// RolloutHistoryListerExpansion allows custom methods to be added to +// RolloutHistoryLister. +type RolloutHistoryListerExpansion interface{} + +// RolloutHistoryNamespaceListerExpansion allows custom methods to be added to +// RolloutHistoryNamespaceLister. +type RolloutHistoryNamespaceListerExpansion interface{} + // TrafficRoutingListerExpansion allows custom methods to be added to // TrafficRoutingLister. type TrafficRoutingListerExpansion interface{} diff --git a/client/listers/rollouts/v1alpha1/rollouthistory.go b/client/listers/rollouts/v1alpha1/rollouthistory.go new file mode 100644 index 0000000..d3b8ed3 --- /dev/null +++ b/client/listers/rollouts/v1alpha1/rollouthistory.go @@ -0,0 +1,99 @@ +/* +Copyright 2024 The Kruise 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 v1alpha1 + +import ( + v1alpha1 "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// RolloutHistoryLister helps list RolloutHistories. +// All objects returned here must be treated as read-only. +type RolloutHistoryLister interface { + // List lists all RolloutHistories in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.RolloutHistory, err error) + // RolloutHistories returns an object that can list and get RolloutHistories. + RolloutHistories(namespace string) RolloutHistoryNamespaceLister + RolloutHistoryListerExpansion +} + +// rolloutHistoryLister implements the RolloutHistoryLister interface. +type rolloutHistoryLister struct { + indexer cache.Indexer +} + +// NewRolloutHistoryLister returns a new RolloutHistoryLister. +func NewRolloutHistoryLister(indexer cache.Indexer) RolloutHistoryLister { + return &rolloutHistoryLister{indexer: indexer} +} + +// List lists all RolloutHistories in the indexer. +func (s *rolloutHistoryLister) List(selector labels.Selector) (ret []*v1alpha1.RolloutHistory, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.RolloutHistory)) + }) + return ret, err +} + +// RolloutHistories returns an object that can list and get RolloutHistories. +func (s *rolloutHistoryLister) RolloutHistories(namespace string) RolloutHistoryNamespaceLister { + return rolloutHistoryNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// RolloutHistoryNamespaceLister helps list and get RolloutHistories. +// All objects returned here must be treated as read-only. +type RolloutHistoryNamespaceLister interface { + // List lists all RolloutHistories in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.RolloutHistory, err error) + // Get retrieves the RolloutHistory from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1alpha1.RolloutHistory, error) + RolloutHistoryNamespaceListerExpansion +} + +// rolloutHistoryNamespaceLister implements the RolloutHistoryNamespaceLister +// interface. +type rolloutHistoryNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all RolloutHistories in the indexer for a given namespace. +func (s rolloutHistoryNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.RolloutHistory, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.RolloutHistory)) + }) + return ret, err +} + +// Get retrieves the RolloutHistory from the indexer for a given namespace and name. +func (s rolloutHistoryNamespaceLister) Get(name string) (*v1alpha1.RolloutHistory, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("rollouthistory"), name) + } + return obj.(*v1alpha1.RolloutHistory), nil +} diff --git a/go.mod b/go.mod index a397115..95a01ec 100644 --- a/go.mod +++ b/go.mod @@ -5,17 +5,19 @@ go 1.19 require ( github.com/blang/semver/v4 v4.0.0 github.com/go-bindata/go-bindata v3.1.2+incompatible - k8s.io/api v0.24.1 - k8s.io/apimachinery v0.24.1 - k8s.io/client-go v0.24.1 - k8s.io/code-generator v0.24.1 - k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 - sigs.k8s.io/gateway-api v0.5.1 + k8s.io/api v0.26.3 + k8s.io/apimachinery v0.26.3 + k8s.io/client-go v0.26.3 + k8s.io/code-generator v0.26.3 + k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 + k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 + sigs.k8s.io/controller-runtime v0.14.6 + sigs.k8s.io/gateway-api v0.7.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful v2.9.5+incompatible // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect @@ -35,23 +37,22 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/mod v0.6.0 // indirect - golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10 // indirect + golang.org/x/mod v0.7.0 // indirect + golang.org/x/net v0.7.0 // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/term v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect - golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect - golang.org/x/tools v0.2.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect - k8s.io/klog/v2 v2.80.1 // indirect - k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index a9e6ece..13ab499 100644 --- a/go.sum +++ b/go.sum @@ -13,11 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -36,20 +31,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -58,38 +41,24 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-bindata/go-bindata v3.1.2+incompatible h1:5vjJMVhowQdPzjE1LdxyFF7YFTXg5IgGVW4gBr5IbvE= github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= @@ -97,8 +66,6 @@ github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -110,7 +77,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -118,7 +84,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -132,14 +97,11 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -149,9 +111,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -160,7 +119,6 @@ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -168,29 +126,17 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -207,39 +153,23 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/onsi/ginkgo/v2 v2.6.0 h1:9t9b9vRUbFq3C4qKFCGkVuq/fIHji802N1nrtkh1mNc= +github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -248,29 +178,21 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -293,7 +215,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -302,15 +223,10 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -321,7 +237,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -332,36 +247,19 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10 h1:Frnccbp+ok2GkUS2tC84yAq/U9Vg+0sIO7aRL3T4Xnc= -golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -373,10 +271,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -385,10 +280,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -402,48 +294,29 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -486,21 +359,12 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.4.0 h1:7mTAgkunk3fr4GAloyyCasadO6h9zSsQZbwvcaIciV4= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -518,11 +382,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -560,17 +419,7 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -583,12 +432,6 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -601,7 +444,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -610,21 +452,15 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -634,38 +470,32 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.1 h1:BjCMRDcyEYz03joa3K1+rbshwh1Ay6oB53+iUx2H8UY= -k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ= -k8s.io/apimachinery v0.24.1 h1:ShD4aDxTQKN5zNf8K1RQ2u98ELLdIW7jEnlO9uAMX/I= -k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/client-go v0.24.1 h1:w1hNdI9PFrzu3OlovVeTnf4oHDt+FJLd9Ndluvnb42E= -k8s.io/client-go v0.24.1/go.mod h1:f1kIDqcEYmwXS/vTbbhopMUbhKp2JhOeVTfxgaCIlF8= -k8s.io/code-generator v0.24.1 h1:zS+dvmUNaOcvsQ4faV9hXNjsKG9/pQaLnts1Wma4RM8= -k8s.io/code-generator v0.24.1/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= +k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= +k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= +k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= +k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= +k8s.io/code-generator v0.26.3 h1:DNYPsWoeFwmg4qFg97Z1cHSSv7KSG10mAEIFoZGTQM8= +k8s.io/code-generator v0.26.3/go.mod h1:ryaiIKwfxEJEaywEzx3dhWOydpVctKYbqLajJf0O8dI= k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20221107191617-1a15be271d1d h1:0Smp/HP1OH4Rvhe+4B8nWGERtlqAGSftbSbbmm45oFs= -k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y= +k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/gateway-api v0.5.1 h1:EqzgOKhChzyve9rmeXXbceBYB6xiM50vDfq0kK5qpdw= -sigs.k8s.io/gateway-api v0.5.1/go.mod h1:x0AP6gugkFV8fC/oTlnOMU0pnmuzIR8LfIPRVUjxSqA= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= +sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= +sigs.k8s.io/gateway-api v0.7.1 h1:Tts2jeepVkPA5rVG/iO+S43s9n7Vp7jCDhZDQYtPigQ= +sigs.k8s.io/gateway-api v0.7.1/go.mod h1:Xv0+ZMxX0lu1nSSDIIPEfbVztgNZ+3cfiYrJsa2Ooso= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/pkg/rollouts/openapi_generated.go b/pkg/rollouts/openapi_generated.go index 7d0cf46..1889cc2 100644 --- a/pkg/rollouts/openapi_generated.go +++ b/pkg/rollouts/openapi_generated.go @@ -30,37 +30,62 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchRelease": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchRelease(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseCanaryStatus": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseCanaryStatus(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseList": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseList(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseSpec": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseSpec(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseStatus": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.CanaryStatus": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.CanaryStep": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStep(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.CanaryStepInfo": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStepInfo(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.CanaryStrategy": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStrategy(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.CustomNetworkRef": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CustomNetworkRef(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.DeploymentExtraStatus": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_DeploymentExtraStatus(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.DeploymentStrategy": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_DeploymentStrategy(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.GatewayTrafficRouting": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_GatewayTrafficRouting(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HTTPRouteInfo": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_HTTPRouteInfo(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HttpRouteMatch": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_HttpRouteMatch(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.IngressInfo": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_IngressInfo(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.IngressTrafficRouting": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_IngressTrafficRouting(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.NameAndSpecData": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_NameAndSpecData(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ObjectRef": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ObjectRef(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.PatchPodTemplateMetadata": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_PatchPodTemplateMetadata(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.Pod": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_Pod(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ReleaseBatch": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ReleaseBatch(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ReleasePlan": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ReleasePlan(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.Rollout": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_Rollout(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutCondition": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutCondition(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistory": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistory(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistoryList": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistoryList(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistorySpec": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistorySpec(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistoryStatus": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistoryStatus(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutInfo": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutInfo(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutList": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutList(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutPause": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutPause(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutSpec": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutSpec(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutStatus": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutStrategy": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutStrategy(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ServiceInfo": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ServiceInfo(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRouting": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRouting(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingInfo": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingInfo(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingList": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingList(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingRef": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingRef(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingSpec": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingSpec(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingStatus": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingStrategy": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingStrategy(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.WorkloadInfo": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_WorkloadInfo(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.WorkloadRef": schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_WorkloadRef(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BatchRelease": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BatchRelease(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BatchReleaseCanaryStatus": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BatchReleaseCanaryStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BatchReleaseList": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BatchReleaseList(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BatchReleaseSpec": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BatchReleaseSpec(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BatchReleaseStatus": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BatchReleaseStatus(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BlueGreenStatus": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BlueGreenStatus(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BlueGreenStrategy": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BlueGreenStrategy(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStatus": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStep": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStep(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStrategy": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStrategy(ref), + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CommonStatus": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CommonStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.DeploymentExtraStatus": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_DeploymentExtraStatus(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.DeploymentStrategy": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_DeploymentStrategy(ref), "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.GatewayTrafficRouting": schema_openkruise_kruise_rollout_api_rollouts_v1beta1_GatewayTrafficRouting(ref), @@ -82,6 +107,280 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchRelease(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseSpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseSpec", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseCanaryStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "batchState": { + SchemaProps: spec.SchemaProps{ + Description: "CurrentBatchState indicates the release state of the current batch.", + Type: []string{"string"}, + Format: "", + }, + }, + "currentBatch": { + SchemaProps: spec.SchemaProps{ + Description: "The current batch the rollout is working on/blocked, it starts from 0", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "batchReadyTime": { + SchemaProps: spec.SchemaProps{ + Description: "BatchReadyTime is the ready timestamp of the current batch or the last batch. This field is updated once a batch ready, and the batches[x].pausedSeconds relies on this field to calculate the real-time duration.", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "updatedReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "UpdatedReplicas is the number of upgraded Pods.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "updatedReadyReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "UpdatedReadyReplicas is the number upgraded Pods that have a Ready Condition.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "noNeedUpdateReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "the number of pods that no need to rollback in rollback scene.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + Required: []string{"currentBatch"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BatchReleaseList contains a list of BatchRelease", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchRelease"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchRelease", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BatchReleaseSpec defines how to describe an update between different compRevision", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "targetReference": { + SchemaProps: spec.SchemaProps{ + Description: "TargetRef contains the GVK and name of the workload that we need to upgrade to.", + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ObjectRef"), + }, + }, + "releasePlan": { + SchemaProps: spec.SchemaProps{ + Description: "ReleasePlan is the details on how to rollout the resources", + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ReleasePlan"), + }, + }, + }, + Required: []string{"targetReference", "releasePlan"}, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ObjectRef", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ReleasePlan"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_BatchReleaseStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BatchReleaseStatus defines the observed state of a release plan", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "conditions": { + SchemaProps: spec.SchemaProps{ + Description: "Conditions represents the observed process state of each phase during executing the release plan.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutCondition"), + }, + }, + }, + }, + }, + "canaryStatus": { + SchemaProps: spec.SchemaProps{ + Description: "CanaryStatus describes the state of the canary rollout.", + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseCanaryStatus"), + }, + }, + "stableRevision": { + SchemaProps: spec.SchemaProps{ + Description: "StableRevision is the pod-template-hash of stable revision pod template.", + Type: []string{"string"}, + Format: "", + }, + }, + "updateRevision": { + SchemaProps: spec.SchemaProps{ + Description: "UpdateRevision is the pod-template-hash of update revision pod template.", + Type: []string{"string"}, + Format: "", + }, + }, + "observedGeneration": { + SchemaProps: spec.SchemaProps{ + Description: "ObservedGeneration is the most recent generation observed for this BatchRelease. It corresponds to this BatchRelease's generation, which is updated on mutation by the API Server, and only if BatchRelease Spec was changed, its generation will increase 1.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "observedRolloutID": { + SchemaProps: spec.SchemaProps{ + Description: "ObservedRolloutID is the most recent rollout-id observed for this BatchRelease. If RolloutID was changed, we will restart to roll out from batch 0, to ensure the batch-id and rollout-id labels of Pods are correct.", + Type: []string{"string"}, + Format: "", + }, + }, + "observedWorkloadReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "ObservedWorkloadReplicas is observed replicas of target referenced workload. This field is designed to deal with scaling event during rollout, if this field changed, it means that the workload is scaling during rollout.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "collisionCount": { + SchemaProps: spec.SchemaProps{ + Description: "Count of hash collisions for creating canary Deployment. The controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest canary Deployment.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "observedReleasePlanHash": { + SchemaProps: spec.SchemaProps{ + Description: "ObservedReleasePlanHash is a hash code of observed itself spec.releasePlan.", + Type: []string{"string"}, + Format: "", + }, + }, + "phase": { + SchemaProps: spec.SchemaProps{ + Description: "Phase is the release plan phase, which indicates the current state of release plan state machine in BatchRelease controller.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.BatchReleaseCanaryStatus", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutCondition"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -215,7 +514,7 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStep(ref commo "requestHeaderModifier": { SchemaProps: spec.SchemaProps{ Description: "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"), + Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"), }, }, "matches": { @@ -249,7 +548,43 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStep(ref commo }, }, Dependencies: []string{ - "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HttpRouteMatch", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutPause", "k8s.io/apimachinery/pkg/util/intstr.IntOrString", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"}, + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HttpRouteMatch", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutPause", "k8s.io/apimachinery/pkg/util/intstr.IntOrString", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CanaryStepInfo(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "CanaryStepInfo indicates the pods for a revision", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "canaryStepIndex": { + SchemaProps: spec.SchemaProps{ + Description: "CanaryStepIndex indicates step this revision", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "pods": { + SchemaProps: spec.SchemaProps{ + Description: "Pods indicates the pods information", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.Pod"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.Pod"}, } } @@ -349,6 +684,75 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_CustomNetworkRef(ref } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_DeploymentExtraStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeploymentExtraStatus is extra status field for Advanced Deployment", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "updatedReadyReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "UpdatedReadyReplicas the number of pods that has been updated and ready.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "expectedUpdatedReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "ExpectedUpdatedReplicas is an absolute number calculated based on Partition and Deployment.Spec.Replicas, means how many pods are expected be updated under current strategy. This field is designed to avoid users to fall into the details of algorithm for Partition calculation.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_DeploymentStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "DeploymentStrategy is strategy field for Advanced Deployment", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "rollingStyle": { + SchemaProps: spec.SchemaProps{ + Description: "RollingStyle define the behavior of rolling for deployment.", + Type: []string{"string"}, + Format: "", + }, + }, + "rollingUpdate": { + SchemaProps: spec.SchemaProps{ + Description: "original deployment strategy rolling update fields", + Ref: ref("k8s.io/api/apps/v1.RollingUpdateDeployment"), + }, + }, + "paused": { + SchemaProps: spec.SchemaProps{ + Description: "Paused = true will block the upgrade of Pods", + Type: []string{"boolean"}, + Format: "", + }, + }, + "partition": { + SchemaProps: spec.SchemaProps{ + Description: "Partition describe how many Pods should be updated during rollout. We use this field to implement partition-style rolling update.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/apps/v1.RollingUpdateDeployment", "k8s.io/apimachinery/pkg/util/intstr.IntOrString"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_GatewayTrafficRouting(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -369,6 +773,37 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_GatewayTrafficRoutin } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_HTTPRouteInfo(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "HTTPRouteInfo indicates information of gateway API", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data indecates the spec of object ref", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + }, + Required: []string{"name"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_HttpRouteMatch(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -397,6 +832,37 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_HttpRouteMatch(ref c } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_IngressInfo(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "IngressInfo indicates information of the ingress related", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data indecates the spec of object ref", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + }, + Required: []string{"name"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_IngressTrafficRouting(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -426,6 +892,36 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_IngressTrafficRoutin } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_NameAndSpecData(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data indecates the spec of object ref", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + }, + Required: []string{"name"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ObjectRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -490,6 +986,141 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_PatchPodTemplateMeta } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_Pod(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Pod indicates the information of a pod, including name, ip, node_name.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name indicates the node name", + Type: []string{"string"}, + Format: "", + }, + }, + "ip": { + SchemaProps: spec.SchemaProps{ + Description: "IP indicates the pod ip", + Type: []string{"string"}, + Format: "", + }, + }, + "nodeName": { + SchemaProps: spec.SchemaProps{ + Description: "NodeName indicates the node which pod is located at", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ReleaseBatch(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ReleaseBatch is used to describe how each batch release should be", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "canaryReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "CanaryReplicas is the number of upgraded pods that should have in this batch. it can be an absolute number (ex: 5) or a percentage of workload replicas. batches[i].canaryReplicas should less than or equal to batches[j].canaryReplicas if i < j.", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + }, + Required: []string{"canaryReplicas"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/util/intstr.IntOrString"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ReleasePlan(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ReleasePlan fines the details of the release plan", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "batches": { + SchemaProps: spec.SchemaProps{ + Description: "Batches is the details on each batch of the ReleasePlan. Users can specify their batch plan in this field, such as: batches: - canaryReplicas: 1 # batches 0 - canaryReplicas: 2 # batches 1 - canaryReplicas: 5 # batches 2 Not that these canaryReplicas should be a non-decreasing sequence.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ReleaseBatch"), + }, + }, + }, + }, + }, + "batchPartition": { + SchemaProps: spec.SchemaProps{ + Description: "All pods in the batches up to the batchPartition (included) will have the target resource specification while the rest still is the stable revision. This is designed for the operators to manually rollout. Default is nil, which means no partition and will release all batches. BatchPartition start from 0.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "rolloutID": { + SchemaProps: spec.SchemaProps{ + Description: "RolloutID indicates an id for each rollout progress", + Type: []string{"string"}, + Format: "", + }, + }, + "failureThreshold": { + SchemaProps: spec.SchemaProps{ + Description: "FailureThreshold indicates how many failed pods can be tolerated in all upgraded pods. Only when FailureThreshold are satisfied, Rollout can enter ready state. If FailureThreshold is nil, Rollout will use the MaxUnavailable of workload as its FailureThreshold. Defaults to nil.", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + "finalizingPolicy": { + SchemaProps: spec.SchemaProps{ + Description: "FinalizingPolicy define the behavior of controller when phase enter Finalizing Defaults to \"Immediate\"", + Type: []string{"string"}, + Format: "", + }, + }, + "patchPodTemplateMetadata": { + SchemaProps: spec.SchemaProps{ + Description: "PatchPodTemplateMetadata indicates patch configuration(e.g. labels, annotations) to the canary deployment podTemplateSpec.metadata only support for canary deployment", + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.PatchPodTemplateMetadata"), + }, + }, + "rollingStyle": { + SchemaProps: spec.SchemaProps{ + Description: "RollingStyle can be \"Canary\", \"Partiton\" or \"BlueGreen\"", + Type: []string{"string"}, + Format: "", + }, + }, + "enableExtraWorkloadForCanary": { + SchemaProps: spec.SchemaProps{ + Description: "EnableExtraWorkloadForCanary indicates whether to create extra workload for canary True corresponds to RollingStyle \"Canary\". False corresponds to RollingStyle \"Partiton\". Ignored in BlueGreen-style. This field is about to deprecate, use RollingStyle instead. If both of them are set, controller will only consider this filed when RollingStyle is empty", + Default: false, + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + Required: []string{"enableExtraWorkloadForCanary"}, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.PatchPodTemplateMetadata", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ReleaseBatch", "k8s.io/apimachinery/pkg/util/intstr.IntOrString"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_Rollout(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -599,6 +1230,220 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutCondition(ref } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistory(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RolloutHistory is the Schema for the rollouthistories API", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "spec": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistorySpec"), + }, + }, + "status": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistoryStatus"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistorySpec", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistoryStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistoryList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RolloutHistoryList contains a list of RolloutHistory", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistory"), + }, + }, + }, + }, + }, + }, + Required: []string{"items"}, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutHistory", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistorySpec(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RolloutHistorySpec defines the desired state of RolloutHistory", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "rollout": { + SchemaProps: spec.SchemaProps{ + Description: "Rollout indicates information of the rollout related with rollouthistory", + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutInfo"), + }, + }, + "workload": { + SchemaProps: spec.SchemaProps{ + Description: "Workload indicates information of the workload, such as cloneset, deployment, advanced statefulset", + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.WorkloadInfo"), + }, + }, + "service": { + SchemaProps: spec.SchemaProps{ + Description: "Service indicates information of the service related with workload", + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ServiceInfo"), + }, + }, + "trafficRouting": { + SchemaProps: spec.SchemaProps{ + Description: "TrafficRouting indicates information of traffic route related with workload", + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingInfo"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.RolloutInfo", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.ServiceInfo", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.TrafficRoutingInfo", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.WorkloadInfo"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutHistoryStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RolloutHistoryStatus defines the observed state of RolloutHistory", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "phase": { + SchemaProps: spec.SchemaProps{ + Description: "Phase indicates phase of RolloutHistory, just \"\" or \"completed\"", + Type: []string{"string"}, + Format: "", + }, + }, + "canarySteps": { + SchemaProps: spec.SchemaProps{ + Description: "CanarySteps indicates the pods released each step", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.CanaryStepInfo"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.CanaryStepInfo"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutInfo(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RolloutInfo indicates information of the rollout related", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "rolloutID": { + SchemaProps: spec.SchemaProps{ + Description: "RolloutID indicates the new rollout if there is no new RolloutID this time, ignore it and not execute RolloutHistory", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data indecates the spec of object ref", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + }, + Required: []string{"rolloutID", "name"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -796,6 +1641,37 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_RolloutStrategy(ref } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_ServiceInfo(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ServiceInfo indicates information of the service related", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data indecates the spec of object ref", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + }, + Required: []string{"name"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/runtime.RawExtension"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRouting(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -843,6 +1719,33 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRouting(ref c } } +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingInfo(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "TrafficRoutingInfo indicates information of Gateway API or Ingress", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "ingress": { + SchemaProps: spec.SchemaProps{ + Description: "IngressRef indicates information of ingress", + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.IngressInfo"), + }, + }, + "httpRoute": { + SchemaProps: spec.SchemaProps{ + Description: "HTTPRouteRef indacates information of Gateway API", + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HTTPRouteInfo"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HTTPRouteInfo", "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.IngressInfo"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingList(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1034,7 +1937,7 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingStrate "requestHeaderModifier": { SchemaProps: spec.SchemaProps{ Description: "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"), + Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"), }, }, "matches": { @@ -1055,7 +1958,52 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_TrafficRoutingStrate }, }, Dependencies: []string{ - "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HttpRouteMatch", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"}, + "github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1.HttpRouteMatch", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1alpha1_WorkloadInfo(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "WorkloadInfo indicates information of the workload, such as cloneset, deployment, advanced statefulset", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "data": { + SchemaProps: spec.SchemaProps{ + Description: "Data indecates the spec of object ref", + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/runtime.RawExtension"), + }, + }, + }, + Required: []string{"name"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/runtime.RawExtension"}, } } @@ -1363,6 +2311,13 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BatchReleaseStatus(re Format: "", }, }, + "message": { + SchemaProps: spec.SchemaProps{ + Description: "Message provides details on why the rollout is in its current phase", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -1371,6 +2326,187 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BatchReleaseStatus(re } } +func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BlueGreenStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BlueGreenStatus status fields that only pertain to the blueGreen rollout", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "observedWorkloadGeneration": { + SchemaProps: spec.SchemaProps{ + Description: "observedWorkloadGeneration is the most recent generation observed for this Rollout ref workload generation.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "observedRolloutID": { + SchemaProps: spec.SchemaProps{ + Description: "ObservedRolloutID will record the newest spec.RolloutID if status.canaryRevision equals to workload.updateRevision", + Type: []string{"string"}, + Format: "", + }, + }, + "rolloutHash": { + SchemaProps: spec.SchemaProps{ + Description: "RolloutHash from rollout.spec object", + Type: []string{"string"}, + Format: "", + }, + }, + "stableRevision": { + SchemaProps: spec.SchemaProps{ + Description: "StableRevision indicates the revision of stable pods", + Type: []string{"string"}, + Format: "", + }, + }, + "podTemplateHash": { + SchemaProps: spec.SchemaProps{ + Description: "pod template hash is used as service selector label", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "currentStepIndex": { + SchemaProps: spec.SchemaProps{ + Description: "CurrentStepIndex defines the current step of the rollout is on.", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "nextStepIndex": { + SchemaProps: spec.SchemaProps{ + Description: "NextStepIndex defines the next step of the rollout is on. In normal case, NextStepIndex is equal to CurrentStepIndex + 1 If the current step is the last step, NextStepIndex is equal to -1 Before the release, NextStepIndex is also equal to -1 0 is not used and won't appear in any case It is allowed to patch NextStepIndex by design, e.g. if CurrentStepIndex is 2, user can patch NextStepIndex to 3 (if exists) to achieve batch jump, or patch NextStepIndex to 1 to implement a re-execution of step 1 Patching it with a non-positive value is useless and meaningless, which will be corrected in the next reconciliation", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "finalisingStep": { + SchemaProps: spec.SchemaProps{ + Description: "FinalisingStep the step of finalising", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "currentStepState": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "lastUpdateTime": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "updatedRevision": { + SchemaProps: spec.SchemaProps{ + Description: "UpdatedRevision is calculated by rollout based on podTemplateHash, and the internal logic flow uses It may be different from rs podTemplateHash in different k8s versions, so it cannot be used as service selector label", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "updatedReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "UpdatedReplicas the numbers of updated pods", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "updatedReadyReplicas": { + SchemaProps: spec.SchemaProps{ + Description: "UpdatedReadyReplicas the numbers of updated ready pods", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + Required: []string{"podTemplateHash", "nextStepIndex", "finalisingStep", "currentStepState", "updatedRevision", "updatedReplicas", "updatedReadyReplicas"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + } +} + +func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_BlueGreenStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "BlueGreenStrategy defines parameters for Blue Green Release", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "steps": { + SchemaProps: spec.SchemaProps{ + Description: "Steps define the order of phases to execute release in batches(20%, 40%, 60%, 80%, 100%)", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStep"), + }, + }, + }, + }, + }, + "trafficRoutings": { + SchemaProps: spec.SchemaProps{ + Description: "TrafficRoutings support ingress, gateway api and custom network resource(e.g. istio, apisix) to enable more fine-grained traffic routing and current only support one TrafficRouting", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.TrafficRoutingRef"), + }, + }, + }, + }, + }, + "failureThreshold": { + SchemaProps: spec.SchemaProps{ + Description: "FailureThreshold indicates how many failed pods can be tolerated in all upgraded pods. Only when FailureThreshold are satisfied, Rollout can enter ready state. If FailureThreshold is nil, Rollout will use the MaxUnavailable of workload as its FailureThreshold. Defaults to nil.", + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + }, + }, + "trafficRoutingRef": { + SchemaProps: spec.SchemaProps{ + Description: "TrafficRoutingRef is TrafficRouting's Name", + Type: []string{"string"}, + Format: "", + }, + }, + "disableGenerateCanaryService": { + SchemaProps: spec.SchemaProps{ + Description: "canary service will not be generated if DisableGenerateCanaryService is true", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStep", "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.TrafficRoutingRef", "k8s.io/apimachinery/pkg/util/intstr.IntOrString"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1406,17 +2542,59 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStatus(ref comm Format: "", }, }, - "canaryRevision": { + "podTemplateHash": { SchemaProps: spec.SchemaProps{ - Description: "CanaryRevision is calculated by rollout based on podTemplateHash, and the internal logic flow uses It may be different from rs podTemplateHash in different k8s versions, so it cannot be used as service selector label", + Description: "pod template hash is used as service selector label", Default: "", Type: []string{"string"}, Format: "", }, }, - "podTemplateHash": { + "currentStepIndex": { SchemaProps: spec.SchemaProps{ - Description: "pod template hash is used as service selector label", + Description: "CurrentStepIndex defines the current step of the rollout is on.", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "nextStepIndex": { + SchemaProps: spec.SchemaProps{ + Description: "NextStepIndex defines the next step of the rollout is on. In normal case, NextStepIndex is equal to CurrentStepIndex + 1 If the current step is the last step, NextStepIndex is equal to -1 Before the release, NextStepIndex is also equal to -1 0 is not used and won't appear in any case It is allowed to patch NextStepIndex by design, e.g. if CurrentStepIndex is 2, user can patch NextStepIndex to 3 (if exists) to achieve batch jump, or patch NextStepIndex to 1 to implement a re-execution of step 1 Patching it with a non-positive value is useless and meaningless, which will be corrected in the next reconciliation", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "finalisingStep": { + SchemaProps: spec.SchemaProps{ + Description: "FinalisingStep the step of finalising", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "currentStepState": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "lastUpdateTime": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "canaryRevision": { + SchemaProps: spec.SchemaProps{ + Description: "CanaryRevision is calculated by rollout based on podTemplateHash, and the internal logic flow uses It may be different from rs podTemplateHash in different k8s versions, so it cannot be used as service selector label", Default: "", Type: []string{"string"}, Format: "", @@ -1438,34 +2616,8 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStatus(ref comm Format: "int32", }, }, - "currentStepIndex": { - SchemaProps: spec.SchemaProps{ - Description: "CurrentStepIndex defines the current step of the rollout is on. If the current step index is null, the controller will execute the rollout.", - Default: 0, - Type: []string{"integer"}, - Format: "int32", - }, - }, - "currentStepState": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "message": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "lastUpdateTime": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), - }, - }, }, - Required: []string{"canaryRevision", "podTemplateHash", "canaryReplicas", "canaryReadyReplicas", "currentStepState"}, + Required: []string{"podTemplateHash", "nextStepIndex", "finalisingStep", "currentStepState", "canaryRevision", "canaryReplicas", "canaryReadyReplicas"}, }, }, Dependencies: []string{ @@ -1490,12 +2642,12 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStep(ref common "requestHeaderModifier": { SchemaProps: spec.SchemaProps{ Description: "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"), + Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"), }, }, "matches": { SchemaProps: spec.SchemaProps{ - Description: "Matches define conditions used for matching the incoming HTTP requests to canary service. Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. If Gateway API, current only support one match. And cannot support both weight and matches, if both are configured, then matches takes precedence.", + Description: "Matches define conditions used for matching incoming HTTP requests to the canary service. Each match is independent, i.e. this rule will be matched as long as **any** one of the matches is satisfied.\n\nIt cannot support Traffic (weight-based routing) and Matches simultaneously, if both are configured. In such cases, Matches takes precedence.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -1524,7 +2676,7 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStep(ref common }, }, Dependencies: []string{ - "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.HttpRouteMatch", "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.RolloutPause", "k8s.io/apimachinery/pkg/util/intstr.IntOrString", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"}, + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.HttpRouteMatch", "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.RolloutPause", "k8s.io/apimachinery/pkg/util/intstr.IntOrString", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"}, } } @@ -1589,6 +2741,13 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStrategy(ref co Format: "", }, }, + "disableGenerateCanaryService": { + SchemaProps: spec.SchemaProps{ + Description: "canary service will not be generated if DisableGenerateCanaryService is true", + Type: []string{"boolean"}, + Format: "", + }, + }, }, }, }, @@ -1597,6 +2756,100 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CanaryStrategy(ref co } } +func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_CommonStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "fields in CommonStatus are shared between canary status and bluegreen status if a field is accessed in strategy-agnostic way, e.g. accessed from rollout_progressing.go, or rollout_status.go then it can be put into CommonStatus if a field is only accessed in strategy-specific way, e.g. accessed from rollout_canary.go or rollout_bluegreen.go then it should stay behind with CanaryStatus or BlueGreenStatus", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "observedWorkloadGeneration": { + SchemaProps: spec.SchemaProps{ + Description: "observedWorkloadGeneration is the most recent generation observed for this Rollout ref workload generation.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "observedRolloutID": { + SchemaProps: spec.SchemaProps{ + Description: "ObservedRolloutID will record the newest spec.RolloutID if status.canaryRevision equals to workload.updateRevision", + Type: []string{"string"}, + Format: "", + }, + }, + "rolloutHash": { + SchemaProps: spec.SchemaProps{ + Description: "RolloutHash from rollout.spec object", + Type: []string{"string"}, + Format: "", + }, + }, + "stableRevision": { + SchemaProps: spec.SchemaProps{ + Description: "StableRevision indicates the revision of stable pods", + Type: []string{"string"}, + Format: "", + }, + }, + "podTemplateHash": { + SchemaProps: spec.SchemaProps{ + Description: "pod template hash is used as service selector label", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "currentStepIndex": { + SchemaProps: spec.SchemaProps{ + Description: "CurrentStepIndex defines the current step of the rollout is on.", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "nextStepIndex": { + SchemaProps: spec.SchemaProps{ + Description: "NextStepIndex defines the next step of the rollout is on. In normal case, NextStepIndex is equal to CurrentStepIndex + 1 If the current step is the last step, NextStepIndex is equal to -1 Before the release, NextStepIndex is also equal to -1 0 is not used and won't appear in any case It is allowed to patch NextStepIndex by design, e.g. if CurrentStepIndex is 2, user can patch NextStepIndex to 3 (if exists) to achieve batch jump, or patch NextStepIndex to 1 to implement a re-execution of step 1 Patching it with a non-positive value is useless and meaningless, which will be corrected in the next reconciliation", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "finalisingStep": { + SchemaProps: spec.SchemaProps{ + Description: "FinalisingStep the step of finalising", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "currentStepState": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "lastUpdateTime": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + }, + Required: []string{"podTemplateHash", "nextStepIndex", "finalisingStep", "currentStepState"}, + }, + }, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + } +} + func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_DeploymentExtraStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1692,7 +2945,21 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_HttpRouteMatch(ref co SchemaProps: spec.SchemaProps{ Type: []string{"object"}, Properties: map[string]spec.Schema{ + "path": { + SchemaProps: spec.SchemaProps{ + Description: "Path specifies a HTTP request path matcher. Supported list: - Istio: https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPMatchRequest - GatewayAPI: If path is defined, the whole HttpRouteMatch will be used as a standalone matcher", + Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPPathMatch"), + }, + }, "headers": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "name", + }, + "x-kubernetes-list-type": "map", + }, + }, SchemaProps: spec.SchemaProps{ Description: "Headers specifies HTTP request header matchers. Multiple match values are ANDed together, meaning, a request must match all the specified headers to select the route.", Type: []string{"array"}, @@ -1706,11 +2973,33 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_HttpRouteMatch(ref co }, }, }, + "queryParams": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-list-map-keys": []interface{}{ + "name", + }, + "x-kubernetes-list-type": "map", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "QueryParams specifies HTTP query parameter matchers. Multiple match values are ANDed together, meaning, a request must match all the specified query parameters to select the route. Supported list: - Istio: https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPMatchRequest - MSE Ingress: https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/annotations-supported-by-mse-ingress-gateways-1\n Header/Cookie > QueryParams\n- Gateway API", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPQueryParamMatch"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderMatch"}, + "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderMatch", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPPathMatch", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPQueryParamMatch"}, } } @@ -1902,9 +3191,16 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_ReleasePlan(ref commo Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.PatchPodTemplateMetadata"), }, }, + "rollingStyle": { + SchemaProps: spec.SchemaProps{ + Description: "RollingStyle can be \"Canary\", \"Partiton\" or \"BlueGreen\"", + Type: []string{"string"}, + Format: "", + }, + }, "enableExtraWorkloadForCanary": { SchemaProps: spec.SchemaProps{ - Description: "If true, then it will create new deployment for canary, such as: workload-demo-canary. When user verifies that the canary version is ready, we will remove the canary deployment and release the deployment workload-demo in full. Current only support k8s native deployment", + Description: "EnableExtraWorkloadForCanary indicates whether to create extra workload for canary True corresponds to RollingStyle \"Canary\". False corresponds to RollingStyle \"Partiton\". Ignored in BlueGreen-style. This field is about to deprecate, use RollingStyle instead. If both of them are set, controller will only consider this filed when RollingStyle is empty", Default: false, Type: []string{"boolean"}, Format: "", @@ -2155,6 +3451,12 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_RolloutStatus(ref com Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStatus"), }, }, + "blueGreenStatus": { + SchemaProps: spec.SchemaProps{ + Description: "BlueGreen describes the state of the blueGreen rollout", + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BlueGreenStatus"), + }, + }, "conditions": { SchemaProps: spec.SchemaProps{ Description: "Conditions a list of conditions a rollout can have.", @@ -2183,11 +3485,27 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_RolloutStatus(ref com Format: "", }, }, + "currentStepIndex": { + SchemaProps: spec.SchemaProps{ + Description: "These two values will be synchronized with the same fileds in CanaryStatus or BlueGreeenStatus mainly used to provide info for kubectl get command", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + "currentStepState": { + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, }, + Required: []string{"currentStepIndex", "currentStepState"}, }, }, Dependencies: []string{ - "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStatus", "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.RolloutCondition"}, + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BlueGreenStatus", "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStatus", "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.RolloutCondition"}, } } @@ -2210,11 +3528,16 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_RolloutStrategy(ref c Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStrategy"), }, }, + "blueGreen": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BlueGreenStrategy"), + }, + }, }, }, }, Dependencies: []string{ - "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStrategy"}, + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.BlueGreenStrategy", "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.CanaryStrategy"}, } } @@ -2291,12 +3614,12 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_TrafficRoutingStrateg "requestHeaderModifier": { SchemaProps: spec.SchemaProps{ Description: "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"), + Ref: ref("sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"), }, }, "matches": { SchemaProps: spec.SchemaProps{ - Description: "Matches define conditions used for matching the incoming HTTP requests to canary service. Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. If Gateway API, current only support one match. And cannot support both weight and matches, if both are configured, then matches takes precedence.", + Description: "Matches define conditions used for matching incoming HTTP requests to the canary service. Each match is independent, i.e. this rule will be matched as long as **any** one of the matches is satisfied.\n\nIt cannot support Traffic (weight-based routing) and Matches simultaneously, if both are configured. In such cases, Matches takes precedence.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -2312,6 +3635,6 @@ func schema_openkruise_kruise_rollout_api_rollouts_v1beta1_TrafficRoutingStrateg }, }, Dependencies: []string{ - "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.HttpRouteMatch", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPRequestHeaderFilter"}, + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1.HttpRouteMatch", "sigs.k8s.io/gateway-api/apis/v1beta1.HTTPHeaderFilter"}, } } diff --git a/pkg/rollouts/violation_exceptions.list b/pkg/rollouts/violation_exceptions.list index 9f54cee..7308ff7 100644 --- a/pkg/rollouts/violation_exceptions.list +++ b/pkg/rollouts/violation_exceptions.list @@ -1,17 +1,24 @@ +API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,BatchReleaseStatus,Conditions +API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,CanaryStepInfo,Pods API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,CanaryStrategy,Steps API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,CanaryStrategy,TrafficRoutings API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,HttpRouteMatch,Headers +API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,ReleasePlan,Batches +API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,RolloutHistoryStatus,CanarySteps API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,RolloutStatus,Conditions API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,TrafficRoutingRef,CustomNetworkRefs API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,TrafficRoutingSpec,ObjectRef API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,TrafficRoutingStrategy,Matches API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,BatchReleaseStatus,Conditions +API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,BlueGreenStrategy,Steps +API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,BlueGreenStrategy,TrafficRoutings API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,CanaryStrategy,Steps API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,CanaryStrategy,TrafficRoutings -API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,HttpRouteMatch,Headers API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,ReleasePlan,Batches API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,RolloutStatus,Conditions API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,TrafficRoutingRef,CustomNetworkRefs API rule violation: list_type_missing,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,TrafficRoutingStrategy,Matches +API rule violation: names_match,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,BatchReleaseCanaryStatus,CurrentBatchState +API rule violation: names_match,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,BatchReleaseSpec,TargetRef API rule violation: names_match,github.com/openkruise/kruise-rollout-api/rollouts/v1alpha1,RolloutSpec,DeprecatedRolloutID API rule violation: names_match,github.com/openkruise/kruise-rollout-api/rollouts/v1beta1,BatchReleaseCanaryStatus,CurrentBatchState diff --git a/rollouts/v1alpha1/batchrelease_plan_types.go b/rollouts/v1alpha1/batchrelease_plan_types.go new file mode 100644 index 0000000..01dda46 --- /dev/null +++ b/rollouts/v1alpha1/batchrelease_plan_types.go @@ -0,0 +1,157 @@ +/* +Copyright 2022 The Kruise 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. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +// ReleasePlan fines the details of the release plan +type ReleasePlan struct { + // Batches is the details on each batch of the ReleasePlan. + //Users can specify their batch plan in this field, such as: + // batches: + // - canaryReplicas: 1 # batches 0 + // - canaryReplicas: 2 # batches 1 + // - canaryReplicas: 5 # batches 2 + // Not that these canaryReplicas should be a non-decreasing sequence. + // +optional + Batches []ReleaseBatch `json:"batches"` + // All pods in the batches up to the batchPartition (included) will have + // the target resource specification while the rest still is the stable revision. + // This is designed for the operators to manually rollout. + // Default is nil, which means no partition and will release all batches. + // BatchPartition start from 0. + // +optional + BatchPartition *int32 `json:"batchPartition,omitempty"` + // RolloutID indicates an id for each rollout progress + RolloutID string `json:"rolloutID,omitempty"` + // FailureThreshold indicates how many failed pods can be tolerated in all upgraded pods. + // Only when FailureThreshold are satisfied, Rollout can enter ready state. + // If FailureThreshold is nil, Rollout will use the MaxUnavailable of workload as its + // FailureThreshold. + // Defaults to nil. + FailureThreshold *intstr.IntOrString `json:"failureThreshold,omitempty"` + // FinalizingPolicy define the behavior of controller when phase enter Finalizing + // Defaults to "Immediate" + FinalizingPolicy FinalizingPolicyType `json:"finalizingPolicy,omitempty"` + // PatchPodTemplateMetadata indicates patch configuration(e.g. labels, annotations) to the canary deployment podTemplateSpec.metadata + // only support for canary deployment + // +optional + PatchPodTemplateMetadata *PatchPodTemplateMetadata `json:"patchPodTemplateMetadata,omitempty"` + // RollingStyle can be "Canary", "Partiton" or "BlueGreen" + RollingStyle RollingStyleType `json:"rollingStyle,omitempty"` + // EnableExtraWorkloadForCanary indicates whether to create extra workload for canary + // True corresponds to RollingStyle "Canary". + // False corresponds to RollingStyle "Partiton". + // Ignored in BlueGreen-style. + // This field is about to deprecate, use RollingStyle instead. + // If both of them are set, controller will only consider this + // filed when RollingStyle is empty + EnableExtraWorkloadForCanary bool `json:"enableExtraWorkloadForCanary"` +} + +type FinalizingPolicyType string + +const ( + // WaitResumeFinalizingPolicyType will wait workload to be resumed, which means + // controller will be hold at Finalizing phase util all pods of workload is upgraded. + // WaitResumeFinalizingPolicyType only works in canary-style BatchRelease controller. + WaitResumeFinalizingPolicyType FinalizingPolicyType = "WaitResume" + // ImmediateFinalizingPolicyType will not to wait workload to be resumed. + ImmediateFinalizingPolicyType FinalizingPolicyType = "Immediate" +) + +// ReleaseBatch is used to describe how each batch release should be +type ReleaseBatch struct { + // CanaryReplicas is the number of upgraded pods that should have in this batch. + // it can be an absolute number (ex: 5) or a percentage of workload replicas. + // batches[i].canaryReplicas should less than or equal to batches[j].canaryReplicas if i < j. + CanaryReplicas intstr.IntOrString `json:"canaryReplicas"` +} + +// BatchReleaseStatus defines the observed state of a release plan +type BatchReleaseStatus struct { + // Conditions represents the observed process state of each phase during executing the release plan. + Conditions []RolloutCondition `json:"conditions,omitempty"` + // CanaryStatus describes the state of the canary rollout. + CanaryStatus BatchReleaseCanaryStatus `json:"canaryStatus,omitempty"` + // StableRevision is the pod-template-hash of stable revision pod template. + StableRevision string `json:"stableRevision,omitempty"` + // UpdateRevision is the pod-template-hash of update revision pod template. + UpdateRevision string `json:"updateRevision,omitempty"` + // ObservedGeneration is the most recent generation observed for this BatchRelease. + // It corresponds to this BatchRelease's generation, which is updated on mutation + // by the API Server, and only if BatchRelease Spec was changed, its generation will increase 1. + ObservedGeneration int64 `json:"observedGeneration,omitempty"` + // ObservedRolloutID is the most recent rollout-id observed for this BatchRelease. + // If RolloutID was changed, we will restart to roll out from batch 0, + // to ensure the batch-id and rollout-id labels of Pods are correct. + ObservedRolloutID string `json:"observedRolloutID,omitempty"` + // ObservedWorkloadReplicas is observed replicas of target referenced workload. + // This field is designed to deal with scaling event during rollout, if this field changed, + // it means that the workload is scaling during rollout. + ObservedWorkloadReplicas int32 `json:"observedWorkloadReplicas,omitempty"` + // Count of hash collisions for creating canary Deployment. The controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest canary Deployment. + // +optional + CollisionCount *int32 `json:"collisionCount,omitempty"` + // ObservedReleasePlanHash is a hash code of observed itself spec.releasePlan. + ObservedReleasePlanHash string `json:"observedReleasePlanHash,omitempty"` + // Phase is the release plan phase, which indicates the current state of release + // plan state machine in BatchRelease controller. + Phase RolloutPhase `json:"phase,omitempty"` +} + +type BatchReleaseCanaryStatus struct { + // CurrentBatchState indicates the release state of the current batch. + CurrentBatchState BatchReleaseBatchStateType `json:"batchState,omitempty"` + // The current batch the rollout is working on/blocked, it starts from 0 + CurrentBatch int32 `json:"currentBatch"` + // BatchReadyTime is the ready timestamp of the current batch or the last batch. + // This field is updated once a batch ready, and the batches[x].pausedSeconds + // relies on this field to calculate the real-time duration. + BatchReadyTime *metav1.Time `json:"batchReadyTime,omitempty"` + // UpdatedReplicas is the number of upgraded Pods. + UpdatedReplicas int32 `json:"updatedReplicas,omitempty"` + // UpdatedReadyReplicas is the number upgraded Pods that have a Ready Condition. + UpdatedReadyReplicas int32 `json:"updatedReadyReplicas,omitempty"` + // the number of pods that no need to rollback in rollback scene. + NoNeedUpdateReplicas *int32 `json:"noNeedUpdateReplicas,omitempty"` +} + +type BatchReleaseBatchStateType string + +const ( + // UpgradingBatchState indicates that current batch is at upgrading pod state + UpgradingBatchState BatchReleaseBatchStateType = "Upgrading" + // VerifyingBatchState indicates that current batch is at verifying whether it's ready state + VerifyingBatchState BatchReleaseBatchStateType = "Verifying" + // ReadyBatchState indicates that current batch is at batch ready state + ReadyBatchState BatchReleaseBatchStateType = "Ready" +) + +const ( + // RolloutPhasePreparing indicates a rollout is preparing for next progress. + RolloutPhasePreparing RolloutPhase = "Preparing" + // RolloutPhaseFinalizing indicates a rollout is finalizing + RolloutPhaseFinalizing RolloutPhase = "Finalizing" + // RolloutPhaseCompleted indicates a rollout is completed/cancelled/terminated + RolloutPhaseCompleted RolloutPhase = "Completed" +) diff --git a/rollouts/v1alpha1/batchrelease_types.go b/rollouts/v1alpha1/batchrelease_types.go new file mode 100644 index 0000000..bcbcd86 --- /dev/null +++ b/rollouts/v1alpha1/batchrelease_types.go @@ -0,0 +1,59 @@ +/* +Copyright 2022 The Kruise 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. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:openapi-gen=true +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="KIND",type=string,JSONPath=`.spec.targetReference.workloadRef.kind` +// +kubebuilder:printcolumn:name="PHASE",type=string,JSONPath=`.status.phase` +// +kubebuilder:printcolumn:name="BATCH",type=integer,JSONPath=`.status.canaryStatus.currentBatch` +// +kubebuilder:printcolumn:name="BATCH-STATE",type=string,JSONPath=`.status.canaryStatus.batchState` +// +kubebuilder:printcolumn:name="AGE",type=date,JSONPath=".metadata.creationTimestamp" + +type BatchRelease struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec BatchReleaseSpec `json:"spec,omitempty"` + Status BatchReleaseStatus `json:"status,omitempty"` +} + +// BatchReleaseSpec defines how to describe an update between different compRevision +type BatchReleaseSpec struct { + // TargetRef contains the GVK and name of the workload that we need to upgrade to. + TargetRef ObjectRef `json:"targetReference"` + // ReleasePlan is the details on how to rollout the resources + ReleasePlan ReleasePlan `json:"releasePlan"` +} + +// BatchReleaseList contains a list of BatchRelease +// +kubebuilder:object:root=true +type BatchReleaseList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []BatchRelease `json:"items"` +} + +func init() { + SchemeBuilder.Register(&BatchRelease{}, &BatchReleaseList{}) +} diff --git a/rollouts/v1alpha1/conversion.go b/rollouts/v1alpha1/conversion.go new file mode 100644 index 0000000..852cc33 --- /dev/null +++ b/rollouts/v1alpha1/conversion.go @@ -0,0 +1,477 @@ +/* +Copyright 2023 The Kruise 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. +*/ + +package v1alpha1 + +import ( + "fmt" + + "strings" + + "github.com/openkruise/kruise-rollout-api/rollouts/v1beta1" + "k8s.io/apimachinery/pkg/util/intstr" + utilpointer "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/conversion" +) + +func (src *Rollout) ConvertTo(dst conversion.Hub) error { + switch t := dst.(type) { + case *v1beta1.Rollout: + obj := dst.(*v1beta1.Rollout) + obj.ObjectMeta = src.ObjectMeta + obj.Spec = v1beta1.RolloutSpec{} + srcSpec := src.Spec + obj.Spec.WorkloadRef = v1beta1.ObjectRef{ + APIVersion: srcSpec.ObjectRef.WorkloadRef.APIVersion, + Kind: srcSpec.ObjectRef.WorkloadRef.Kind, + Name: srcSpec.ObjectRef.WorkloadRef.Name, + } + obj.Spec.Disabled = srcSpec.Disabled + obj.Spec.Strategy = v1beta1.RolloutStrategy{ + Paused: srcSpec.Strategy.Paused, + Canary: &v1beta1.CanaryStrategy{ + FailureThreshold: srcSpec.Strategy.Canary.FailureThreshold, + }, + } + for _, step := range srcSpec.Strategy.Canary.Steps { + o := v1beta1.CanaryStep{ + TrafficRoutingStrategy: ConversionToV1beta1TrafficRoutingStrategy(step.TrafficRoutingStrategy), + Replicas: step.Replicas, + Pause: v1beta1.RolloutPause{Duration: step.Pause.Duration}, + } + if step.Replicas == nil && step.Weight != nil { + o.Replicas = &intstr.IntOrString{ + Type: intstr.String, + StrVal: fmt.Sprintf("%d", *step.Weight) + "%", + } + } + obj.Spec.Strategy.Canary.Steps = append(obj.Spec.Strategy.Canary.Steps, o) + } + for _, ref := range srcSpec.Strategy.Canary.TrafficRoutings { + o := ConversionToV1beta1TrafficRoutingRef(ref) + obj.Spec.Strategy.Canary.TrafficRoutings = append(obj.Spec.Strategy.Canary.TrafficRoutings, o) + } + if srcSpec.Strategy.Canary.PatchPodTemplateMetadata != nil { + obj.Spec.Strategy.Canary.PatchPodTemplateMetadata = &v1beta1.PatchPodTemplateMetadata{ + Annotations: map[string]string{}, + Labels: map[string]string{}, + } + for k, v := range srcSpec.Strategy.Canary.PatchPodTemplateMetadata.Annotations { + obj.Spec.Strategy.Canary.PatchPodTemplateMetadata.Annotations[k] = v + } + for k, v := range srcSpec.Strategy.Canary.PatchPodTemplateMetadata.Labels { + obj.Spec.Strategy.Canary.PatchPodTemplateMetadata.Labels[k] = v + } + } + if !strings.EqualFold(src.Annotations[RolloutStyleAnnotation], string(PartitionRollingStyle)) { + obj.Spec.Strategy.Canary.EnableExtraWorkloadForCanary = true + } + if src.Annotations[TrafficRoutingAnnotation] != "" { + obj.Spec.Strategy.Canary.TrafficRoutingRef = src.Annotations[TrafficRoutingAnnotation] + } + + // status + obj.Status = v1beta1.RolloutStatus{ + ObservedGeneration: src.Status.ObservedGeneration, + Phase: v1beta1.RolloutPhase(src.Status.Phase), + Message: src.Status.Message, + } + for _, cond := range src.Status.Conditions { + o := v1beta1.RolloutCondition{ + Type: v1beta1.RolloutConditionType(cond.Type), + Status: cond.Status, + LastUpdateTime: cond.LastUpdateTime, + LastTransitionTime: cond.LastTransitionTime, + Reason: cond.Reason, + Message: cond.Message, + } + obj.Status.Conditions = append(obj.Status.Conditions, o) + } + if src.Status.CanaryStatus == nil { + return nil + } + obj.Status.CanaryStatus = &v1beta1.CanaryStatus{ + CommonStatus: v1beta1.CommonStatus{ + ObservedWorkloadGeneration: src.Status.CanaryStatus.ObservedWorkloadGeneration, + ObservedRolloutID: src.Status.CanaryStatus.ObservedRolloutID, + RolloutHash: src.Status.CanaryStatus.RolloutHash, + StableRevision: src.Status.CanaryStatus.StableRevision, + PodTemplateHash: src.Status.CanaryStatus.PodTemplateHash, + CurrentStepIndex: src.Status.CanaryStatus.CurrentStepIndex, + CurrentStepState: v1beta1.CanaryStepState(src.Status.CanaryStatus.CurrentStepState), + Message: src.Status.CanaryStatus.Message, + LastUpdateTime: src.Status.CanaryStatus.LastUpdateTime, + FinalisingStep: v1beta1.FinalisingStepType(src.Status.CanaryStatus.FinalisingStep), + NextStepIndex: src.Status.CanaryStatus.NextStepIndex, + }, + CanaryRevision: src.Status.CanaryStatus.CanaryRevision, + CanaryReplicas: src.Status.CanaryStatus.CanaryReplicas, + CanaryReadyReplicas: src.Status.CanaryStatus.CanaryReadyReplicas, + } + return nil + default: + return fmt.Errorf("unsupported type %v", t) + } +} + +func ConversionToV1beta1TrafficRoutingRef(src TrafficRoutingRef) (dst v1beta1.TrafficRoutingRef) { + dst.Service = src.Service + dst.GracePeriodSeconds = src.GracePeriodSeconds + if src.Ingress != nil { + dst.Ingress = &v1beta1.IngressTrafficRouting{ + ClassType: src.Ingress.ClassType, + Name: src.Ingress.Name, + } + } + if src.Gateway != nil { + dst.Gateway = &v1beta1.GatewayTrafficRouting{ + HTTPRouteName: src.Gateway.HTTPRouteName, + } + } + for _, ref := range src.CustomNetworkRefs { + obj := v1beta1.ObjectRef{ + APIVersion: ref.APIVersion, + Kind: ref.Kind, + Name: ref.Name, + } + dst.CustomNetworkRefs = append(dst.CustomNetworkRefs, obj) + } + return dst +} + +func ConversionToV1beta1TrafficRoutingStrategy(src TrafficRoutingStrategy) (dst v1beta1.TrafficRoutingStrategy) { + if src.Weight != nil { + dst.Traffic = utilpointer.String(fmt.Sprintf("%d", *src.Weight) + "%") + } + dst.RequestHeaderModifier = src.RequestHeaderModifier + for _, match := range src.Matches { + obj := v1beta1.HttpRouteMatch{ + Headers: match.Headers, + } + dst.Matches = append(dst.Matches, obj) + } + return dst +} + +func (dst *Rollout) ConvertFrom(src conversion.Hub) error { + switch t := src.(type) { + case *v1beta1.Rollout: + srcV1beta1 := src.(*v1beta1.Rollout) + dst.ObjectMeta = srcV1beta1.ObjectMeta + if !srcV1beta1.Spec.Strategy.IsCanaryStragegy() { + // only v1beta1 supports bluegreen strategy + // Don't log the message because it will print too often + return nil + } + // spec + dst.Spec = RolloutSpec{ + ObjectRef: ObjectRef{ + WorkloadRef: &WorkloadRef{ + APIVersion: srcV1beta1.Spec.WorkloadRef.APIVersion, + Kind: srcV1beta1.Spec.WorkloadRef.Kind, + Name: srcV1beta1.Spec.WorkloadRef.Name, + }, + }, + Strategy: RolloutStrategy{ + Paused: srcV1beta1.Spec.Strategy.Paused, + Canary: &CanaryStrategy{ + FailureThreshold: srcV1beta1.Spec.Strategy.Canary.FailureThreshold, + }, + }, + Disabled: srcV1beta1.Spec.Disabled, + } + for _, step := range srcV1beta1.Spec.Strategy.Canary.Steps { + obj := CanaryStep{ + TrafficRoutingStrategy: ConversionToV1alpha1TrafficRoutingStrategy(step.TrafficRoutingStrategy), + Replicas: step.Replicas, + Pause: RolloutPause{Duration: step.Pause.Duration}, + } + dst.Spec.Strategy.Canary.Steps = append(dst.Spec.Strategy.Canary.Steps, obj) + } + for _, ref := range srcV1beta1.Spec.Strategy.Canary.TrafficRoutings { + obj := ConversionToV1alpha1TrafficRoutingRef(ref) + dst.Spec.Strategy.Canary.TrafficRoutings = append(dst.Spec.Strategy.Canary.TrafficRoutings, obj) + } + if srcV1beta1.Spec.Strategy.Canary.PatchPodTemplateMetadata != nil { + dst.Spec.Strategy.Canary.PatchPodTemplateMetadata = &PatchPodTemplateMetadata{ + Annotations: map[string]string{}, + Labels: map[string]string{}, + } + for k, v := range srcV1beta1.Spec.Strategy.Canary.PatchPodTemplateMetadata.Annotations { + dst.Spec.Strategy.Canary.PatchPodTemplateMetadata.Annotations[k] = v + } + for k, v := range srcV1beta1.Spec.Strategy.Canary.PatchPodTemplateMetadata.Labels { + dst.Spec.Strategy.Canary.PatchPodTemplateMetadata.Labels[k] = v + } + } + if dst.Annotations == nil { + dst.Annotations = map[string]string{} + } + if srcV1beta1.Spec.Strategy.Canary.EnableExtraWorkloadForCanary { + dst.Annotations[RolloutStyleAnnotation] = strings.ToLower(string(CanaryRollingStyle)) + } else { + dst.Annotations[RolloutStyleAnnotation] = strings.ToLower(string(PartitionRollingStyle)) + } + if srcV1beta1.Spec.Strategy.Canary.TrafficRoutingRef != "" { + dst.Annotations[TrafficRoutingAnnotation] = srcV1beta1.Spec.Strategy.Canary.TrafficRoutingRef + } + + // status + dst.Status = RolloutStatus{ + ObservedGeneration: srcV1beta1.Status.ObservedGeneration, + Phase: RolloutPhase(srcV1beta1.Status.Phase), + Message: srcV1beta1.Status.Message, + } + for _, cond := range srcV1beta1.Status.Conditions { + obj := RolloutCondition{ + Type: RolloutConditionType(cond.Type), + Status: cond.Status, + LastUpdateTime: cond.LastUpdateTime, + LastTransitionTime: cond.LastTransitionTime, + Reason: cond.Reason, + Message: cond.Message, + } + dst.Status.Conditions = append(dst.Status.Conditions, obj) + } + if srcV1beta1.Status.CanaryStatus == nil { + return nil + } + dst.Status.CanaryStatus = &CanaryStatus{ + ObservedWorkloadGeneration: srcV1beta1.Status.CanaryStatus.ObservedWorkloadGeneration, + ObservedRolloutID: srcV1beta1.Status.CanaryStatus.ObservedRolloutID, + RolloutHash: srcV1beta1.Status.CanaryStatus.RolloutHash, + StableRevision: srcV1beta1.Status.CanaryStatus.StableRevision, + CanaryRevision: srcV1beta1.Status.CanaryStatus.CanaryRevision, + PodTemplateHash: srcV1beta1.Status.CanaryStatus.PodTemplateHash, + CanaryReplicas: srcV1beta1.Status.CanaryStatus.CanaryReplicas, + CanaryReadyReplicas: srcV1beta1.Status.CanaryStatus.CanaryReadyReplicas, + CurrentStepIndex: srcV1beta1.Status.CanaryStatus.CurrentStepIndex, + CurrentStepState: CanaryStepState(srcV1beta1.Status.CanaryStatus.CurrentStepState), + Message: srcV1beta1.Status.CanaryStatus.Message, + LastUpdateTime: srcV1beta1.Status.CanaryStatus.LastUpdateTime, + FinalisingStep: FinalizeStateType(srcV1beta1.Status.CanaryStatus.FinalisingStep), + NextStepIndex: srcV1beta1.Status.CanaryStatus.NextStepIndex, + } + return nil + default: + return fmt.Errorf("unsupported type %v", t) + } +} + +func ConversionToV1alpha1TrafficRoutingStrategy(src v1beta1.TrafficRoutingStrategy) (dst TrafficRoutingStrategy) { + if src.Traffic != nil { + is := intstr.FromString(*src.Traffic) + weight, _ := intstr.GetScaledValueFromIntOrPercent(&is, 100, true) + dst.Weight = utilpointer.Int32(int32(weight)) + } + dst.RequestHeaderModifier = src.RequestHeaderModifier + for _, match := range src.Matches { + obj := HttpRouteMatch{ + Headers: match.Headers, + } + dst.Matches = append(dst.Matches, obj) + } + return dst +} + +func ConversionToV1alpha1TrafficRoutingRef(src v1beta1.TrafficRoutingRef) (dst TrafficRoutingRef) { + dst.Service = src.Service + dst.GracePeriodSeconds = src.GracePeriodSeconds + if src.Ingress != nil { + dst.Ingress = &IngressTrafficRouting{ + ClassType: src.Ingress.ClassType, + Name: src.Ingress.Name, + } + } + if src.Gateway != nil { + dst.Gateway = &GatewayTrafficRouting{ + HTTPRouteName: src.Gateway.HTTPRouteName, + } + } + for _, ref := range src.CustomNetworkRefs { + obj := CustomNetworkRef{ + APIVersion: ref.APIVersion, + Kind: ref.Kind, + Name: ref.Name, + } + dst.CustomNetworkRefs = append(dst.CustomNetworkRefs, obj) + } + return dst +} + +func (src *BatchRelease) ConvertTo(dst conversion.Hub) error { + switch t := dst.(type) { + case *v1beta1.BatchRelease: + obj := dst.(*v1beta1.BatchRelease) + obj.ObjectMeta = src.ObjectMeta + obj.Spec = v1beta1.BatchReleaseSpec{} + srcSpec := src.Spec + obj.Spec.WorkloadRef = v1beta1.ObjectRef{ + APIVersion: srcSpec.TargetRef.WorkloadRef.APIVersion, + Kind: srcSpec.TargetRef.WorkloadRef.Kind, + Name: srcSpec.TargetRef.WorkloadRef.Name, + } + obj.Spec.ReleasePlan = v1beta1.ReleasePlan{ + BatchPartition: srcSpec.ReleasePlan.BatchPartition, + RolloutID: srcSpec.ReleasePlan.RolloutID, + FailureThreshold: srcSpec.ReleasePlan.FailureThreshold, + FinalizingPolicy: v1beta1.FinalizingPolicyType(srcSpec.ReleasePlan.FinalizingPolicy), + } + for _, batch := range srcSpec.ReleasePlan.Batches { + o := v1beta1.ReleaseBatch{ + CanaryReplicas: batch.CanaryReplicas, + } + obj.Spec.ReleasePlan.Batches = append(obj.Spec.ReleasePlan.Batches, o) + } + if srcSpec.ReleasePlan.PatchPodTemplateMetadata != nil { + obj.Spec.ReleasePlan.PatchPodTemplateMetadata = &v1beta1.PatchPodTemplateMetadata{ + Annotations: map[string]string{}, + Labels: map[string]string{}, + } + for k, v := range srcSpec.ReleasePlan.PatchPodTemplateMetadata.Annotations { + obj.Spec.ReleasePlan.PatchPodTemplateMetadata.Annotations[k] = v + } + for k, v := range srcSpec.ReleasePlan.PatchPodTemplateMetadata.Labels { + obj.Spec.ReleasePlan.PatchPodTemplateMetadata.Labels[k] = v + } + } + + if strings.EqualFold(src.Annotations[RolloutStyleAnnotation], string(PartitionRollingStyle)) { + obj.Spec.ReleasePlan.RollingStyle = v1beta1.PartitionRollingStyle + } + if strings.EqualFold(src.Annotations[RolloutStyleAnnotation], string(CanaryRollingStyle)) { + obj.Spec.ReleasePlan.RollingStyle = v1beta1.CanaryRollingStyle + } + if strings.EqualFold(src.Annotations[RolloutStyleAnnotation], string(BlueGreenRollingStyle)) { + obj.Spec.ReleasePlan.RollingStyle = v1beta1.BlueGreenRollingStyle + } + + obj.Spec.ReleasePlan.EnableExtraWorkloadForCanary = srcSpec.ReleasePlan.EnableExtraWorkloadForCanary + + // status + obj.Status = v1beta1.BatchReleaseStatus{ + StableRevision: src.Status.StableRevision, + UpdateRevision: src.Status.UpdateRevision, + ObservedGeneration: src.Status.ObservedGeneration, + ObservedRolloutID: src.Status.ObservedRolloutID, + ObservedWorkloadReplicas: src.Status.ObservedWorkloadReplicas, + ObservedReleasePlanHash: src.Status.ObservedReleasePlanHash, + CollisionCount: src.Status.CollisionCount, + Phase: v1beta1.RolloutPhase(src.Status.Phase), + } + for _, cond := range src.Status.Conditions { + o := v1beta1.RolloutCondition{ + Type: v1beta1.RolloutConditionType(cond.Type), + Status: cond.Status, + LastUpdateTime: cond.LastUpdateTime, + LastTransitionTime: cond.LastTransitionTime, + Reason: cond.Reason, + Message: cond.Message, + } + obj.Status.Conditions = append(obj.Status.Conditions, o) + } + obj.Status.CanaryStatus = v1beta1.BatchReleaseCanaryStatus{ + CurrentBatchState: v1beta1.BatchReleaseBatchStateType(src.Status.CanaryStatus.CurrentBatchState), + CurrentBatch: src.Status.CanaryStatus.CurrentBatch, + BatchReadyTime: src.Status.CanaryStatus.BatchReadyTime, + UpdatedReplicas: src.Status.CanaryStatus.UpdatedReplicas, + UpdatedReadyReplicas: src.Status.CanaryStatus.UpdatedReadyReplicas, + NoNeedUpdateReplicas: src.Status.CanaryStatus.NoNeedUpdateReplicas, + } + return nil + default: + return fmt.Errorf("unsupported type %v", t) + } +} + +func (dst *BatchRelease) ConvertFrom(src conversion.Hub) error { + switch t := src.(type) { + case *v1beta1.BatchRelease: + srcV1beta1 := src.(*v1beta1.BatchRelease) + dst.ObjectMeta = srcV1beta1.ObjectMeta + dst.Spec = BatchReleaseSpec{} + srcSpec := srcV1beta1.Spec + dst.Spec.TargetRef.WorkloadRef = &WorkloadRef{ + APIVersion: srcSpec.WorkloadRef.APIVersion, + Kind: srcSpec.WorkloadRef.Kind, + Name: srcSpec.WorkloadRef.Name, + } + dst.Spec.ReleasePlan = ReleasePlan{ + BatchPartition: srcSpec.ReleasePlan.BatchPartition, + RolloutID: srcSpec.ReleasePlan.RolloutID, + FailureThreshold: srcSpec.ReleasePlan.FailureThreshold, + FinalizingPolicy: FinalizingPolicyType(srcSpec.ReleasePlan.FinalizingPolicy), + } + for _, batch := range srcSpec.ReleasePlan.Batches { + obj := ReleaseBatch{ + CanaryReplicas: batch.CanaryReplicas, + } + dst.Spec.ReleasePlan.Batches = append(dst.Spec.ReleasePlan.Batches, obj) + } + if srcSpec.ReleasePlan.PatchPodTemplateMetadata != nil { + dst.Spec.ReleasePlan.PatchPodTemplateMetadata = &PatchPodTemplateMetadata{ + Annotations: map[string]string{}, + Labels: map[string]string{}, + } + for k, v := range srcSpec.ReleasePlan.PatchPodTemplateMetadata.Annotations { + dst.Spec.ReleasePlan.PatchPodTemplateMetadata.Annotations[k] = v + } + for k, v := range srcSpec.ReleasePlan.PatchPodTemplateMetadata.Labels { + dst.Spec.ReleasePlan.PatchPodTemplateMetadata.Labels[k] = v + } + } + if dst.Annotations == nil { + dst.Annotations = map[string]string{} + } + dst.Annotations[RolloutStyleAnnotation] = strings.ToLower(string(srcV1beta1.Spec.ReleasePlan.RollingStyle)) + dst.Spec.ReleasePlan.RollingStyle = RollingStyleType(srcV1beta1.Spec.ReleasePlan.RollingStyle) + dst.Spec.ReleasePlan.EnableExtraWorkloadForCanary = srcV1beta1.Spec.ReleasePlan.EnableExtraWorkloadForCanary + + // status + dst.Status = BatchReleaseStatus{ + StableRevision: srcV1beta1.Status.StableRevision, + UpdateRevision: srcV1beta1.Status.UpdateRevision, + ObservedGeneration: srcV1beta1.Status.ObservedGeneration, + ObservedRolloutID: srcV1beta1.Status.ObservedRolloutID, + ObservedWorkloadReplicas: srcV1beta1.Status.ObservedWorkloadReplicas, + ObservedReleasePlanHash: srcV1beta1.Status.ObservedReleasePlanHash, + CollisionCount: srcV1beta1.Status.CollisionCount, + Phase: RolloutPhase(srcV1beta1.Status.Phase), + } + for _, cond := range srcV1beta1.Status.Conditions { + obj := RolloutCondition{ + Type: RolloutConditionType(cond.Type), + Status: cond.Status, + LastUpdateTime: cond.LastUpdateTime, + LastTransitionTime: cond.LastTransitionTime, + Reason: cond.Reason, + Message: cond.Message, + } + dst.Status.Conditions = append(dst.Status.Conditions, obj) + } + dst.Status.CanaryStatus = BatchReleaseCanaryStatus{ + CurrentBatchState: BatchReleaseBatchStateType(srcV1beta1.Status.CanaryStatus.CurrentBatchState), + CurrentBatch: srcV1beta1.Status.CanaryStatus.CurrentBatch, + BatchReadyTime: srcV1beta1.Status.CanaryStatus.BatchReadyTime, + UpdatedReplicas: srcV1beta1.Status.CanaryStatus.UpdatedReplicas, + UpdatedReadyReplicas: srcV1beta1.Status.CanaryStatus.UpdatedReadyReplicas, + NoNeedUpdateReplicas: srcV1beta1.Status.CanaryStatus.NoNeedUpdateReplicas, + } + return nil + default: + return fmt.Errorf("unsupported type %v", t) + } +} diff --git a/rollouts/v1alpha1/deployment_types.go b/rollouts/v1alpha1/deployment_types.go new file mode 100644 index 0000000..98fc474 --- /dev/null +++ b/rollouts/v1alpha1/deployment_types.go @@ -0,0 +1,105 @@ +/* +Copyright 2023 The Kruise 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. +*/ + +package v1alpha1 + +import ( + apps "k8s.io/api/apps/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +const ( + // DeploymentStrategyAnnotation is annotation for deployment, + // which is strategy fields of Advanced Deployment. + DeploymentStrategyAnnotation = "rollouts.kruise.io/deployment-strategy" + + // DeploymentExtraStatusAnnotation is annotation for deployment, + // which is extra status field of Advanced Deployment. + DeploymentExtraStatusAnnotation = "rollouts.kruise.io/deployment-extra-status" + + // DeploymentStableRevisionLabel is label for deployment, + // which record the stable revision during the current rolling process. + DeploymentStableRevisionLabel = "rollouts.kruise.io/stable-revision" + + // AdvancedDeploymentControlLabel is label for deployment, + // which labels whether the deployment is controlled by advanced-deployment-controller. + AdvancedDeploymentControlLabel = "rollouts.kruise.io/controlled-by-advanced-deployment-controller" +) + +// DeploymentStrategy is strategy field for Advanced Deployment +type DeploymentStrategy struct { + // RollingStyle define the behavior of rolling for deployment. + RollingStyle RollingStyleType `json:"rollingStyle,omitempty"` + // original deployment strategy rolling update fields + RollingUpdate *apps.RollingUpdateDeployment `json:"rollingUpdate,omitempty"` + // Paused = true will block the upgrade of Pods + Paused bool `json:"paused,omitempty"` + // Partition describe how many Pods should be updated during rollout. + // We use this field to implement partition-style rolling update. + Partition intstr.IntOrString `json:"partition,omitempty"` +} + +type RollingStyleType string + +const ( + // PartitionRollingStyle means rolling in batches just like CloneSet, and will NOT create any extra Deployment; + PartitionRollingStyle RollingStyleType = "Partition" + // CanaryRollingStyle means rolling in canary way, and will create a canary Deployment. + CanaryRollingStyle RollingStyleType = "Canary" + // BlueGreenRollingStyle means rolling in blue-green way, and will NOT create a canary Deployment. + BlueGreenRollingStyle RollingStyleType = "BlueGreen" +) + +// DeploymentExtraStatus is extra status field for Advanced Deployment +type DeploymentExtraStatus struct { + // UpdatedReadyReplicas the number of pods that has been updated and ready. + UpdatedReadyReplicas int32 `json:"updatedReadyReplicas,omitempty"` + // ExpectedUpdatedReplicas is an absolute number calculated based on Partition + // and Deployment.Spec.Replicas, means how many pods are expected be updated under + // current strategy. + // This field is designed to avoid users to fall into the details of algorithm + // for Partition calculation. + ExpectedUpdatedReplicas int32 `json:"expectedUpdatedReplicas,omitempty"` +} + +func SetDefaultDeploymentStrategy(strategy *DeploymentStrategy) { + if strategy.RollingStyle != PartitionRollingStyle { + return + } + if strategy.RollingUpdate == nil { + strategy.RollingUpdate = &apps.RollingUpdateDeployment{} + } + if strategy.RollingUpdate.MaxUnavailable == nil { + // Set MaxUnavailable as 25% by default + maxUnavailable := intstr.FromString("25%") + strategy.RollingUpdate.MaxUnavailable = &maxUnavailable + } + if strategy.RollingUpdate.MaxSurge == nil { + // Set MaxSurge as 25% by default + maxSurge := intstr.FromString("25%") + strategy.RollingUpdate.MaxUnavailable = &maxSurge + } + + // Cannot allow maxSurge==0 && MaxUnavailable==0, otherwise, no pod can be updated when rolling update. + maxSurge, _ := intstr.GetScaledValueFromIntOrPercent(strategy.RollingUpdate.MaxSurge, 100, true) + maxUnavailable, _ := intstr.GetScaledValueFromIntOrPercent(strategy.RollingUpdate.MaxUnavailable, 100, true) + if maxSurge == 0 && maxUnavailable == 0 { + strategy.RollingUpdate = &apps.RollingUpdateDeployment{ + MaxSurge: &intstr.IntOrString{Type: intstr.Int, IntVal: 0}, + MaxUnavailable: &intstr.IntOrString{Type: intstr.Int, IntVal: 1}, + } + } +} diff --git a/rollouts/v1alpha1/groupversion_info.go b/rollouts/v1alpha1/groupversion_info.go index a4d1bea..880e9dd 100644 --- a/rollouts/v1alpha1/groupversion_info.go +++ b/rollouts/v1alpha1/groupversion_info.go @@ -21,8 +21,7 @@ package v1alpha1 import ( "k8s.io/apimachinery/pkg/runtime/schema" - - "github.com/openkruise/kruise-rollout-api/utils/scheme" + "sigs.k8s.io/controller-runtime/pkg/scheme" ) var ( diff --git a/rollouts/v1alpha1/rollouthistory_types.go b/rollouts/v1alpha1/rollouthistory_types.go new file mode 100644 index 0000000..0a80be3 --- /dev/null +++ b/rollouts/v1alpha1/rollouthistory_types.go @@ -0,0 +1,151 @@ +/* +Copyright 2022 The Kruise 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. +*/ + +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +// RolloutHistorySpec defines the desired state of RolloutHistory +type RolloutHistorySpec struct { + // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + // Important: Run "make" to regenerate code after modifying this file + + // Rollout indicates information of the rollout related with rollouthistory + Rollout RolloutInfo `json:"rollout,omitempty"` + // Workload indicates information of the workload, such as cloneset, deployment, advanced statefulset + Workload WorkloadInfo `json:"workload,omitempty"` + // Service indicates information of the service related with workload + Service ServiceInfo `json:"service,omitempty"` + // TrafficRouting indicates information of traffic route related with workload + TrafficRouting TrafficRoutingInfo `json:"trafficRouting,omitempty"` +} + +type NameAndSpecData struct { + // Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc. + Name string `json:"name"` + // Data indecates the spec of object ref + // +kubebuilder:pruning:PreserveUnknownFields + // +kubebuilder:validation:Schemaless + Data runtime.RawExtension `json:"data,omitempty"` +} + +// RolloutInfo indicates information of the rollout related +type RolloutInfo struct { + // RolloutID indicates the new rollout + // if there is no new RolloutID this time, ignore it and not execute RolloutHistory + RolloutID string `json:"rolloutID"` + NameAndSpecData `json:",inline"` +} + +// ServiceInfo indicates information of the service related +type ServiceInfo struct { + NameAndSpecData `json:",inline"` +} + +// TrafficRoutingInfo indicates information of Gateway API or Ingress +type TrafficRoutingInfo struct { + // IngressRef indicates information of ingress + // +optional + Ingress *IngressInfo `json:"ingress,omitempty"` + // HTTPRouteRef indacates information of Gateway API + // +optional + HTTPRoute *HTTPRouteInfo `json:"httpRoute,omitempty"` +} + +// IngressInfo indicates information of the ingress related +type IngressInfo struct { + NameAndSpecData `json:",inline"` +} + +// HTTPRouteInfo indicates information of gateway API +type HTTPRouteInfo struct { + NameAndSpecData `json:",inline"` +} + +// WorkloadInfo indicates information of the workload, such as cloneset, deployment, advanced statefulset +type WorkloadInfo struct { + metav1.TypeMeta `json:",inline"` + NameAndSpecData `json:",inline"` +} + +// RolloutHistoryStatus defines the observed state of RolloutHistory +type RolloutHistoryStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file + + // Phase indicates phase of RolloutHistory, just "" or "completed" + Phase string `json:"phase,omitempty"` + // CanarySteps indicates the pods released each step + CanarySteps []CanaryStepInfo `json:"canarySteps,omitempty"` +} + +// CanaryStepInfo indicates the pods for a revision +type CanaryStepInfo struct { + // CanaryStepIndex indicates step this revision + CanaryStepIndex int32 `json:"canaryStepIndex,omitempty"` + // Pods indicates the pods information + Pods []Pod `json:"pods,omitempty"` +} + +// Pod indicates the information of a pod, including name, ip, node_name. +type Pod struct { + // Name indicates the node name + Name string `json:"name,omitempty"` + // IP indicates the pod ip + IP string `json:"ip,omitempty"` + // NodeName indicates the node which pod is located at + NodeName string `json:"nodeName,omitempty"` + // todo + // State indicates whether the pod is ready or not + // State string `json:"state, omitempty"` +} + +// Phase indicates rollouthistory phase +const ( + PhaseCompleted string = "completed" +) + +// +genclient +//+kubebuilder:object:root=true +//+kubebuilder:subresource:status + +// RolloutHistory is the Schema for the rollouthistories API +type RolloutHistory struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec RolloutHistorySpec `json:"spec,omitempty"` + Status RolloutHistoryStatus `json:"status,omitempty"` +} + +//+kubebuilder:object:root=true + +// RolloutHistoryList contains a list of RolloutHistory +type RolloutHistoryList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []RolloutHistory `json:"items"` +} + +func init() { + SchemeBuilder.Register(&RolloutHistory{}, &RolloutHistoryList{}) +} diff --git a/rollouts/v1alpha1/trafficrouting_types.go b/rollouts/v1alpha1/trafficrouting_types.go index 4335635..88e918d 100644 --- a/rollouts/v1alpha1/trafficrouting_types.go +++ b/rollouts/v1alpha1/trafficrouting_types.go @@ -90,7 +90,7 @@ type TrafficRoutingStrategy struct { // my-header: bar // // +optional - RequestHeaderModifier *gatewayv1beta1.HTTPRequestHeaderFilter `json:"requestHeaderModifier,omitempty"` + RequestHeaderModifier *gatewayv1beta1.HTTPHeaderFilter `json:"requestHeaderModifier,omitempty"` // Matches define conditions used for matching the incoming HTTP requests to canary service. // Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. // If Gateway API, current only support one match. diff --git a/rollouts/v1alpha1/zz_generated.deepcopy.go b/rollouts/v1alpha1/zz_generated.deepcopy.go index 475fbbd..b999a5b 100644 --- a/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright 2024 The Kruise Authors. +Copyright 2023 The Kruise Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22,11 +22,140 @@ limitations under the License. package v1alpha1 import ( - runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/api/apps/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" "sigs.k8s.io/gateway-api/apis/v1beta1" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BatchRelease) DeepCopyInto(out *BatchRelease) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BatchRelease. +func (in *BatchRelease) DeepCopy() *BatchRelease { + if in == nil { + return nil + } + out := new(BatchRelease) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BatchRelease) 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 *BatchReleaseCanaryStatus) DeepCopyInto(out *BatchReleaseCanaryStatus) { + *out = *in + if in.BatchReadyTime != nil { + in, out := &in.BatchReadyTime, &out.BatchReadyTime + *out = (*in).DeepCopy() + } + if in.NoNeedUpdateReplicas != nil { + in, out := &in.NoNeedUpdateReplicas, &out.NoNeedUpdateReplicas + *out = new(int32) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BatchReleaseCanaryStatus. +func (in *BatchReleaseCanaryStatus) DeepCopy() *BatchReleaseCanaryStatus { + if in == nil { + return nil + } + out := new(BatchReleaseCanaryStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BatchReleaseList) DeepCopyInto(out *BatchReleaseList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]BatchRelease, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BatchReleaseList. +func (in *BatchReleaseList) DeepCopy() *BatchReleaseList { + if in == nil { + return nil + } + out := new(BatchReleaseList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BatchReleaseList) 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 *BatchReleaseSpec) DeepCopyInto(out *BatchReleaseSpec) { + *out = *in + in.TargetRef.DeepCopyInto(&out.TargetRef) + in.ReleasePlan.DeepCopyInto(&out.ReleasePlan) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BatchReleaseSpec. +func (in *BatchReleaseSpec) DeepCopy() *BatchReleaseSpec { + if in == nil { + return nil + } + out := new(BatchReleaseSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BatchReleaseStatus) DeepCopyInto(out *BatchReleaseStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]RolloutCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.CanaryStatus.DeepCopyInto(&out.CanaryStatus) + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + *out = new(int32) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BatchReleaseStatus. +func (in *BatchReleaseStatus) DeepCopy() *BatchReleaseStatus { + if in == nil { + return nil + } + out := new(BatchReleaseStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CanaryStatus) DeepCopyInto(out *CanaryStatus) { *out = *in @@ -68,6 +197,26 @@ func (in *CanaryStep) DeepCopy() *CanaryStep { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CanaryStepInfo) DeepCopyInto(out *CanaryStepInfo) { + *out = *in + if in.Pods != nil { + in, out := &in.Pods, &out.Pods + *out = make([]Pod, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CanaryStepInfo. +func (in *CanaryStepInfo) DeepCopy() *CanaryStepInfo { + if in == nil { + return nil + } + out := new(CanaryStepInfo) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CanaryStrategy) DeepCopyInto(out *CanaryStrategy) { *out = *in @@ -122,6 +271,42 @@ func (in *CustomNetworkRef) DeepCopy() *CustomNetworkRef { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeploymentExtraStatus) DeepCopyInto(out *DeploymentExtraStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentExtraStatus. +func (in *DeploymentExtraStatus) DeepCopy() *DeploymentExtraStatus { + if in == nil { + return nil + } + out := new(DeploymentExtraStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeploymentStrategy) DeepCopyInto(out *DeploymentStrategy) { + *out = *in + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(v1.RollingUpdateDeployment) + (*in).DeepCopyInto(*out) + } + out.Partition = in.Partition +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentStrategy. +func (in *DeploymentStrategy) DeepCopy() *DeploymentStrategy { + if in == nil { + return nil + } + out := new(DeploymentStrategy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GatewayTrafficRouting) DeepCopyInto(out *GatewayTrafficRouting) { *out = *in @@ -142,6 +327,22 @@ func (in *GatewayTrafficRouting) DeepCopy() *GatewayTrafficRouting { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HTTPRouteInfo) DeepCopyInto(out *HTTPRouteInfo) { + *out = *in + in.NameAndSpecData.DeepCopyInto(&out.NameAndSpecData) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPRouteInfo. +func (in *HTTPRouteInfo) DeepCopy() *HTTPRouteInfo { + if in == nil { + return nil + } + out := new(HTTPRouteInfo) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *HttpRouteMatch) DeepCopyInto(out *HttpRouteMatch) { *out = *in @@ -164,6 +365,22 @@ func (in *HttpRouteMatch) DeepCopy() *HttpRouteMatch { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressInfo) DeepCopyInto(out *IngressInfo) { + *out = *in + in.NameAndSpecData.DeepCopyInto(&out.NameAndSpecData) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressInfo. +func (in *IngressInfo) DeepCopy() *IngressInfo { + if in == nil { + return nil + } + out := new(IngressInfo) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IngressTrafficRouting) DeepCopyInto(out *IngressTrafficRouting) { *out = *in @@ -179,6 +396,22 @@ func (in *IngressTrafficRouting) DeepCopy() *IngressTrafficRouting { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NameAndSpecData) DeepCopyInto(out *NameAndSpecData) { + *out = *in + in.Data.DeepCopyInto(&out.Data) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NameAndSpecData. +func (in *NameAndSpecData) DeepCopy() *NameAndSpecData { + if in == nil { + return nil + } + out := new(NameAndSpecData) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ObjectRef) DeepCopyInto(out *ObjectRef) { *out = *in @@ -228,6 +461,72 @@ func (in *PatchPodTemplateMetadata) DeepCopy() *PatchPodTemplateMetadata { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Pod) DeepCopyInto(out *Pod) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Pod. +func (in *Pod) DeepCopy() *Pod { + if in == nil { + return nil + } + out := new(Pod) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ReleaseBatch) DeepCopyInto(out *ReleaseBatch) { + *out = *in + out.CanaryReplicas = in.CanaryReplicas +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReleaseBatch. +func (in *ReleaseBatch) DeepCopy() *ReleaseBatch { + if in == nil { + return nil + } + out := new(ReleaseBatch) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ReleasePlan) DeepCopyInto(out *ReleasePlan) { + *out = *in + if in.Batches != nil { + in, out := &in.Batches, &out.Batches + *out = make([]ReleaseBatch, len(*in)) + copy(*out, *in) + } + if in.BatchPartition != nil { + in, out := &in.BatchPartition, &out.BatchPartition + *out = new(int32) + **out = **in + } + if in.FailureThreshold != nil { + in, out := &in.FailureThreshold, &out.FailureThreshold + *out = new(intstr.IntOrString) + **out = **in + } + if in.PatchPodTemplateMetadata != nil { + in, out := &in.PatchPodTemplateMetadata, &out.PatchPodTemplateMetadata + *out = new(PatchPodTemplateMetadata) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReleasePlan. +func (in *ReleasePlan) DeepCopy() *ReleasePlan { + if in == nil { + return nil + } + out := new(ReleasePlan) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Rollout) DeepCopyInto(out *Rollout) { *out = *in @@ -272,6 +571,122 @@ func (in *RolloutCondition) DeepCopy() *RolloutCondition { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RolloutHistory) DeepCopyInto(out *RolloutHistory) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RolloutHistory. +func (in *RolloutHistory) DeepCopy() *RolloutHistory { + if in == nil { + return nil + } + out := new(RolloutHistory) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RolloutHistory) 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 *RolloutHistoryList) DeepCopyInto(out *RolloutHistoryList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]RolloutHistory, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RolloutHistoryList. +func (in *RolloutHistoryList) DeepCopy() *RolloutHistoryList { + if in == nil { + return nil + } + out := new(RolloutHistoryList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *RolloutHistoryList) 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 *RolloutHistorySpec) DeepCopyInto(out *RolloutHistorySpec) { + *out = *in + in.Rollout.DeepCopyInto(&out.Rollout) + in.Workload.DeepCopyInto(&out.Workload) + in.Service.DeepCopyInto(&out.Service) + in.TrafficRouting.DeepCopyInto(&out.TrafficRouting) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RolloutHistorySpec. +func (in *RolloutHistorySpec) DeepCopy() *RolloutHistorySpec { + if in == nil { + return nil + } + out := new(RolloutHistorySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RolloutHistoryStatus) DeepCopyInto(out *RolloutHistoryStatus) { + *out = *in + if in.CanarySteps != nil { + in, out := &in.CanarySteps, &out.CanarySteps + *out = make([]CanaryStepInfo, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RolloutHistoryStatus. +func (in *RolloutHistoryStatus) DeepCopy() *RolloutHistoryStatus { + if in == nil { + return nil + } + out := new(RolloutHistoryStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RolloutInfo) DeepCopyInto(out *RolloutInfo) { + *out = *in + in.NameAndSpecData.DeepCopyInto(&out.NameAndSpecData) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RolloutInfo. +func (in *RolloutInfo) DeepCopy() *RolloutInfo { + if in == nil { + return nil + } + out := new(RolloutInfo) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RolloutList) DeepCopyInto(out *RolloutList) { *out = *in @@ -388,6 +803,22 @@ func (in *RolloutStrategy) DeepCopy() *RolloutStrategy { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServiceInfo) DeepCopyInto(out *ServiceInfo) { + *out = *in + in.NameAndSpecData.DeepCopyInto(&out.NameAndSpecData) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceInfo. +func (in *ServiceInfo) DeepCopy() *ServiceInfo { + if in == nil { + return nil + } + out := new(ServiceInfo) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TrafficRouting) DeepCopyInto(out *TrafficRouting) { *out = *in @@ -415,6 +846,31 @@ func (in *TrafficRouting) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TrafficRoutingInfo) DeepCopyInto(out *TrafficRoutingInfo) { + *out = *in + if in.Ingress != nil { + in, out := &in.Ingress, &out.Ingress + *out = new(IngressInfo) + (*in).DeepCopyInto(*out) + } + if in.HTTPRoute != nil { + in, out := &in.HTTPRoute, &out.HTTPRoute + *out = new(HTTPRouteInfo) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrafficRoutingInfo. +func (in *TrafficRoutingInfo) DeepCopy() *TrafficRoutingInfo { + if in == nil { + return nil + } + out := new(TrafficRoutingInfo) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TrafficRoutingList) DeepCopyInto(out *TrafficRoutingList) { *out = *in @@ -525,7 +981,7 @@ func (in *TrafficRoutingStrategy) DeepCopyInto(out *TrafficRoutingStrategy) { } if in.RequestHeaderModifier != nil { in, out := &in.RequestHeaderModifier, &out.RequestHeaderModifier - *out = new(v1beta1.HTTPRequestHeaderFilter) + *out = new(v1beta1.HTTPHeaderFilter) (*in).DeepCopyInto(*out) } if in.Matches != nil { @@ -547,6 +1003,23 @@ func (in *TrafficRoutingStrategy) DeepCopy() *TrafficRoutingStrategy { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WorkloadInfo) DeepCopyInto(out *WorkloadInfo) { + *out = *in + out.TypeMeta = in.TypeMeta + in.NameAndSpecData.DeepCopyInto(&out.NameAndSpecData) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkloadInfo. +func (in *WorkloadInfo) DeepCopy() *WorkloadInfo { + if in == nil { + return nil + } + out := new(WorkloadInfo) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WorkloadRef) DeepCopyInto(out *WorkloadRef) { *out = *in diff --git a/rollouts/v1beta1/batchrelease_plan_types.go b/rollouts/v1beta1/batchrelease_plan_types.go index 8b3c21a..a147294 100644 --- a/rollouts/v1beta1/batchrelease_plan_types.go +++ b/rollouts/v1beta1/batchrelease_plan_types.go @@ -54,9 +54,15 @@ type ReleasePlan struct { // only support for canary deployment // +optional PatchPodTemplateMetadata *PatchPodTemplateMetadata `json:"patchPodTemplateMetadata,omitempty"` - // If true, then it will create new deployment for canary, such as: workload-demo-canary. - // When user verifies that the canary version is ready, we will remove the canary deployment and release the deployment workload-demo in full. - // Current only support k8s native deployment + // RollingStyle can be "Canary", "Partiton" or "BlueGreen" + RollingStyle RollingStyleType `json:"rollingStyle,omitempty"` + // EnableExtraWorkloadForCanary indicates whether to create extra workload for canary + // True corresponds to RollingStyle "Canary". + // False corresponds to RollingStyle "Partiton". + // Ignored in BlueGreen-style. + // This field is about to deprecate, use RollingStyle instead. + // If both of them are set, controller will only consider this + // filed when RollingStyle is empty EnableExtraWorkloadForCanary bool `json:"enableExtraWorkloadForCanary"` } @@ -64,7 +70,7 @@ type FinalizingPolicyType string const ( // WaitResumeFinalizingPolicyType will wait workload to be resumed, which means - // controller will be hold at Finalizing phase util all pods of workload is upgraded. + // controller will be hold at Finalizing phase until all pods of workload is upgraded. // WaitResumeFinalizingPolicyType only works in canary-style BatchRelease controller. WaitResumeFinalizingPolicyType FinalizingPolicyType = "WaitResume" // ImmediateFinalizingPolicyType will not to wait workload to be resumed. @@ -111,6 +117,8 @@ type BatchReleaseStatus struct { // Phase is the release plan phase, which indicates the current state of release // plan state machine in BatchRelease controller. Phase RolloutPhase `json:"phase,omitempty"` + // Message provides details on why the rollout is in its current phase + Message string `json:"message,omitempty"` } type BatchReleaseCanaryStatus struct { diff --git a/rollouts/v1beta1/deployment_types.go b/rollouts/v1beta1/deployment_types.go index 3db5614..5002fd8 100644 --- a/rollouts/v1beta1/deployment_types.go +++ b/rollouts/v1beta1/deployment_types.go @@ -37,6 +37,16 @@ const ( // AdvancedDeploymentControlLabel is label for deployment, // which labels whether the deployment is controlled by advanced-deployment-controller. AdvancedDeploymentControlLabel = "rollouts.kruise.io/controlled-by-advanced-deployment-controller" + + // OriginalDeploymentStrategyAnnotation is annotation for workload in BlueGreen Release, + // it will store the original setting of the workload, which will be used to restore the workload + OriginalDeploymentStrategyAnnotation = "rollouts.kruise.io/original-deployment-strategy" + + // MaxProgressSeconds is the value we set for ProgressDeadlineSeconds + // MaxReadySeconds is the value we set for MinReadySeconds, which is one less than ProgressDeadlineSeconds + // MaxInt32: 2147483647, ≈ 68 years + MaxProgressSeconds = 1<<31 - 1 + MaxReadySeconds = MaxProgressSeconds - 1 ) // DeploymentStrategy is strategy field for Advanced Deployment @@ -59,6 +69,8 @@ const ( PartitionRollingStyle RollingStyleType = "Partition" // CanaryRollingStyle means rolling in canary way, and will create a canary Deployment. CanaryRollingStyle RollingStyleType = "Canary" + // BlueGreenRollingStyle means rolling in blue-green way, and will NOT create a extra Deployment. + BlueGreenRollingStyle RollingStyleType = "BlueGreen" ) // DeploymentExtraStatus is extra status field for Advanced Deployment @@ -74,7 +86,7 @@ type DeploymentExtraStatus struct { } func SetDefaultDeploymentStrategy(strategy *DeploymentStrategy) { - if strategy.RollingStyle == CanaryRollingStyle { + if strategy.RollingStyle != PartitionRollingStyle { return } if strategy.RollingUpdate == nil { diff --git a/rollouts/v1beta1/groupversion_info.go b/rollouts/v1beta1/groupversion_info.go index 06ba388..133352a 100644 --- a/rollouts/v1beta1/groupversion_info.go +++ b/rollouts/v1beta1/groupversion_info.go @@ -20,8 +20,8 @@ limitations under the License. package v1beta1 import ( - "github.com/openkruise/kruise-rollout-api/utils/scheme" "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" ) var ( diff --git a/rollouts/v1beta1/rollout_types.go b/rollouts/v1beta1/rollout_types.go index 5287185..d432910 100644 --- a/rollouts/v1beta1/rollout_types.go +++ b/rollouts/v1beta1/rollout_types.go @@ -17,6 +17,9 @@ limitations under the License. package v1beta1 import ( + "reflect" + + apps "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" @@ -75,6 +78,115 @@ type RolloutStrategy struct { Paused bool `json:"paused,omitempty"` // +optional Canary *CanaryStrategy `json:"canary,omitempty"` + // +optional + BlueGreen *BlueGreenStrategy `json:"blueGreen,omitempty" protobuf:"bytes,1,opt,name=blueGreen"` +} + +// Get the rolling style based on the strategy +func (r *RolloutStrategy) GetRollingStyle() RollingStyleType { + if r.BlueGreen != nil { + return BlueGreenRollingStyle + } + //NOTE - even EnableExtraWorkloadForCanary is true, as long as it is not Deployment, + //we won't do canary release. BatchRelease will treat it as Partiton release + if r.Canary.EnableExtraWorkloadForCanary { + return CanaryRollingStyle + } + return PartitionRollingStyle +} + +// using single field EnableExtraWorkloadForCanary to distinguish partition-style from canary-style +// is not enough, for example, a v1alaph1 Rollout can be converted to v1beta1 Rollout +// with EnableExtraWorkloadForCanary set as true, even the objectRef is cloneset (which doesn't support canary release) +func IsRealPartition(rollout *Rollout) bool { + if rollout.Spec.Strategy.IsEmptyRelease() { + return false + } + estimation := rollout.Spec.Strategy.GetRollingStyle() + if estimation == BlueGreenRollingStyle { + return false + } + targetRef := rollout.Spec.WorkloadRef + if targetRef.APIVersion == apps.SchemeGroupVersion.String() && targetRef.Kind == reflect.TypeOf(apps.Deployment{}).Name() && + estimation == CanaryRollingStyle { + return false + } + return true +} + +// r.GetRollingStyle() == BlueGreenRollingStyle +func (r *RolloutStrategy) IsBlueGreenRelease() bool { + return r.GetRollingStyle() == BlueGreenRollingStyle +} + +// r.GetRollingStyle() == CanaryRollingStyle || r.GetRollingStyle() == PartitionRollingStyle +func (r *RolloutStrategy) IsCanaryStragegy() bool { + return r.GetRollingStyle() == CanaryRollingStyle || r.GetRollingStyle() == PartitionRollingStyle +} + +func (r *RolloutStrategy) IsEmptyRelease() bool { + return r.BlueGreen == nil && r.Canary == nil +} + +// Get the steps based on the rolling style +func (r *RolloutStrategy) GetSteps() []CanaryStep { + switch r.GetRollingStyle() { + case BlueGreenRollingStyle: + return r.BlueGreen.Steps + case CanaryRollingStyle, PartitionRollingStyle: + return r.Canary.Steps + default: + return nil + } +} + +// Get the traffic routing based on the rolling style +func (r *RolloutStrategy) GetTrafficRouting() []TrafficRoutingRef { + switch r.GetRollingStyle() { + case BlueGreenRollingStyle: + return r.BlueGreen.TrafficRoutings + case CanaryRollingStyle, PartitionRollingStyle: + return r.Canary.TrafficRoutings + default: + return nil + } +} + +// Check if there are traffic routings +func (r *RolloutStrategy) HasTrafficRoutings() bool { + return len(r.GetTrafficRouting()) > 0 +} + +// Check the value of DisableGenerateCanaryService +func (r *RolloutStrategy) DisableGenerateCanaryService() bool { + switch r.GetRollingStyle() { + case BlueGreenRollingStyle: + return r.BlueGreen.DisableGenerateCanaryService + case CanaryRollingStyle, PartitionRollingStyle: + return r.Canary.DisableGenerateCanaryService + default: + return false + } +} + +// BlueGreenStrategy defines parameters for Blue Green Release +type BlueGreenStrategy struct { + // Steps define the order of phases to execute release in batches(20%, 40%, 60%, 80%, 100%) + // +optional + Steps []CanaryStep `json:"steps,omitempty"` + // TrafficRoutings support ingress, gateway api and custom network resource(e.g. istio, apisix) to enable more fine-grained traffic routing + // and current only support one TrafficRouting + TrafficRoutings []TrafficRoutingRef `json:"trafficRoutings,omitempty"` + // FailureThreshold indicates how many failed pods can be tolerated in all upgraded pods. + // Only when FailureThreshold are satisfied, Rollout can enter ready state. + // If FailureThreshold is nil, Rollout will use the MaxUnavailable of workload as its + // FailureThreshold. + // Defaults to nil. + FailureThreshold *intstr.IntOrString `json:"failureThreshold,omitempty"` + // TrafficRoutingRef is TrafficRouting's Name + TrafficRoutingRef string `json:"trafficRoutingRef,omitempty"` + // canary service will not be generated if DisableGenerateCanaryService is true + DisableGenerateCanaryService bool `json:"disableGenerateCanaryService,omitempty"` } // CanaryStrategy defines parameters for a Replica Based Canary @@ -101,6 +213,8 @@ type CanaryStrategy struct { EnableExtraWorkloadForCanary bool `json:"enableExtraWorkloadForCanary,omitempty"` // TrafficRoutingRef is TrafficRouting's Name TrafficRoutingRef string `json:"trafficRoutingRef,omitempty"` + // canary service will not be generated if DisableGenerateCanaryService is true + DisableGenerateCanaryService bool `json:"disableGenerateCanaryService,omitempty"` } type PatchPodTemplateMetadata struct { @@ -143,20 +257,48 @@ type TrafficRoutingStrategy struct { // my-header: bar // // +optional - RequestHeaderModifier *gatewayv1beta1.HTTPRequestHeaderFilter `json:"requestHeaderModifier,omitempty"` - // Matches define conditions used for matching the incoming HTTP requests to canary service. - // Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. - // If Gateway API, current only support one match. - // And cannot support both weight and matches, if both are configured, then matches takes precedence. + RequestHeaderModifier *gatewayv1beta1.HTTPHeaderFilter `json:"requestHeaderModifier,omitempty"` + // Matches define conditions used for matching incoming HTTP requests to the canary service. + // Each match is independent, i.e. this rule will be matched as long as **any** one of the matches is satisfied. + // + // It cannot support Traffic (weight-based routing) and Matches simultaneously, if both are configured. + // In such cases, Matches takes precedence. Matches []HttpRouteMatch `json:"matches,omitempty"` } type HttpRouteMatch struct { + // Path specifies a HTTP request path matcher. + // Supported list: + // - Istio: https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPMatchRequest + // - GatewayAPI: If path is defined, the whole HttpRouteMatch will be used as a standalone matcher + // + // +optional + Path *gatewayv1beta1.HTTPPathMatch `json:"path,omitempty"` + // Headers specifies HTTP request header matchers. Multiple match values are // ANDed together, meaning, a request must match all the specified headers // to select the route. + // + // +listType=map + // +listMapKey=name + // +optional // +kubebuilder:validation:MaxItems=16 Headers []gatewayv1beta1.HTTPHeaderMatch `json:"headers,omitempty"` + + // QueryParams specifies HTTP query parameter matchers. Multiple match + // values are ANDed together, meaning, a request must match all the + // specified query parameters to select the route. + // Supported list: + // - Istio: https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPMatchRequest + // - MSE Ingress: https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/annotations-supported-by-mse-ingress-gateways-1 + // Header/Cookie > QueryParams + // - Gateway API + // + // +listType=map + // +listMapKey=name + // +optional + // +kubebuilder:validation:MaxItems=16 + QueryParams []gatewayv1beta1.HTTPQueryParamMatch `json:"queryParams,omitempty"` } // RolloutPause defines a pause stage for a rollout @@ -176,6 +318,9 @@ type RolloutStatus struct { // Canary describes the state of the canary rollout // +optional CanaryStatus *CanaryStatus `json:"canaryStatus,omitempty"` + // BlueGreen describes the state of the blueGreen rollout + // +optional + BlueGreenStatus *BlueGreenStatus `json:"blueGreenStatus,omitempty"` // Conditions a list of conditions a rollout can have. // +optional Conditions []RolloutCondition `json:"conditions,omitempty"` @@ -185,6 +330,10 @@ type RolloutStatus struct { Phase RolloutPhase `json:"phase,omitempty"` // Message provides details on why the rollout is in its current phase Message string `json:"message,omitempty"` + // These two values will be synchronized with the same fileds in CanaryStatus or BlueGreeenStatus + // mainly used to provide info for kubectl get command + CurrentStepIndex int32 `json:"currentStepIndex"` + CurrentStepState CanaryStepState `json:"currentStepState"` } // RolloutCondition describes the state of a rollout at a certain point. @@ -207,6 +356,8 @@ type RolloutCondition struct { type RolloutConditionType string // These are valid conditions of a rollout. +// +//goland:noinspection GoUnusedConst const ( // RolloutConditionProgressing means the rollout is progressing. Progress for a rollout is // considered when a new replica set is created or adopted, when pods scale @@ -229,10 +380,26 @@ const ( // Terminating Reason TerminatingReasonInTerminating = "InTerminating" TerminatingReasonCompleted = "Completed" + + // Finalise Reason + // Finalise when the last batch is released and all pods will update to new version + FinaliseReasonSuccess = "Success" + // Finalise when rollback detected + FinaliseReasonRollback = "Rollback" + // Finalise when Continuous Release detected + FinaliseReasonContinuous = "Continuous" + // Finalise when Rollout is disabling + FinaliseReasonDisalbed = "RolloutDisabled" + // Finalise when Rollout is deleting + FinaliseReasonDelete = "RolloutDeleting" ) -// CanaryStatus status fields that only pertain to the canary rollout -type CanaryStatus struct { +// fields in CommonStatus are shared between canary status and bluegreen status +// if a field is accessed in strategy-agnostic way, e.g. accessed from rollout_progressing.go, or rollout_status.go +// then it can be put into CommonStatus +// if a field is only accessed in strategy-specific way, e.g. accessed from rollout_canary.go or rollout_bluegreen.go +// then it should stay behind with CanaryStatus or BlueGreenStatus +type CommonStatus struct { // observedWorkloadGeneration is the most recent generation observed for this Rollout ref workload generation. ObservedWorkloadGeneration int64 `json:"observedWorkloadGeneration,omitempty"` // ObservedRolloutID will record the newest spec.RolloutID if status.canaryRevision equals to workload.updateRevision @@ -241,27 +408,129 @@ type CanaryStatus struct { RolloutHash string `json:"rolloutHash,omitempty"` // StableRevision indicates the revision of stable pods StableRevision string `json:"stableRevision,omitempty"` + // pod template hash is used as service selector label + PodTemplateHash string `json:"podTemplateHash"` + // CurrentStepIndex defines the current step of the rollout is on. + // +optional + CurrentStepIndex int32 `json:"currentStepIndex"` + // NextStepIndex defines the next step of the rollout is on. + // In normal case, NextStepIndex is equal to CurrentStepIndex + 1 + // If the current step is the last step, NextStepIndex is equal to -1 + // Before the release, NextStepIndex is also equal to -1 + // 0 is not used and won't appear in any case + // It is allowed to patch NextStepIndex by design, + // e.g. if CurrentStepIndex is 2, user can patch NextStepIndex to 3 (if exists) to + // achieve batch jump, or patch NextStepIndex to 1 to implement a re-execution of step 1 + // Patching it with a non-positive value is useless and meaningless, which will be corrected + // in the next reconciliation + NextStepIndex int32 `json:"nextStepIndex"` + // FinalisingStep the step of finalising + FinalisingStep FinalisingStepType `json:"finalisingStep"` + CurrentStepState CanaryStepState `json:"currentStepState"` + Message string `json:"message,omitempty"` + LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` +} + +// CanaryStatus status fields that only pertain to the canary rollout +type CanaryStatus struct { + // must be inline + CommonStatus `json:",inline"` // CanaryRevision is calculated by rollout based on podTemplateHash, and the internal logic flow uses // It may be different from rs podTemplateHash in different k8s versions, so it cannot be used as service selector label CanaryRevision string `json:"canaryRevision"` - // pod template hash is used as service selector label - PodTemplateHash string `json:"podTemplateHash"` // CanaryReplicas the numbers of canary revision pods CanaryReplicas int32 `json:"canaryReplicas"` // CanaryReadyReplicas the numbers of ready canary revision pods CanaryReadyReplicas int32 `json:"canaryReadyReplicas"` - // CurrentStepIndex defines the current step of the rollout is on. If the current step index is null, the - // controller will execute the rollout. - // +optional - CurrentStepIndex int32 `json:"currentStepIndex"` - CurrentStepState CanaryStepState `json:"currentStepState"` - Message string `json:"message,omitempty"` - LastUpdateTime *metav1.Time `json:"lastUpdateTime,omitempty"` +} + +// BlueGreenStatus status fields that only pertain to the blueGreen rollout +type BlueGreenStatus struct { + CommonStatus `json:",inline"` + // UpdatedRevision is calculated by rollout based on podTemplateHash, and the internal logic flow uses + // It may be different from rs podTemplateHash in different k8s versions, so it cannot be used as service selector label + UpdatedRevision string `json:"updatedRevision"` + // UpdatedReplicas the numbers of updated pods + UpdatedReplicas int32 `json:"updatedReplicas"` + // UpdatedReadyReplicas the numbers of updated ready pods + UpdatedReadyReplicas int32 `json:"updatedReadyReplicas"` +} + +// GetSubStatus returns the ethier canary or bluegreen status +func (r *RolloutStatus) GetSubStatus() *CommonStatus { + if r.CanaryStatus == nil && r.BlueGreenStatus == nil { + return nil + } + if r.CanaryStatus != nil { + return &r.CanaryStatus.CommonStatus + } + return &r.BlueGreenStatus.CommonStatus +} + +func (r *RolloutStatus) IsSubStatusEmpty() bool { + return r.CanaryStatus == nil && r.BlueGreenStatus == nil +} + +func (r *RolloutStatus) Clear() { + r.CanaryStatus = nil + r.BlueGreenStatus = nil +} + +//TODO - the following functions seem awkward, is there better way for our case? + +func (r *RolloutStatus) GetCanaryRevision() string { + if r.CanaryStatus != nil { + return r.CanaryStatus.CanaryRevision + } + return r.BlueGreenStatus.UpdatedRevision +} + +func (r *RolloutStatus) SetCanaryRevision(revision string) { + if r.CanaryStatus != nil { + r.CanaryStatus.CanaryRevision = revision + } + if r.BlueGreenStatus != nil { + r.BlueGreenStatus.UpdatedRevision = revision + } +} + +func (r *RolloutStatus) GetCanaryReplicas() int32 { + if r.CanaryStatus != nil { + return r.CanaryStatus.CanaryReplicas + } + return r.BlueGreenStatus.UpdatedReplicas +} + +func (r *RolloutStatus) SetCanaryReplicas(replicas int32) { + if r.CanaryStatus != nil { + r.CanaryStatus.CanaryReplicas = replicas + } + if r.BlueGreenStatus != nil { + r.BlueGreenStatus.UpdatedReplicas = replicas + } +} + +func (r *RolloutStatus) GetCanaryReadyReplicas() int32 { + if r.CanaryStatus != nil { + return r.CanaryStatus.CanaryReadyReplicas + } + return r.BlueGreenStatus.UpdatedReadyReplicas +} + +func (r *RolloutStatus) SetCanaryReadyReplicas(replicas int32) { + if r.CanaryStatus != nil { + r.CanaryStatus.CanaryReadyReplicas = replicas + } + if r.BlueGreenStatus != nil { + r.BlueGreenStatus.UpdatedReadyReplicas = replicas + } } type CanaryStepState string const ( + // the first step, handle some special cases before step upgrade, to prevent traffic loss + CanaryStepStateInit CanaryStepState = "BeforeStepUpgrade" CanaryStepStateUpgrade CanaryStepState = "StepUpgrade" CanaryStepStateTrafficRouting CanaryStepState = "StepTrafficRouting" CanaryStepStateMetricsAnalysis CanaryStepState = "StepMetricsAnalysis" @@ -288,13 +557,39 @@ const ( RolloutPhaseDisabling RolloutPhase = "Disabling" ) +type FinalisingStepType string + +//goland:noinspection GoUnusedConst +const ( + // Route all traffic to new version (for bluegreen) + FinalisingStepRouteTrafficToNew FinalisingStepType = "FinalisingStepRouteTrafficToNew" + // Restore the GatewayAPI/Ingress/Istio + FinalisingStepRouteTrafficToStable FinalisingStepType = "FinalisingStepRouteTrafficToStable" + // Restore the stable Service, i.e. remove corresponding selector + FinalisingStepRestoreStableService FinalisingStepType = "RestoreStableService" + // Remove the Canary Service + FinalisingStepRemoveCanaryService FinalisingStepType = "RemoveCanaryService" + + // Patch Batch Release to scale down (exception: the canary Deployment will be + // scaled down in FinalisingStepTypeDeleteBR step) + // For Both BlueGreenStrategy and CanaryStrategy: + // set workload.pause=false, set workload.partition=0 + FinalisingStepResumeWorkload FinalisingStepType = "ResumeWorkload" + // Delete Batch Release + FinalisingStepReleaseWorkloadControl FinalisingStepType = "ReleaseWorkloadControl" + // All needed work done + FinalisingStepTypeEnd FinalisingStepType = "END" + // Only for debugging use + FinalisingStepWaitEndless FinalisingStepType = "WaitEndless" +) + // +genclient //+kubebuilder:object:root=true //+kubebuilder:subresource:status // +kubebuilder:storageversion // +kubebuilder:printcolumn:name="STATUS",type="string",JSONPath=".status.phase",description="The rollout status phase" -// +kubebuilder:printcolumn:name="CANARY_STEP",type="integer",JSONPath=".status.canaryStatus.currentStepIndex",description="The rollout canary status step" -// +kubebuilder:printcolumn:name="CANARY_STATE",type="string",JSONPath=".status.canaryStatus.currentStepState",description="The rollout canary status step state" +// +kubebuilder:printcolumn:name="CANARY_STEP",type="integer",JSONPath=".status.currentStepIndex",description="The rollout canary status step" +// +kubebuilder:printcolumn:name="CANARY_STATE",type="string",JSONPath=".status.currentStepState",description="The rollout canary status step state" // +kubebuilder:printcolumn:name="MESSAGE",type="string",JSONPath=".status.message",description="The rollout canary status message" // +kubebuilder:printcolumn:name="AGE",type=date,JSONPath=".metadata.creationTimestamp" diff --git a/rollouts/v1beta1/trafficrouting.go b/rollouts/v1beta1/trafficrouting.go index 3cd2c94..ad167c1 100644 --- a/rollouts/v1beta1/trafficrouting.go +++ b/rollouts/v1beta1/trafficrouting.go @@ -21,6 +21,7 @@ type TrafficRoutingRef struct { // Service holds the name of a service which selects pods with stable version and don't select any pods with canary version. Service string `json:"service"` // Optional duration in seconds the traffic provider(e.g. nginx ingress controller) consumes the service, ingress configuration changes gracefully. + // +kubebuilder:default=3 GracePeriodSeconds int32 `json:"gracePeriodSeconds,omitempty"` // Ingress holds Ingress specific configuration to route traffic, e.g. Nginx, Alb. Ingress *IngressTrafficRouting `json:"ingress,omitempty"` diff --git a/rollouts/v1beta1/zz_generated.deepcopy.go b/rollouts/v1beta1/zz_generated.deepcopy.go index 8b327d3..0cbeea3 100644 --- a/rollouts/v1beta1/zz_generated.deepcopy.go +++ b/rollouts/v1beta1/zz_generated.deepcopy.go @@ -2,7 +2,7 @@ // +build !ignore_autogenerated /* -Copyright 2024 The Kruise Authors. +Copyright 2023 The Kruise Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -156,13 +156,60 @@ func (in *BatchReleaseStatus) DeepCopy() *BatchReleaseStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BlueGreenStatus) DeepCopyInto(out *BlueGreenStatus) { + *out = *in + in.CommonStatus.DeepCopyInto(&out.CommonStatus) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BlueGreenStatus. +func (in *BlueGreenStatus) DeepCopy() *BlueGreenStatus { + if in == nil { + return nil + } + out := new(BlueGreenStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BlueGreenStrategy) DeepCopyInto(out *BlueGreenStrategy) { + *out = *in + if in.Steps != nil { + in, out := &in.Steps, &out.Steps + *out = make([]CanaryStep, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.TrafficRoutings != nil { + in, out := &in.TrafficRoutings, &out.TrafficRoutings + *out = make([]TrafficRoutingRef, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FailureThreshold != nil { + in, out := &in.FailureThreshold, &out.FailureThreshold + *out = new(intstr.IntOrString) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BlueGreenStrategy. +func (in *BlueGreenStrategy) DeepCopy() *BlueGreenStrategy { + if in == nil { + return nil + } + out := new(BlueGreenStrategy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CanaryStatus) DeepCopyInto(out *CanaryStatus) { *out = *in - if in.LastUpdateTime != nil { - in, out := &in.LastUpdateTime, &out.LastUpdateTime - *out = (*in).DeepCopy() - } + in.CommonStatus.DeepCopyInto(&out.CommonStatus) } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CanaryStatus. @@ -236,6 +283,25 @@ func (in *CanaryStrategy) DeepCopy() *CanaryStrategy { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CommonStatus) DeepCopyInto(out *CommonStatus) { + *out = *in + if in.LastUpdateTime != nil { + in, out := &in.LastUpdateTime, &out.LastUpdateTime + *out = (*in).DeepCopy() + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CommonStatus. +func (in *CommonStatus) DeepCopy() *CommonStatus { + if in == nil { + return nil + } + out := new(CommonStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DeploymentExtraStatus) DeepCopyInto(out *DeploymentExtraStatus) { *out = *in @@ -295,6 +361,11 @@ func (in *GatewayTrafficRouting) DeepCopy() *GatewayTrafficRouting { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *HttpRouteMatch) DeepCopyInto(out *HttpRouteMatch) { *out = *in + if in.Path != nil { + in, out := &in.Path, &out.Path + *out = new(apisv1beta1.HTTPPathMatch) + (*in).DeepCopyInto(*out) + } if in.Headers != nil { in, out := &in.Headers, &out.Headers *out = make([]apisv1beta1.HTTPHeaderMatch, len(*in)) @@ -302,6 +373,13 @@ func (in *HttpRouteMatch) DeepCopyInto(out *HttpRouteMatch) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.QueryParams != nil { + in, out := &in.QueryParams, &out.QueryParams + *out = make([]apisv1beta1.HTTPQueryParamMatch, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HttpRouteMatch. @@ -545,6 +623,11 @@ func (in *RolloutStatus) DeepCopyInto(out *RolloutStatus) { *out = new(CanaryStatus) (*in).DeepCopyInto(*out) } + if in.BlueGreenStatus != nil { + in, out := &in.BlueGreenStatus, &out.BlueGreenStatus + *out = new(BlueGreenStatus) + (*in).DeepCopyInto(*out) + } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]RolloutCondition, len(*in)) @@ -572,6 +655,11 @@ func (in *RolloutStrategy) DeepCopyInto(out *RolloutStrategy) { *out = new(CanaryStrategy) (*in).DeepCopyInto(*out) } + if in.BlueGreen != nil { + in, out := &in.BlueGreen, &out.BlueGreen + *out = new(BlueGreenStrategy) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RolloutStrategy. @@ -624,7 +712,7 @@ func (in *TrafficRoutingStrategy) DeepCopyInto(out *TrafficRoutingStrategy) { } if in.RequestHeaderModifier != nil { in, out := &in.RequestHeaderModifier, &out.RequestHeaderModifier - *out = new(apisv1beta1.HTTPRequestHeaderFilter) + *out = new(apisv1beta1.HTTPHeaderFilter) (*in).DeepCopyInto(*out) } if in.Matches != nil { diff --git a/schema/openkruise_rollouts_kustomize_schema.json b/schema/openkruise_rollouts_kustomize_schema.json index 17afbf6..5fb7e06 100644 --- a/schema/openkruise_rollouts_kustomize_schema.json +++ b/schema/openkruise_rollouts_kustomize_schema.json @@ -1,5 +1,204 @@ { "definitions": { + "io.kruise.rollouts.v1alpha1.BatchRelease": { + "type": "object", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.BatchReleaseSpec" + }, + "status": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.BatchReleaseStatus" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "BatchRelease", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.BatchReleaseCanaryStatus": { + "type": "object", + "required": [ + "currentBatch" + ], + "properties": { + "batchReadyTime": { + "description": "BatchReadyTime is the ready timestamp of the current batch or the last batch. This field is updated once a batch ready, and the batches[x].pausedSeconds relies on this field to calculate the real-time duration.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "batchState": { + "description": "CurrentBatchState indicates the release state of the current batch.", + "type": "string" + }, + "currentBatch": { + "description": "The current batch the rollout is working on/blocked, it starts from 0", + "type": "integer", + "format": "int32", + "default": 0 + }, + "noNeedUpdateReplicas": { + "description": "the number of pods that no need to rollback in rollback scene.", + "type": "integer", + "format": "int32" + }, + "updatedReadyReplicas": { + "description": "UpdatedReadyReplicas is the number upgraded Pods that have a Ready Condition.", + "type": "integer", + "format": "int32" + }, + "updatedReplicas": { + "description": "UpdatedReplicas is the number of upgraded Pods.", + "type": "integer", + "format": "int32" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "BatchReleaseCanaryStatus", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.BatchReleaseList": { + "description": "BatchReleaseList contains a list of BatchRelease", + "type": "object", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.BatchRelease" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "BatchReleaseList", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.BatchReleaseSpec": { + "description": "BatchReleaseSpec defines how to describe an update between different compRevision", + "type": "object", + "required": [ + "targetReference", + "releasePlan" + ], + "properties": { + "releasePlan": { + "description": "ReleasePlan is the details on how to rollout the resources", + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.ReleasePlan" + }, + "targetReference": { + "description": "TargetRef contains the GVK and name of the workload that we need to upgrade to.", + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.ObjectRef" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "BatchReleaseSpec", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.BatchReleaseStatus": { + "description": "BatchReleaseStatus defines the observed state of a release plan", + "type": "object", + "properties": { + "canaryStatus": { + "description": "CanaryStatus describes the state of the canary rollout.", + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.BatchReleaseCanaryStatus" + }, + "collisionCount": { + "description": "Count of hash collisions for creating canary Deployment. The controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest canary Deployment.", + "type": "integer", + "format": "int32" + }, + "conditions": { + "description": "Conditions represents the observed process state of each phase during executing the release plan.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.RolloutCondition" + } + }, + "observedGeneration": { + "description": "ObservedGeneration is the most recent generation observed for this BatchRelease. It corresponds to this BatchRelease's generation, which is updated on mutation by the API Server, and only if BatchRelease Spec was changed, its generation will increase 1.", + "type": "integer", + "format": "int64" + }, + "observedReleasePlanHash": { + "description": "ObservedReleasePlanHash is a hash code of observed itself spec.releasePlan.", + "type": "string" + }, + "observedRolloutID": { + "description": "ObservedRolloutID is the most recent rollout-id observed for this BatchRelease. If RolloutID was changed, we will restart to roll out from batch 0, to ensure the batch-id and rollout-id labels of Pods are correct.", + "type": "string" + }, + "observedWorkloadReplicas": { + "description": "ObservedWorkloadReplicas is observed replicas of target referenced workload. This field is designed to deal with scaling event during rollout, if this field changed, it means that the workload is scaling during rollout.", + "type": "integer", + "format": "int32" + }, + "phase": { + "description": "Phase is the release plan phase, which indicates the current state of release plan state machine in BatchRelease controller.", + "type": "string" + }, + "stableRevision": { + "description": "StableRevision is the pod-template-hash of stable revision pod template.", + "type": "string" + }, + "updateRevision": { + "description": "UpdateRevision is the pod-template-hash of update revision pod template.", + "type": "string" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "BatchReleaseStatus", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.CanaryStatus": { "description": "CanaryStatus status fields that only pertain to the canary rollout", "type": "object", @@ -109,7 +308,7 @@ }, "requestHeaderModifier": { "description": "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPRequestHeaderFilter" + "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPHeaderFilter" }, "weight": { "description": "Weight indicate how many percentage of traffic the canary pods should receive", @@ -125,6 +324,32 @@ } ] }, + "io.kruise.rollouts.v1alpha1.CanaryStepInfo": { + "description": "CanaryStepInfo indicates the pods for a revision", + "type": "object", + "properties": { + "canaryStepIndex": { + "description": "CanaryStepIndex indicates step this revision", + "type": "integer", + "format": "int32" + }, + "pods": { + "description": "Pods indicates the pods information", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.Pod" + } + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "CanaryStepInfo", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.CanaryStrategy": { "description": "CanaryStrategy defines parameters for a Replica Based Canary", "type": "object", @@ -195,6 +420,59 @@ } ] }, + "io.kruise.rollouts.v1alpha1.DeploymentExtraStatus": { + "description": "DeploymentExtraStatus is extra status field for Advanced Deployment", + "type": "object", + "properties": { + "expectedUpdatedReplicas": { + "description": "ExpectedUpdatedReplicas is an absolute number calculated based on Partition and Deployment.Spec.Replicas, means how many pods are expected be updated under current strategy. This field is designed to avoid users to fall into the details of algorithm for Partition calculation.", + "type": "integer", + "format": "int32" + }, + "updatedReadyReplicas": { + "description": "UpdatedReadyReplicas the number of pods that has been updated and ready.", + "type": "integer", + "format": "int32" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "DeploymentExtraStatus", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.DeploymentStrategy": { + "description": "DeploymentStrategy is strategy field for Advanced Deployment", + "type": "object", + "properties": { + "partition": { + "description": "Partition describe how many Pods should be updated during rollout. We use this field to implement partition-style rolling update.", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString" + }, + "paused": { + "description": "Paused = true will block the upgrade of Pods", + "type": "boolean" + }, + "rollingStyle": { + "description": "RollingStyle define the behavior of rolling for deployment.", + "type": "string" + }, + "rollingUpdate": { + "description": "original deployment strategy rolling update fields", + "$ref": "#/definitions/io.k8s.api.apps.v1.RollingUpdateDeployment" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "DeploymentStrategy", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.GatewayTrafficRouting": { "description": "GatewayTrafficRouting configuration for gateway api", "type": "object", @@ -212,6 +490,32 @@ } ] }, + "io.kruise.rollouts.v1alpha1.HTTPRouteInfo": { + "description": "HTTPRouteInfo indicates information of gateway API", + "type": "object", + "required": [ + "name" + ], + "properties": { + "data": { + "description": "Data indecates the spec of object ref", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension" + }, + "name": { + "description": "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + "type": "string", + "default": "" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "HTTPRouteInfo", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.HttpRouteMatch": { "type": "object", "properties": { @@ -232,6 +536,32 @@ } ] }, + "io.kruise.rollouts.v1alpha1.IngressInfo": { + "description": "IngressInfo indicates information of the ingress related", + "type": "object", + "required": [ + "name" + ], + "properties": { + "data": { + "description": "Data indecates the spec of object ref", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension" + }, + "name": { + "description": "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + "type": "string", + "default": "" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "IngressInfo", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.IngressTrafficRouting": { "description": "IngressTrafficRouting configuration for ingress controller to control traffic routing", "type": "object", @@ -257,6 +587,31 @@ } ] }, + "io.kruise.rollouts.v1alpha1.NameAndSpecData": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "data": { + "description": "Data indecates the spec of object ref", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension" + }, + "name": { + "description": "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + "type": "string", + "default": "" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "NameAndSpecData", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.ObjectRef": { "type": "object", "properties": { @@ -301,6 +656,106 @@ } ] }, + "io.kruise.rollouts.v1alpha1.Pod": { + "description": "Pod indicates the information of a pod, including name, ip, node_name.", + "type": "object", + "properties": { + "ip": { + "description": "IP indicates the pod ip", + "type": "string" + }, + "name": { + "description": "Name indicates the node name", + "type": "string" + }, + "nodeName": { + "description": "NodeName indicates the node which pod is located at", + "type": "string" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "Pod", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.ReleaseBatch": { + "description": "ReleaseBatch is used to describe how each batch release should be", + "type": "object", + "required": [ + "canaryReplicas" + ], + "properties": { + "canaryReplicas": { + "description": "CanaryReplicas is the number of upgraded pods that should have in this batch. it can be an absolute number (ex: 5) or a percentage of workload replicas. batches[i].canaryReplicas should less than or equal to batches[j].canaryReplicas if i \u003c j.", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "ReleaseBatch", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.ReleasePlan": { + "description": "ReleasePlan fines the details of the release plan", + "type": "object", + "required": [ + "enableExtraWorkloadForCanary" + ], + "properties": { + "batchPartition": { + "description": "All pods in the batches up to the batchPartition (included) will have the target resource specification while the rest still is the stable revision. This is designed for the operators to manually rollout. Default is nil, which means no partition and will release all batches. BatchPartition start from 0.", + "type": "integer", + "format": "int32" + }, + "batches": { + "description": "Batches is the details on each batch of the ReleasePlan. Users can specify their batch plan in this field, such as: batches: - canaryReplicas: 1 # batches 0 - canaryReplicas: 2 # batches 1 - canaryReplicas: 5 # batches 2 Not that these canaryReplicas should be a non-decreasing sequence.", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.ReleaseBatch" + } + }, + "enableExtraWorkloadForCanary": { + "description": "EnableExtraWorkloadForCanary indicates whether to create extra workload for canary True corresponds to RollingStyle \"Canary\". False corresponds to RollingStyle \"Partiton\". Ignored in BlueGreen-style. This field is about to deprecate, use RollingStyle instead. If both of them are set, controller will only consider this filed when RollingStyle is empty", + "type": "boolean", + "default": false + }, + "failureThreshold": { + "description": "FailureThreshold indicates how many failed pods can be tolerated in all upgraded pods. Only when FailureThreshold are satisfied, Rollout can enter ready state. If FailureThreshold is nil, Rollout will use the MaxUnavailable of workload as its FailureThreshold. Defaults to nil.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString" + }, + "finalizingPolicy": { + "description": "FinalizingPolicy define the behavior of controller when phase enter Finalizing Defaults to \"Immediate\"", + "type": "string" + }, + "patchPodTemplateMetadata": { + "description": "PatchPodTemplateMetadata indicates patch configuration(e.g. labels, annotations) to the canary deployment podTemplateSpec.metadata only support for canary deployment", + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.PatchPodTemplateMetadata" + }, + "rollingStyle": { + "description": "RollingStyle can be \"Canary\", \"Partiton\" or \"BlueGreen\"", + "type": "string" + }, + "rolloutID": { + "description": "RolloutID indicates an id for each rollout progress", + "type": "string" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "ReleasePlan", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.Rollout": { "description": "Rollout is the Schema for the rollouts API", "type": "object", @@ -383,6 +838,164 @@ } ] }, + "io.kruise.rollouts.v1alpha1.RolloutHistory": { + "description": "RolloutHistory is the Schema for the rollouthistories API", + "type": "object", + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.RolloutHistorySpec" + }, + "status": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.RolloutHistoryStatus" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "RolloutHistory", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.RolloutHistoryList": { + "description": "RolloutHistoryList contains a list of RolloutHistory", + "type": "object", + "required": [ + "items" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "items": { + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.RolloutHistory" + } + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "metadata": { + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "RolloutHistoryList", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.RolloutHistorySpec": { + "description": "RolloutHistorySpec defines the desired state of RolloutHistory", + "type": "object", + "properties": { + "rollout": { + "description": "Rollout indicates information of the rollout related with rollouthistory", + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.RolloutInfo" + }, + "service": { + "description": "Service indicates information of the service related with workload", + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.ServiceInfo" + }, + "trafficRouting": { + "description": "TrafficRouting indicates information of traffic route related with workload", + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.TrafficRoutingInfo" + }, + "workload": { + "description": "Workload indicates information of the workload, such as cloneset, deployment, advanced statefulset", + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.WorkloadInfo" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "RolloutHistorySpec", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.RolloutHistoryStatus": { + "description": "RolloutHistoryStatus defines the observed state of RolloutHistory", + "type": "object", + "properties": { + "canarySteps": { + "description": "CanarySteps indicates the pods released each step", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.CanaryStepInfo" + } + }, + "phase": { + "description": "Phase indicates phase of RolloutHistory, just \"\" or \"completed\"", + "type": "string" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "RolloutHistoryStatus", + "version": "v1alpha1" + } + ] + }, + "io.kruise.rollouts.v1alpha1.RolloutInfo": { + "description": "RolloutInfo indicates information of the rollout related", + "type": "object", + "required": [ + "rolloutID", + "name" + ], + "properties": { + "data": { + "description": "Data indecates the spec of object ref", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension" + }, + "name": { + "description": "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + "type": "string", + "default": "" + }, + "rolloutID": { + "description": "RolloutID indicates the new rollout if there is no new RolloutID this time, ignore it and not execute RolloutHistory", + "type": "string", + "default": "" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "RolloutInfo", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.RolloutList": { "description": "RolloutList contains a list of Rollout", "type": "object", @@ -531,6 +1144,32 @@ } ] }, + "io.kruise.rollouts.v1alpha1.ServiceInfo": { + "description": "ServiceInfo indicates information of the service related", + "type": "object", + "required": [ + "name" + ], + "properties": { + "data": { + "description": "Data indecates the spec of object ref", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension" + }, + "name": { + "description": "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + "type": "string", + "default": "" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "ServiceInfo", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.TrafficRouting": { "description": "TrafficRouting is the Schema for the TrafficRoutings API", "type": "object", @@ -564,6 +1203,27 @@ } ] }, + "io.kruise.rollouts.v1alpha1.TrafficRoutingInfo": { + "description": "TrafficRoutingInfo indicates information of Gateway API or Ingress", + "type": "object", + "properties": { + "httpRoute": { + "description": "HTTPRouteRef indacates information of Gateway API", + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.HTTPRouteInfo" + }, + "ingress": { + "description": "IngressRef indicates information of ingress", + "$ref": "#/definitions/io.kruise.rollouts.v1alpha1.IngressInfo" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "TrafficRoutingInfo", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.TrafficRoutingList": { "description": "TrafficRoutingList contains a list of TrafficRouting", "type": "object", @@ -708,7 +1368,7 @@ }, "requestHeaderModifier": { "description": "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPRequestHeaderFilter" + "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPHeaderFilter" }, "weight": { "description": "Weight indicate how many percentage of traffic the canary pods should receive", @@ -724,6 +1384,40 @@ } ] }, + "io.kruise.rollouts.v1alpha1.WorkloadInfo": { + "description": "WorkloadInfo indicates information of the workload, such as cloneset, deployment, advanced statefulset", + "type": "object", + "required": [ + "name" + ], + "properties": { + "apiVersion": { + "description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + "type": "string" + }, + "data": { + "description": "Data indecates the spec of object ref", + "default": {}, + "$ref": "#/definitions/io.k8s.apimachinery.pkg.runtime.RawExtension" + }, + "kind": { + "description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "type": "string" + }, + "name": { + "description": "Name indicates the name of object ref, such as rollout name, workload name, ingress name, etc.", + "type": "string", + "default": "" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "WorkloadInfo", + "version": "v1alpha1" + } + ] + }, "io.kruise.rollouts.v1alpha1.WorkloadRef": { "description": "WorkloadRef holds a references to the Kubernetes object", "type": "object", @@ -916,6 +1610,10 @@ "$ref": "#/definitions/io.kruise.rollouts.v1beta1.RolloutCondition" } }, + "message": { + "description": "Message provides details on why the rollout is in its current phase", + "type": "string" + }, "observedGeneration": { "description": "ObservedGeneration is the most recent generation observed for this BatchRelease. It corresponds to this BatchRelease's generation, which is updated on mutation by the API Server, and only if BatchRelease Spec was changed, its generation will increase 1.", "type": "integer", @@ -955,15 +1653,146 @@ } ] }, + "io.kruise.rollouts.v1beta1.BlueGreenStatus": { + "description": "BlueGreenStatus status fields that only pertain to the blueGreen rollout", + "type": "object", + "required": [ + "podTemplateHash", + "nextStepIndex", + "finalisingStep", + "currentStepState", + "updatedRevision", + "updatedReplicas", + "updatedReadyReplicas" + ], + "properties": { + "currentStepIndex": { + "description": "CurrentStepIndex defines the current step of the rollout is on.", + "type": "integer", + "format": "int32", + "default": 0 + }, + "currentStepState": { + "type": "string", + "default": "" + }, + "finalisingStep": { + "description": "FinalisingStep the step of finalising", + "type": "string", + "default": "" + }, + "lastUpdateTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "message": { + "type": "string" + }, + "nextStepIndex": { + "description": "NextStepIndex defines the next step of the rollout is on. In normal case, NextStepIndex is equal to CurrentStepIndex + 1 If the current step is the last step, NextStepIndex is equal to -1 Before the release, NextStepIndex is also equal to -1 0 is not used and won't appear in any case It is allowed to patch NextStepIndex by design, e.g. if CurrentStepIndex is 2, user can patch NextStepIndex to 3 (if exists) to achieve batch jump, or patch NextStepIndex to 1 to implement a re-execution of step 1 Patching it with a non-positive value is useless and meaningless, which will be corrected in the next reconciliation", + "type": "integer", + "format": "int32", + "default": 0 + }, + "observedRolloutID": { + "description": "ObservedRolloutID will record the newest spec.RolloutID if status.canaryRevision equals to workload.updateRevision", + "type": "string" + }, + "observedWorkloadGeneration": { + "description": "observedWorkloadGeneration is the most recent generation observed for this Rollout ref workload generation.", + "type": "integer", + "format": "int64" + }, + "podTemplateHash": { + "description": "pod template hash is used as service selector label", + "type": "string", + "default": "" + }, + "rolloutHash": { + "description": "RolloutHash from rollout.spec object", + "type": "string" + }, + "stableRevision": { + "description": "StableRevision indicates the revision of stable pods", + "type": "string" + }, + "updatedReadyReplicas": { + "description": "UpdatedReadyReplicas the numbers of updated ready pods", + "type": "integer", + "format": "int32", + "default": 0 + }, + "updatedReplicas": { + "description": "UpdatedReplicas the numbers of updated pods", + "type": "integer", + "format": "int32", + "default": 0 + }, + "updatedRevision": { + "description": "UpdatedRevision is calculated by rollout based on podTemplateHash, and the internal logic flow uses It may be different from rs podTemplateHash in different k8s versions, so it cannot be used as service selector label", + "type": "string", + "default": "" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "BlueGreenStatus", + "version": "v1beta1" + } + ] + }, + "io.kruise.rollouts.v1beta1.BlueGreenStrategy": { + "description": "BlueGreenStrategy defines parameters for Blue Green Release", + "type": "object", + "properties": { + "disableGenerateCanaryService": { + "description": "canary service will not be generated if DisableGenerateCanaryService is true", + "type": "boolean" + }, + "failureThreshold": { + "description": "FailureThreshold indicates how many failed pods can be tolerated in all upgraded pods. Only when FailureThreshold are satisfied, Rollout can enter ready state. If FailureThreshold is nil, Rollout will use the MaxUnavailable of workload as its FailureThreshold. Defaults to nil.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.util.intstr.IntOrString" + }, + "steps": { + "description": "Steps define the order of phases to execute release in batches(20%, 40%, 60%, 80%, 100%)", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1beta1.CanaryStep" + } + }, + "trafficRoutingRef": { + "description": "TrafficRoutingRef is TrafficRouting's Name", + "type": "string" + }, + "trafficRoutings": { + "description": "TrafficRoutings support ingress, gateway api and custom network resource(e.g. istio, apisix) to enable more fine-grained traffic routing and current only support one TrafficRouting", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.kruise.rollouts.v1beta1.TrafficRoutingRef" + } + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "BlueGreenStrategy", + "version": "v1beta1" + } + ] + }, "io.kruise.rollouts.v1beta1.CanaryStatus": { "description": "CanaryStatus status fields that only pertain to the canary rollout", "type": "object", "required": [ - "canaryRevision", "podTemplateHash", + "nextStepIndex", + "finalisingStep", + "currentStepState", + "canaryRevision", "canaryReplicas", - "canaryReadyReplicas", - "currentStepState" + "canaryReadyReplicas" ], "properties": { "canaryReadyReplicas": { @@ -984,7 +1813,7 @@ "default": "" }, "currentStepIndex": { - "description": "CurrentStepIndex defines the current step of the rollout is on. If the current step index is null, the controller will execute the rollout.", + "description": "CurrentStepIndex defines the current step of the rollout is on.", "type": "integer", "format": "int32", "default": 0 @@ -993,12 +1822,23 @@ "type": "string", "default": "" }, + "finalisingStep": { + "description": "FinalisingStep the step of finalising", + "type": "string", + "default": "" + }, "lastUpdateTime": { "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" }, "message": { "type": "string" }, + "nextStepIndex": { + "description": "NextStepIndex defines the next step of the rollout is on. In normal case, NextStepIndex is equal to CurrentStepIndex + 1 If the current step is the last step, NextStepIndex is equal to -1 Before the release, NextStepIndex is also equal to -1 0 is not used and won't appear in any case It is allowed to patch NextStepIndex by design, e.g. if CurrentStepIndex is 2, user can patch NextStepIndex to 3 (if exists) to achieve batch jump, or patch NextStepIndex to 1 to implement a re-execution of step 1 Patching it with a non-positive value is useless and meaningless, which will be corrected in the next reconciliation", + "type": "integer", + "format": "int32", + "default": 0 + }, "observedRolloutID": { "description": "ObservedRolloutID will record the newest spec.RolloutID if status.canaryRevision equals to workload.updateRevision", "type": "string" @@ -1035,7 +1875,7 @@ "type": "object", "properties": { "matches": { - "description": "Matches define conditions used for matching the incoming HTTP requests to canary service. Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. If Gateway API, current only support one match. And cannot support both weight and matches, if both are configured, then matches takes precedence.", + "description": "Matches define conditions used for matching incoming HTTP requests to the canary service. Each match is independent, i.e. this rule will be matched as long as **any** one of the matches is satisfied.\n\nIt cannot support Traffic (weight-based routing) and Matches simultaneously, if both are configured. In such cases, Matches takes precedence.", "type": "array", "items": { "default": {}, @@ -1053,7 +1893,7 @@ }, "requestHeaderModifier": { "description": "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPRequestHeaderFilter" + "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPHeaderFilter" }, "traffic": { "description": "Traffic indicate how many percentage of traffic the canary pods should receive Value is of string type and is a percentage, e.g. 5%.", @@ -1072,6 +1912,10 @@ "description": "CanaryStrategy defines parameters for a Replica Based Canary", "type": "object", "properties": { + "disableGenerateCanaryService": { + "description": "canary service will not be generated if DisableGenerateCanaryService is true", + "type": "boolean" + }, "enableExtraWorkloadForCanary": { "description": "If true, then it will create new deployment for canary, such as: workload-demo-canary. When user verifies that the canary version is ready, we will remove the canary deployment and release the deployment workload-demo in full. Current only support k8s native deployment", "type": "boolean" @@ -1113,6 +1957,74 @@ } ] }, + "io.kruise.rollouts.v1beta1.CommonStatus": { + "description": "fields in CommonStatus are shared between canary status and bluegreen status if a field is accessed in strategy-agnostic way, e.g. accessed from rollout_progressing.go, or rollout_status.go then it can be put into CommonStatus if a field is only accessed in strategy-specific way, e.g. accessed from rollout_canary.go or rollout_bluegreen.go then it should stay behind with CanaryStatus or BlueGreenStatus", + "type": "object", + "required": [ + "podTemplateHash", + "nextStepIndex", + "finalisingStep", + "currentStepState" + ], + "properties": { + "currentStepIndex": { + "description": "CurrentStepIndex defines the current step of the rollout is on.", + "type": "integer", + "format": "int32", + "default": 0 + }, + "currentStepState": { + "type": "string", + "default": "" + }, + "finalisingStep": { + "description": "FinalisingStep the step of finalising", + "type": "string", + "default": "" + }, + "lastUpdateTime": { + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "message": { + "type": "string" + }, + "nextStepIndex": { + "description": "NextStepIndex defines the next step of the rollout is on. In normal case, NextStepIndex is equal to CurrentStepIndex + 1 If the current step is the last step, NextStepIndex is equal to -1 Before the release, NextStepIndex is also equal to -1 0 is not used and won't appear in any case It is allowed to patch NextStepIndex by design, e.g. if CurrentStepIndex is 2, user can patch NextStepIndex to 3 (if exists) to achieve batch jump, or patch NextStepIndex to 1 to implement a re-execution of step 1 Patching it with a non-positive value is useless and meaningless, which will be corrected in the next reconciliation", + "type": "integer", + "format": "int32", + "default": 0 + }, + "observedRolloutID": { + "description": "ObservedRolloutID will record the newest spec.RolloutID if status.canaryRevision equals to workload.updateRevision", + "type": "string" + }, + "observedWorkloadGeneration": { + "description": "observedWorkloadGeneration is the most recent generation observed for this Rollout ref workload generation.", + "type": "integer", + "format": "int64" + }, + "podTemplateHash": { + "description": "pod template hash is used as service selector label", + "type": "string", + "default": "" + }, + "rolloutHash": { + "description": "RolloutHash from rollout.spec object", + "type": "string" + }, + "stableRevision": { + "description": "StableRevision indicates the revision of stable pods", + "type": "string" + } + }, + "x-kubernetes-group-version-kind": [ + { + "group": "rollouts.kruise.io", + "kind": "CommonStatus", + "version": "v1beta1" + } + ] + }, "io.kruise.rollouts.v1beta1.DeploymentExtraStatus": { "description": "DeploymentExtraStatus is extra status field for Advanced Deployment", "type": "object", @@ -1192,7 +2104,27 @@ "items": { "default": {}, "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPHeaderMatch" - } + }, + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, + "path": { + "description": "Path specifies a HTTP request path matcher. Supported list: - Istio: https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPMatchRequest - GatewayAPI: If path is defined, the whole HttpRouteMatch will be used as a standalone matcher", + "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPPathMatch" + }, + "queryParams": { + "description": "QueryParams specifies HTTP query parameter matchers. Multiple match values are ANDed together, meaning, a request must match all the specified query parameters to select the route. Supported list: - Istio: https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPMatchRequest - MSE Ingress: https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/annotations-supported-by-mse-ingress-gateways-1\n Header/Cookie \u003e QueryParams\n- Gateway API", + "type": "array", + "items": { + "default": {}, + "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPQueryParamMatch" + }, + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" } }, "x-kubernetes-group-version-kind": [ @@ -1331,7 +2263,7 @@ } }, "enableExtraWorkloadForCanary": { - "description": "If true, then it will create new deployment for canary, such as: workload-demo-canary. When user verifies that the canary version is ready, we will remove the canary deployment and release the deployment workload-demo in full. Current only support k8s native deployment", + "description": "EnableExtraWorkloadForCanary indicates whether to create extra workload for canary True corresponds to RollingStyle \"Canary\". False corresponds to RollingStyle \"Partiton\". Ignored in BlueGreen-style. This field is about to deprecate, use RollingStyle instead. If both of them are set, controller will only consider this filed when RollingStyle is empty", "type": "boolean", "default": false }, @@ -1347,6 +2279,10 @@ "description": "PatchPodTemplateMetadata indicates patch configuration(e.g. labels, annotations) to the canary deployment podTemplateSpec.metadata only support for canary deployment", "$ref": "#/definitions/io.kruise.rollouts.v1beta1.PatchPodTemplateMetadata" }, + "rollingStyle": { + "description": "RollingStyle can be \"Canary\", \"Partiton\" or \"BlueGreen\"", + "type": "string" + }, "rolloutID": { "description": "RolloutID indicates an id for each rollout progress", "type": "string" @@ -1531,7 +2467,15 @@ "io.kruise.rollouts.v1beta1.RolloutStatus": { "description": "RolloutStatus defines the observed state of Rollout", "type": "object", + "required": [ + "currentStepIndex", + "currentStepState" + ], "properties": { + "blueGreenStatus": { + "description": "BlueGreen describes the state of the blueGreen rollout", + "$ref": "#/definitions/io.kruise.rollouts.v1beta1.BlueGreenStatus" + }, "canaryStatus": { "description": "Canary describes the state of the canary rollout", "$ref": "#/definitions/io.kruise.rollouts.v1beta1.CanaryStatus" @@ -1544,6 +2488,16 @@ "$ref": "#/definitions/io.kruise.rollouts.v1beta1.RolloutCondition" } }, + "currentStepIndex": { + "description": "These two values will be synchronized with the same fileds in CanaryStatus or BlueGreeenStatus mainly used to provide info for kubectl get command", + "type": "integer", + "format": "int32", + "default": 0 + }, + "currentStepState": { + "type": "string", + "default": "" + }, "message": { "description": "Message provides details on why the rollout is in its current phase", "type": "string" @@ -1570,6 +2524,9 @@ "description": "RolloutStrategy defines strategy to apply during next rollout", "type": "object", "properties": { + "blueGreen": { + "$ref": "#/definitions/io.kruise.rollouts.v1beta1.BlueGreenStrategy" + }, "canary": { "$ref": "#/definitions/io.kruise.rollouts.v1beta1.CanaryStrategy" }, @@ -1632,7 +2589,7 @@ "type": "object", "properties": { "matches": { - "description": "Matches define conditions used for matching the incoming HTTP requests to canary service. Each match is independent, i.e. this rule will be matched if **any** one of the matches is satisfied. If Gateway API, current only support one match. And cannot support both weight and matches, if both are configured, then matches takes precedence.", + "description": "Matches define conditions used for matching incoming HTTP requests to the canary service. Each match is independent, i.e. this rule will be matched as long as **any** one of the matches is satisfied.\n\nIt cannot support Traffic (weight-based routing) and Matches simultaneously, if both are configured. In such cases, Matches takes precedence.", "type": "array", "items": { "default": {}, @@ -1641,7 +2598,7 @@ }, "requestHeaderModifier": { "description": "Set overwrites the request with the given header (name, value) before the action.\n\nInput:\n GET /foo HTTP/1.1\n my-header: foo\n\nrequestHeaderModifier:\n set:\n - name: \"my-header\"\n value: \"bar\"\n\nOutput:\n GET /foo HTTP/1.1\n my-header: bar", - "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPRequestHeaderFilter" + "$ref": "#/definitions/io.k8s.sigs.gateway-api.apis.v1beta1.HTTPHeaderFilter" }, "traffic": { "description": "Traffic indicate how many percentage of traffic the canary pods should receive Value is of string type and is a percentage, e.g. 5%.",