diff --git a/.circleci/config.yml b/.circleci/config.yml index 1c70eccd..354e8a0a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,7 +7,7 @@ jobs: build: working_directory: /go/pkg/mod/github.com/admiral docker: - - image: circleci/golang:1.16 + - image: circleci/golang:1.17 steps: - checkout - run: @@ -107,7 +107,7 @@ jobs: ./run.sh "1.20.14" "1.12.2" "../out" publish-github-release: docker: - - image: circleci/golang:1.16 + - image: circleci/golang:1.17 working_directory: /go/pkg/mod/github.com/admiral steps: - attach_workspace: diff --git a/Jenkinsfile.iks2 b/Jenkinsfile.iks2 index 9fa72f27..7e07d765 100644 --- a/Jenkinsfile.iks2 +++ b/Jenkinsfile.iks2 @@ -29,7 +29,7 @@ pipeline { environment { GO_INSTALL = "/go_install" - GO_VERSION = "1.13.5.linux-amd64" + GO_VERSION = "1.18.linux-amd64" GOROOT = "${env.GO_INSTALL + '/go'}" GOPRIVATE="github.intuit.com" PATH = "${env.PATH + ':' + env.GOROOT + '/bin'}" diff --git a/admiral/pkg/apis/admiral/routes/handler_test.go b/admiral/pkg/apis/admiral/routes/handler_test.go index ab227f4f..dbe573b6 100644 --- a/admiral/pkg/apis/admiral/routes/handler_test.go +++ b/admiral/pkg/apis/admiral/routes/handler_test.go @@ -2,6 +2,7 @@ package routes import ( "bytes" + "context" "encoding/json" "io/ioutil" "net/http/httptest" @@ -17,7 +18,7 @@ import ( "github.com/stretchr/testify/assert" "istio.io/client-go/pkg/apis/networking/v1alpha3" istiofake "istio.io/client-go/pkg/clientset/versioned/fake" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func TestReturnSuccessGET(t *testing.T) { @@ -96,6 +97,7 @@ func TestGetClusters(t *testing.T) { } func TestGetServiceEntriesByCluster(t *testing.T) { + ctx := context.Background() url := "https://admiral.com/cluster/cluster1/serviceentries" opts := RouteOpts{ RemoteRegistry: clusters.NewRemoteRegistry(nil, common.AdmiralParams{}), @@ -161,7 +163,7 @@ func TestGetServiceEntriesByCluster(t *testing.T) { } opts.RemoteRegistry = rr if c.name == "success with service entry for cluster" { - fakeIstioClient.NetworkingV1alpha3().ServiceEntries("admiral-sync").Create(&v1alpha3.ServiceEntry{}) + fakeIstioClient.NetworkingV1alpha3().ServiceEntries("admiral-sync").Create(ctx, &v1alpha3.ServiceEntry{}, metaV1.CreateOptions{}) } opts.GetServiceEntriesByCluster(w, r) resp := w.Result() @@ -233,14 +235,14 @@ func TestGetGlobalTrafficPolicyByIdentityAndEnv(t *testing.T) { globalTrafficCache := &mockGlobalTrafficCache{ identityCache: map[string]*v1.GlobalTrafficPolicy{ "stage.testID": { - ObjectMeta: meta_v1.ObjectMeta{ + ObjectMeta: metaV1.ObjectMeta{ Namespace: "stage-testns", Name: "stage-testapp", Labels: map[string]string{"identity": "testID", "admiral.io/env": "stage"}, }, }, "default.testID": { - ObjectMeta: meta_v1.ObjectMeta{ + ObjectMeta: metaV1.ObjectMeta{ Namespace: "default-testns", Name: "default-testapp", Labels: map[string]string{"identity": "testID", "admiral.io/env": "stage"}, diff --git a/admiral/pkg/apis/admiral/routes/handlers.go b/admiral/pkg/apis/admiral/routes/handlers.go index d1ef8a58..345d5adb 100644 --- a/admiral/pkg/apis/admiral/routes/handlers.go +++ b/admiral/pkg/apis/admiral/routes/handlers.go @@ -103,11 +103,13 @@ func (opts *RouteOpts) GetServiceEntriesByCluster(w http.ResponseWriter, r *http params := mux.Vars(r) clusterName := strings.Trim(params["clustername"], " ") - var response []v1alpha3.ServiceEntry + var response []*v1alpha3.ServiceEntry + + ctx := r.Context() if clusterName != "" { - serviceEntriesByCluster, err := clusters.GetServiceEntriesByCluster(clusterName, opts.RemoteRegistry) + serviceEntriesByCluster, err := clusters.GetServiceEntriesByCluster(ctx, clusterName, opts.RemoteRegistry) if err != nil { log.Printf("API call get service entry by cluster failed for clustername %v with Error: %v", clusterName, err.Error()) diff --git a/admiral/pkg/apis/admiral/v1/zz_generated.deepcopy.go b/admiral/pkg/apis/admiral/v1/zz_generated.deepcopy.go index 034807e9..df3933f2 100644 --- a/admiral/pkg/apis/admiral/v1/zz_generated.deepcopy.go +++ b/admiral/pkg/apis/admiral/v1/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated /* diff --git a/admiral/pkg/client/clientset/versioned/clientset.go b/admiral/pkg/client/clientset/versioned/clientset.go index 81473073..e41fbf87 100644 --- a/admiral/pkg/client/clientset/versioned/clientset.go +++ b/admiral/pkg/client/clientset/versioned/clientset.go @@ -20,6 +20,8 @@ package versioned import ( "fmt" + "log" + "net/http" admiralv1 "github.com/istio-ecosystem/admiral/admiral/pkg/client/clientset/versioned/typed/admiral/v1" discovery "k8s.io/client-go/discovery" @@ -55,22 +57,45 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface { // NewForConfig creates a new Clientset for the given config. // If config's RateLimiter is not set and QPS and Burst are acceptable, // NewForConfig will generate a rate-limiter in configShallowCopy. +// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), +// where httpClient was generated with rest.HTTPClientFor(c). func NewForConfig(c *rest.Config) (*Clientset, error) { configShallowCopy := *c + + if configShallowCopy.UserAgent == "" { + configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent() + } + + // share the transport between all clients + httpClient, err := rest.HTTPClientFor(&configShallowCopy) + if err != nil { + return nil, err + } + + return NewForConfigAndClient(&configShallowCopy, httpClient) +} + +// NewForConfigAndClient creates a new Clientset for the given config and http client. +// Note the http client provided takes precedence over the configured transport values. +// If config's RateLimiter is not set and QPS and Burst are acceptable, +// NewForConfigAndClient will generate a rate-limiter in configShallowCopy. +func NewForConfigAndClient(c *rest.Config, httpClient *http.Client) (*Clientset, error) { + configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { if configShallowCopy.Burst <= 0 { - return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") + return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0") } configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) } + var cs Clientset var err error - cs.admiralV1, err = admiralv1.NewForConfig(&configShallowCopy) + cs.admiralV1, err = admiralv1.NewForConfigAndClient(&configShallowCopy, httpClient) if err != nil { return nil, err } - cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) + cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfigAndClient(&configShallowCopy, httpClient) if err != nil { return nil, err } @@ -80,11 +105,11 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // NewForConfigOrDie creates a new Clientset for the given config and // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { - var cs Clientset - cs.admiralV1 = admiralv1.NewForConfigOrDie(c) - - cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) - return &cs + cs, err := NewForConfig(c) + if err != nil { + log.Fatal(err) + } + return cs } // New creates a new Clientset for the given RESTClient. diff --git a/admiral/pkg/client/clientset/versioned/fake/clientset_generated.go b/admiral/pkg/client/clientset/versioned/fake/clientset_generated.go index edab5fa7..728dbc59 100644 --- a/admiral/pkg/client/clientset/versioned/fake/clientset_generated.go +++ b/admiral/pkg/client/clientset/versioned/fake/clientset_generated.go @@ -74,7 +74,10 @@ func (c *Clientset) Tracker() testing.ObjectTracker { return c.tracker } -var _ clientset.Interface = &Clientset{} +var ( + _ clientset.Interface = &Clientset{} + _ testing.FakeClient = &Clientset{} +) // AdmiralV1 retrieves the AdmiralV1Client func (c *Clientset) AdmiralV1() admiralv1.AdmiralV1Interface { diff --git a/admiral/pkg/client/clientset/versioned/fake/register.go b/admiral/pkg/client/clientset/versioned/fake/register.go index 5fd36869..c4b33625 100644 --- a/admiral/pkg/client/clientset/versioned/fake/register.go +++ b/admiral/pkg/client/clientset/versioned/fake/register.go @@ -29,7 +29,7 @@ import ( var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) -var parameterCodec = runtime.NewParameterCodec(scheme) + var localSchemeBuilder = runtime.SchemeBuilder{ admiralv1.AddToScheme, } diff --git a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/admiral_client.go b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/admiral_client.go index a6d89eba..3c6f1dde 100644 --- a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/admiral_client.go +++ b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/admiral_client.go @@ -19,6 +19,8 @@ limitations under the License. package v1 import ( + "net/http" + v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/client/clientset/versioned/scheme" rest "k8s.io/client-go/rest" @@ -49,12 +51,28 @@ func (c *AdmiralV1Client) RoutingPolicies(namespace string) RoutingPolicyInterfa } // NewForConfig creates a new AdmiralV1Client for the given config. +// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), +// where httpClient was generated with rest.HTTPClientFor(c). func NewForConfig(c *rest.Config) (*AdmiralV1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err } - client, err := rest.RESTClientFor(&config) + httpClient, err := rest.HTTPClientFor(&config) + if err != nil { + return nil, err + } + return NewForConfigAndClient(&config, httpClient) +} + +// NewForConfigAndClient creates a new AdmiralV1Client for the given config and http client. +// Note the http client provided takes precedence over the configured transport values. +func NewForConfigAndClient(c *rest.Config, h *http.Client) (*AdmiralV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientForConfigAndClient(&config, h) if err != nil { return nil, err } diff --git a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/dependency.go b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/dependency.go index 7433bcce..8b533c0b 100644 --- a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/dependency.go +++ b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/dependency.go @@ -19,6 +19,7 @@ limitations under the License. package v1 import ( + "context" "time" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -37,15 +38,15 @@ type DependenciesGetter interface { // DependencyInterface has methods to work with Dependency resources. type DependencyInterface interface { - Create(*v1.Dependency) (*v1.Dependency, error) - Update(*v1.Dependency) (*v1.Dependency, error) - UpdateStatus(*v1.Dependency) (*v1.Dependency, error) - Delete(name string, options *metav1.DeleteOptions) error - DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error - Get(name string, options metav1.GetOptions) (*v1.Dependency, error) - List(opts metav1.ListOptions) (*v1.DependencyList, error) - Watch(opts metav1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Dependency, err error) + Create(ctx context.Context, dependency *v1.Dependency, opts metav1.CreateOptions) (*v1.Dependency, error) + Update(ctx context.Context, dependency *v1.Dependency, opts metav1.UpdateOptions) (*v1.Dependency, error) + UpdateStatus(ctx context.Context, dependency *v1.Dependency, opts metav1.UpdateOptions) (*v1.Dependency, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Dependency, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.DependencyList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Dependency, err error) DependencyExpansion } @@ -64,20 +65,20 @@ func newDependencies(c *AdmiralV1Client, namespace string) *dependencies { } // Get takes name of the dependency, and returns the corresponding dependency object, and an error if there is any. -func (c *dependencies) Get(name string, options metav1.GetOptions) (result *v1.Dependency, err error) { +func (c *dependencies) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.Dependency, err error) { result = &v1.Dependency{} err = c.client.Get(). Namespace(c.ns). Resource("dependencies"). Name(name). VersionedParams(&options, scheme.ParameterCodec). - Do(). + Do(ctx). Into(result) return } // List takes label and field selectors, and returns the list of Dependencies that match those selectors. -func (c *dependencies) List(opts metav1.ListOptions) (result *v1.DependencyList, err error) { +func (c *dependencies) List(ctx context.Context, opts metav1.ListOptions) (result *v1.DependencyList, err error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -88,13 +89,13 @@ func (c *dependencies) List(opts metav1.ListOptions) (result *v1.DependencyList, Resource("dependencies"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Do(). + Do(ctx). Into(result) return } // Watch returns a watch.Interface that watches the requested dependencies. -func (c *dependencies) Watch(opts metav1.ListOptions) (watch.Interface, error) { +func (c *dependencies) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -105,87 +106,90 @@ func (c *dependencies) Watch(opts metav1.ListOptions) (watch.Interface, error) { Resource("dependencies"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Watch() + Watch(ctx) } // Create takes the representation of a dependency and creates it. Returns the server's representation of the dependency, and an error, if there is any. -func (c *dependencies) Create(dependency *v1.Dependency) (result *v1.Dependency, err error) { +func (c *dependencies) Create(ctx context.Context, dependency *v1.Dependency, opts metav1.CreateOptions) (result *v1.Dependency, err error) { result = &v1.Dependency{} err = c.client.Post(). Namespace(c.ns). Resource("dependencies"). + VersionedParams(&opts, scheme.ParameterCodec). Body(dependency). - Do(). + Do(ctx). Into(result) return } // Update takes the representation of a dependency and updates it. Returns the server's representation of the dependency, and an error, if there is any. -func (c *dependencies) Update(dependency *v1.Dependency) (result *v1.Dependency, err error) { +func (c *dependencies) Update(ctx context.Context, dependency *v1.Dependency, opts metav1.UpdateOptions) (result *v1.Dependency, err error) { result = &v1.Dependency{} err = c.client.Put(). Namespace(c.ns). Resource("dependencies"). Name(dependency.Name). + VersionedParams(&opts, scheme.ParameterCodec). Body(dependency). - Do(). + 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 *dependencies) UpdateStatus(dependency *v1.Dependency) (result *v1.Dependency, err error) { +func (c *dependencies) UpdateStatus(ctx context.Context, dependency *v1.Dependency, opts metav1.UpdateOptions) (result *v1.Dependency, err error) { result = &v1.Dependency{} err = c.client.Put(). Namespace(c.ns). Resource("dependencies"). Name(dependency.Name). SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). Body(dependency). - Do(). + Do(ctx). Into(result) return } // Delete takes name of the dependency and deletes it. Returns an error if one occurs. -func (c *dependencies) Delete(name string, options *metav1.DeleteOptions) error { +func (c *dependencies) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("dependencies"). Name(name). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // DeleteCollection deletes a collection of objects. -func (c *dependencies) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { +func (c *dependencies) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second } return c.client.Delete(). Namespace(c.ns). Resource("dependencies"). - VersionedParams(&listOptions, scheme.ParameterCodec). + VersionedParams(&listOpts, scheme.ParameterCodec). Timeout(timeout). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // Patch applies the patch and returns the patched dependency. -func (c *dependencies) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Dependency, err error) { +func (c *dependencies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Dependency, err error) { result = &v1.Dependency{} err = c.client.Patch(pt). Namespace(c.ns). Resource("dependencies"). - SubResource(subresources...). Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). Body(data). - Do(). + Do(ctx). Into(result) return } diff --git a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_dependency.go b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_dependency.go index b1da8fc9..3b9391a8 100644 --- a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_dependency.go +++ b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_dependency.go @@ -19,6 +19,8 @@ limitations under the License. package fake import ( + "context" + admiralv1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" @@ -39,7 +41,7 @@ var dependenciesResource = schema.GroupVersionResource{Group: "admiral.io", Vers var dependenciesKind = schema.GroupVersionKind{Group: "admiral.io", Version: "v1", Kind: "Dependency"} // Get takes name of the dependency, and returns the corresponding dependency object, and an error if there is any. -func (c *FakeDependencies) Get(name string, options v1.GetOptions) (result *admiralv1.Dependency, err error) { +func (c *FakeDependencies) Get(ctx context.Context, name string, options v1.GetOptions) (result *admiralv1.Dependency, err error) { obj, err := c.Fake. Invokes(testing.NewGetAction(dependenciesResource, c.ns, name), &admiralv1.Dependency{}) @@ -50,7 +52,7 @@ func (c *FakeDependencies) Get(name string, options v1.GetOptions) (result *admi } // List takes label and field selectors, and returns the list of Dependencies that match those selectors. -func (c *FakeDependencies) List(opts v1.ListOptions) (result *admiralv1.DependencyList, err error) { +func (c *FakeDependencies) List(ctx context.Context, opts v1.ListOptions) (result *admiralv1.DependencyList, err error) { obj, err := c.Fake. Invokes(testing.NewListAction(dependenciesResource, dependenciesKind, c.ns, opts), &admiralv1.DependencyList{}) @@ -72,14 +74,14 @@ func (c *FakeDependencies) List(opts v1.ListOptions) (result *admiralv1.Dependen } // Watch returns a watch.Interface that watches the requested dependencies. -func (c *FakeDependencies) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *FakeDependencies) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { return c.Fake. InvokesWatch(testing.NewWatchAction(dependenciesResource, c.ns, opts)) } // Create takes the representation of a dependency and creates it. Returns the server's representation of the dependency, and an error, if there is any. -func (c *FakeDependencies) Create(dependency *admiralv1.Dependency) (result *admiralv1.Dependency, err error) { +func (c *FakeDependencies) Create(ctx context.Context, dependency *admiralv1.Dependency, opts v1.CreateOptions) (result *admiralv1.Dependency, err error) { obj, err := c.Fake. Invokes(testing.NewCreateAction(dependenciesResource, c.ns, dependency), &admiralv1.Dependency{}) @@ -90,7 +92,7 @@ func (c *FakeDependencies) Create(dependency *admiralv1.Dependency) (result *adm } // Update takes the representation of a dependency and updates it. Returns the server's representation of the dependency, and an error, if there is any. -func (c *FakeDependencies) Update(dependency *admiralv1.Dependency) (result *admiralv1.Dependency, err error) { +func (c *FakeDependencies) Update(ctx context.Context, dependency *admiralv1.Dependency, opts v1.UpdateOptions) (result *admiralv1.Dependency, err error) { obj, err := c.Fake. Invokes(testing.NewUpdateAction(dependenciesResource, c.ns, dependency), &admiralv1.Dependency{}) @@ -102,7 +104,7 @@ func (c *FakeDependencies) Update(dependency *admiralv1.Dependency) (result *adm // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeDependencies) UpdateStatus(dependency *admiralv1.Dependency) (*admiralv1.Dependency, error) { +func (c *FakeDependencies) UpdateStatus(ctx context.Context, dependency *admiralv1.Dependency, opts v1.UpdateOptions) (*admiralv1.Dependency, error) { obj, err := c.Fake. Invokes(testing.NewUpdateSubresourceAction(dependenciesResource, "status", c.ns, dependency), &admiralv1.Dependency{}) @@ -113,23 +115,23 @@ func (c *FakeDependencies) UpdateStatus(dependency *admiralv1.Dependency) (*admi } // Delete takes name of the dependency and deletes it. Returns an error if one occurs. -func (c *FakeDependencies) Delete(name string, options *v1.DeleteOptions) error { +func (c *FakeDependencies) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(dependenciesResource, c.ns, name), &admiralv1.Dependency{}) + Invokes(testing.NewDeleteActionWithOptions(dependenciesResource, c.ns, name, opts), &admiralv1.Dependency{}) return err } // DeleteCollection deletes a collection of objects. -func (c *FakeDependencies) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(dependenciesResource, c.ns, listOptions) +func (c *FakeDependencies) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(dependenciesResource, c.ns, listOpts) _, err := c.Fake.Invokes(action, &admiralv1.DependencyList{}) return err } // Patch applies the patch and returns the patched dependency. -func (c *FakeDependencies) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *admiralv1.Dependency, err error) { +func (c *FakeDependencies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *admiralv1.Dependency, err error) { obj, err := c.Fake. Invokes(testing.NewPatchSubresourceAction(dependenciesResource, c.ns, name, pt, data, subresources...), &admiralv1.Dependency{}) diff --git a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_globaltrafficpolicy.go b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_globaltrafficpolicy.go index f70dd556..1158f48f 100644 --- a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_globaltrafficpolicy.go +++ b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_globaltrafficpolicy.go @@ -19,6 +19,8 @@ limitations under the License. package fake import ( + "context" + admiralv1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" @@ -39,7 +41,7 @@ var globaltrafficpoliciesResource = schema.GroupVersionResource{Group: "admiral. var globaltrafficpoliciesKind = schema.GroupVersionKind{Group: "admiral.io", Version: "v1", Kind: "GlobalTrafficPolicy"} // Get takes name of the globalTrafficPolicy, and returns the corresponding globalTrafficPolicy object, and an error if there is any. -func (c *FakeGlobalTrafficPolicies) Get(name string, options v1.GetOptions) (result *admiralv1.GlobalTrafficPolicy, err error) { +func (c *FakeGlobalTrafficPolicies) Get(ctx context.Context, name string, options v1.GetOptions) (result *admiralv1.GlobalTrafficPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewGetAction(globaltrafficpoliciesResource, c.ns, name), &admiralv1.GlobalTrafficPolicy{}) @@ -50,7 +52,7 @@ func (c *FakeGlobalTrafficPolicies) Get(name string, options v1.GetOptions) (res } // List takes label and field selectors, and returns the list of GlobalTrafficPolicies that match those selectors. -func (c *FakeGlobalTrafficPolicies) List(opts v1.ListOptions) (result *admiralv1.GlobalTrafficPolicyList, err error) { +func (c *FakeGlobalTrafficPolicies) List(ctx context.Context, opts v1.ListOptions) (result *admiralv1.GlobalTrafficPolicyList, err error) { obj, err := c.Fake. Invokes(testing.NewListAction(globaltrafficpoliciesResource, globaltrafficpoliciesKind, c.ns, opts), &admiralv1.GlobalTrafficPolicyList{}) @@ -72,14 +74,14 @@ func (c *FakeGlobalTrafficPolicies) List(opts v1.ListOptions) (result *admiralv1 } // Watch returns a watch.Interface that watches the requested globalTrafficPolicies. -func (c *FakeGlobalTrafficPolicies) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *FakeGlobalTrafficPolicies) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { return c.Fake. InvokesWatch(testing.NewWatchAction(globaltrafficpoliciesResource, c.ns, opts)) } // Create takes the representation of a globalTrafficPolicy and creates it. Returns the server's representation of the globalTrafficPolicy, and an error, if there is any. -func (c *FakeGlobalTrafficPolicies) Create(globalTrafficPolicy *admiralv1.GlobalTrafficPolicy) (result *admiralv1.GlobalTrafficPolicy, err error) { +func (c *FakeGlobalTrafficPolicies) Create(ctx context.Context, globalTrafficPolicy *admiralv1.GlobalTrafficPolicy, opts v1.CreateOptions) (result *admiralv1.GlobalTrafficPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewCreateAction(globaltrafficpoliciesResource, c.ns, globalTrafficPolicy), &admiralv1.GlobalTrafficPolicy{}) @@ -90,7 +92,7 @@ func (c *FakeGlobalTrafficPolicies) Create(globalTrafficPolicy *admiralv1.Global } // Update takes the representation of a globalTrafficPolicy and updates it. Returns the server's representation of the globalTrafficPolicy, and an error, if there is any. -func (c *FakeGlobalTrafficPolicies) Update(globalTrafficPolicy *admiralv1.GlobalTrafficPolicy) (result *admiralv1.GlobalTrafficPolicy, err error) { +func (c *FakeGlobalTrafficPolicies) Update(ctx context.Context, globalTrafficPolicy *admiralv1.GlobalTrafficPolicy, opts v1.UpdateOptions) (result *admiralv1.GlobalTrafficPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewUpdateAction(globaltrafficpoliciesResource, c.ns, globalTrafficPolicy), &admiralv1.GlobalTrafficPolicy{}) @@ -102,7 +104,7 @@ func (c *FakeGlobalTrafficPolicies) Update(globalTrafficPolicy *admiralv1.Global // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeGlobalTrafficPolicies) UpdateStatus(globalTrafficPolicy *admiralv1.GlobalTrafficPolicy) (*admiralv1.GlobalTrafficPolicy, error) { +func (c *FakeGlobalTrafficPolicies) UpdateStatus(ctx context.Context, globalTrafficPolicy *admiralv1.GlobalTrafficPolicy, opts v1.UpdateOptions) (*admiralv1.GlobalTrafficPolicy, error) { obj, err := c.Fake. Invokes(testing.NewUpdateSubresourceAction(globaltrafficpoliciesResource, "status", c.ns, globalTrafficPolicy), &admiralv1.GlobalTrafficPolicy{}) @@ -113,23 +115,23 @@ func (c *FakeGlobalTrafficPolicies) UpdateStatus(globalTrafficPolicy *admiralv1. } // Delete takes name of the globalTrafficPolicy and deletes it. Returns an error if one occurs. -func (c *FakeGlobalTrafficPolicies) Delete(name string, options *v1.DeleteOptions) error { +func (c *FakeGlobalTrafficPolicies) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(globaltrafficpoliciesResource, c.ns, name), &admiralv1.GlobalTrafficPolicy{}) + Invokes(testing.NewDeleteActionWithOptions(globaltrafficpoliciesResource, c.ns, name, opts), &admiralv1.GlobalTrafficPolicy{}) return err } // DeleteCollection deletes a collection of objects. -func (c *FakeGlobalTrafficPolicies) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(globaltrafficpoliciesResource, c.ns, listOptions) +func (c *FakeGlobalTrafficPolicies) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(globaltrafficpoliciesResource, c.ns, listOpts) _, err := c.Fake.Invokes(action, &admiralv1.GlobalTrafficPolicyList{}) return err } // Patch applies the patch and returns the patched globalTrafficPolicy. -func (c *FakeGlobalTrafficPolicies) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *admiralv1.GlobalTrafficPolicy, err error) { +func (c *FakeGlobalTrafficPolicies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *admiralv1.GlobalTrafficPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewPatchSubresourceAction(globaltrafficpoliciesResource, c.ns, name, pt, data, subresources...), &admiralv1.GlobalTrafficPolicy{}) diff --git a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_routingpolicy.go b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_routingpolicy.go index 8aaa8ad5..e1230875 100644 --- a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_routingpolicy.go +++ b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/fake/fake_routingpolicy.go @@ -19,6 +19,8 @@ limitations under the License. package fake import ( + "context" + admiralv1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" @@ -39,7 +41,7 @@ var routingpoliciesResource = schema.GroupVersionResource{Group: "admiral.io", V var routingpoliciesKind = schema.GroupVersionKind{Group: "admiral.io", Version: "v1", Kind: "RoutingPolicy"} // Get takes name of the routingPolicy, and returns the corresponding routingPolicy object, and an error if there is any. -func (c *FakeRoutingPolicies) Get(name string, options v1.GetOptions) (result *admiralv1.RoutingPolicy, err error) { +func (c *FakeRoutingPolicies) Get(ctx context.Context, name string, options v1.GetOptions) (result *admiralv1.RoutingPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewGetAction(routingpoliciesResource, c.ns, name), &admiralv1.RoutingPolicy{}) @@ -50,7 +52,7 @@ func (c *FakeRoutingPolicies) Get(name string, options v1.GetOptions) (result *a } // List takes label and field selectors, and returns the list of RoutingPolicies that match those selectors. -func (c *FakeRoutingPolicies) List(opts v1.ListOptions) (result *admiralv1.RoutingPolicyList, err error) { +func (c *FakeRoutingPolicies) List(ctx context.Context, opts v1.ListOptions) (result *admiralv1.RoutingPolicyList, err error) { obj, err := c.Fake. Invokes(testing.NewListAction(routingpoliciesResource, routingpoliciesKind, c.ns, opts), &admiralv1.RoutingPolicyList{}) @@ -72,14 +74,14 @@ func (c *FakeRoutingPolicies) List(opts v1.ListOptions) (result *admiralv1.Routi } // Watch returns a watch.Interface that watches the requested routingPolicies. -func (c *FakeRoutingPolicies) Watch(opts v1.ListOptions) (watch.Interface, error) { +func (c *FakeRoutingPolicies) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { return c.Fake. InvokesWatch(testing.NewWatchAction(routingpoliciesResource, c.ns, opts)) } // Create takes the representation of a routingPolicy and creates it. Returns the server's representation of the routingPolicy, and an error, if there is any. -func (c *FakeRoutingPolicies) Create(routingPolicy *admiralv1.RoutingPolicy) (result *admiralv1.RoutingPolicy, err error) { +func (c *FakeRoutingPolicies) Create(ctx context.Context, routingPolicy *admiralv1.RoutingPolicy, opts v1.CreateOptions) (result *admiralv1.RoutingPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewCreateAction(routingpoliciesResource, c.ns, routingPolicy), &admiralv1.RoutingPolicy{}) @@ -90,7 +92,7 @@ func (c *FakeRoutingPolicies) Create(routingPolicy *admiralv1.RoutingPolicy) (re } // Update takes the representation of a routingPolicy and updates it. Returns the server's representation of the routingPolicy, and an error, if there is any. -func (c *FakeRoutingPolicies) Update(routingPolicy *admiralv1.RoutingPolicy) (result *admiralv1.RoutingPolicy, err error) { +func (c *FakeRoutingPolicies) Update(ctx context.Context, routingPolicy *admiralv1.RoutingPolicy, opts v1.UpdateOptions) (result *admiralv1.RoutingPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewUpdateAction(routingpoliciesResource, c.ns, routingPolicy), &admiralv1.RoutingPolicy{}) @@ -102,7 +104,7 @@ func (c *FakeRoutingPolicies) Update(routingPolicy *admiralv1.RoutingPolicy) (re // UpdateStatus was generated because the type contains a Status member. // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). -func (c *FakeRoutingPolicies) UpdateStatus(routingPolicy *admiralv1.RoutingPolicy) (*admiralv1.RoutingPolicy, error) { +func (c *FakeRoutingPolicies) UpdateStatus(ctx context.Context, routingPolicy *admiralv1.RoutingPolicy, opts v1.UpdateOptions) (*admiralv1.RoutingPolicy, error) { obj, err := c.Fake. Invokes(testing.NewUpdateSubresourceAction(routingpoliciesResource, "status", c.ns, routingPolicy), &admiralv1.RoutingPolicy{}) @@ -113,23 +115,23 @@ func (c *FakeRoutingPolicies) UpdateStatus(routingPolicy *admiralv1.RoutingPolic } // Delete takes name of the routingPolicy and deletes it. Returns an error if one occurs. -func (c *FakeRoutingPolicies) Delete(name string, options *v1.DeleteOptions) error { +func (c *FakeRoutingPolicies) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { _, err := c.Fake. - Invokes(testing.NewDeleteAction(routingpoliciesResource, c.ns, name), &admiralv1.RoutingPolicy{}) + Invokes(testing.NewDeleteActionWithOptions(routingpoliciesResource, c.ns, name, opts), &admiralv1.RoutingPolicy{}) return err } // DeleteCollection deletes a collection of objects. -func (c *FakeRoutingPolicies) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(routingpoliciesResource, c.ns, listOptions) +func (c *FakeRoutingPolicies) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(routingpoliciesResource, c.ns, listOpts) _, err := c.Fake.Invokes(action, &admiralv1.RoutingPolicyList{}) return err } // Patch applies the patch and returns the patched routingPolicy. -func (c *FakeRoutingPolicies) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *admiralv1.RoutingPolicy, err error) { +func (c *FakeRoutingPolicies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *admiralv1.RoutingPolicy, err error) { obj, err := c.Fake. Invokes(testing.NewPatchSubresourceAction(routingpoliciesResource, c.ns, name, pt, data, subresources...), &admiralv1.RoutingPolicy{}) diff --git a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/globaltrafficpolicy.go b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/globaltrafficpolicy.go index 2357a231..b3f430a9 100644 --- a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/globaltrafficpolicy.go +++ b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/globaltrafficpolicy.go @@ -19,6 +19,7 @@ limitations under the License. package v1 import ( + "context" "time" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -37,15 +38,15 @@ type GlobalTrafficPoliciesGetter interface { // GlobalTrafficPolicyInterface has methods to work with GlobalTrafficPolicy resources. type GlobalTrafficPolicyInterface interface { - Create(*v1.GlobalTrafficPolicy) (*v1.GlobalTrafficPolicy, error) - Update(*v1.GlobalTrafficPolicy) (*v1.GlobalTrafficPolicy, error) - UpdateStatus(*v1.GlobalTrafficPolicy) (*v1.GlobalTrafficPolicy, error) - Delete(name string, options *metav1.DeleteOptions) error - DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error - Get(name string, options metav1.GetOptions) (*v1.GlobalTrafficPolicy, error) - List(opts metav1.ListOptions) (*v1.GlobalTrafficPolicyList, error) - Watch(opts metav1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.GlobalTrafficPolicy, err error) + Create(ctx context.Context, globalTrafficPolicy *v1.GlobalTrafficPolicy, opts metav1.CreateOptions) (*v1.GlobalTrafficPolicy, error) + Update(ctx context.Context, globalTrafficPolicy *v1.GlobalTrafficPolicy, opts metav1.UpdateOptions) (*v1.GlobalTrafficPolicy, error) + UpdateStatus(ctx context.Context, globalTrafficPolicy *v1.GlobalTrafficPolicy, opts metav1.UpdateOptions) (*v1.GlobalTrafficPolicy, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.GlobalTrafficPolicy, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.GlobalTrafficPolicyList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.GlobalTrafficPolicy, err error) GlobalTrafficPolicyExpansion } @@ -64,20 +65,20 @@ func newGlobalTrafficPolicies(c *AdmiralV1Client, namespace string) *globalTraff } // Get takes name of the globalTrafficPolicy, and returns the corresponding globalTrafficPolicy object, and an error if there is any. -func (c *globalTrafficPolicies) Get(name string, options metav1.GetOptions) (result *v1.GlobalTrafficPolicy, err error) { +func (c *globalTrafficPolicies) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.GlobalTrafficPolicy, err error) { result = &v1.GlobalTrafficPolicy{} err = c.client.Get(). Namespace(c.ns). Resource("globaltrafficpolicies"). Name(name). VersionedParams(&options, scheme.ParameterCodec). - Do(). + Do(ctx). Into(result) return } // List takes label and field selectors, and returns the list of GlobalTrafficPolicies that match those selectors. -func (c *globalTrafficPolicies) List(opts metav1.ListOptions) (result *v1.GlobalTrafficPolicyList, err error) { +func (c *globalTrafficPolicies) List(ctx context.Context, opts metav1.ListOptions) (result *v1.GlobalTrafficPolicyList, err error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -88,13 +89,13 @@ func (c *globalTrafficPolicies) List(opts metav1.ListOptions) (result *v1.Global Resource("globaltrafficpolicies"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Do(). + Do(ctx). Into(result) return } // Watch returns a watch.Interface that watches the requested globalTrafficPolicies. -func (c *globalTrafficPolicies) Watch(opts metav1.ListOptions) (watch.Interface, error) { +func (c *globalTrafficPolicies) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -105,87 +106,90 @@ func (c *globalTrafficPolicies) Watch(opts metav1.ListOptions) (watch.Interface, Resource("globaltrafficpolicies"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Watch() + Watch(ctx) } // Create takes the representation of a globalTrafficPolicy and creates it. Returns the server's representation of the globalTrafficPolicy, and an error, if there is any. -func (c *globalTrafficPolicies) Create(globalTrafficPolicy *v1.GlobalTrafficPolicy) (result *v1.GlobalTrafficPolicy, err error) { +func (c *globalTrafficPolicies) Create(ctx context.Context, globalTrafficPolicy *v1.GlobalTrafficPolicy, opts metav1.CreateOptions) (result *v1.GlobalTrafficPolicy, err error) { result = &v1.GlobalTrafficPolicy{} err = c.client.Post(). Namespace(c.ns). Resource("globaltrafficpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). Body(globalTrafficPolicy). - Do(). + Do(ctx). Into(result) return } // Update takes the representation of a globalTrafficPolicy and updates it. Returns the server's representation of the globalTrafficPolicy, and an error, if there is any. -func (c *globalTrafficPolicies) Update(globalTrafficPolicy *v1.GlobalTrafficPolicy) (result *v1.GlobalTrafficPolicy, err error) { +func (c *globalTrafficPolicies) Update(ctx context.Context, globalTrafficPolicy *v1.GlobalTrafficPolicy, opts metav1.UpdateOptions) (result *v1.GlobalTrafficPolicy, err error) { result = &v1.GlobalTrafficPolicy{} err = c.client.Put(). Namespace(c.ns). Resource("globaltrafficpolicies"). Name(globalTrafficPolicy.Name). + VersionedParams(&opts, scheme.ParameterCodec). Body(globalTrafficPolicy). - Do(). + 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 *globalTrafficPolicies) UpdateStatus(globalTrafficPolicy *v1.GlobalTrafficPolicy) (result *v1.GlobalTrafficPolicy, err error) { +func (c *globalTrafficPolicies) UpdateStatus(ctx context.Context, globalTrafficPolicy *v1.GlobalTrafficPolicy, opts metav1.UpdateOptions) (result *v1.GlobalTrafficPolicy, err error) { result = &v1.GlobalTrafficPolicy{} err = c.client.Put(). Namespace(c.ns). Resource("globaltrafficpolicies"). Name(globalTrafficPolicy.Name). SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). Body(globalTrafficPolicy). - Do(). + Do(ctx). Into(result) return } // Delete takes name of the globalTrafficPolicy and deletes it. Returns an error if one occurs. -func (c *globalTrafficPolicies) Delete(name string, options *metav1.DeleteOptions) error { +func (c *globalTrafficPolicies) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("globaltrafficpolicies"). Name(name). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // DeleteCollection deletes a collection of objects. -func (c *globalTrafficPolicies) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { +func (c *globalTrafficPolicies) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second } return c.client.Delete(). Namespace(c.ns). Resource("globaltrafficpolicies"). - VersionedParams(&listOptions, scheme.ParameterCodec). + VersionedParams(&listOpts, scheme.ParameterCodec). Timeout(timeout). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // Patch applies the patch and returns the patched globalTrafficPolicy. -func (c *globalTrafficPolicies) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.GlobalTrafficPolicy, err error) { +func (c *globalTrafficPolicies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.GlobalTrafficPolicy, err error) { result = &v1.GlobalTrafficPolicy{} err = c.client.Patch(pt). Namespace(c.ns). Resource("globaltrafficpolicies"). - SubResource(subresources...). Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). Body(data). - Do(). + Do(ctx). Into(result) return } diff --git a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/routingpolicy.go b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/routingpolicy.go index 1db4ef8b..a84c923e 100644 --- a/admiral/pkg/client/clientset/versioned/typed/admiral/v1/routingpolicy.go +++ b/admiral/pkg/client/clientset/versioned/typed/admiral/v1/routingpolicy.go @@ -19,6 +19,7 @@ limitations under the License. package v1 import ( + "context" "time" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -37,15 +38,15 @@ type RoutingPoliciesGetter interface { // RoutingPolicyInterface has methods to work with RoutingPolicy resources. type RoutingPolicyInterface interface { - Create(*v1.RoutingPolicy) (*v1.RoutingPolicy, error) - Update(*v1.RoutingPolicy) (*v1.RoutingPolicy, error) - UpdateStatus(*v1.RoutingPolicy) (*v1.RoutingPolicy, error) - Delete(name string, options *metav1.DeleteOptions) error - DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error - Get(name string, options metav1.GetOptions) (*v1.RoutingPolicy, error) - List(opts metav1.ListOptions) (*v1.RoutingPolicyList, error) - Watch(opts metav1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.RoutingPolicy, err error) + Create(ctx context.Context, routingPolicy *v1.RoutingPolicy, opts metav1.CreateOptions) (*v1.RoutingPolicy, error) + Update(ctx context.Context, routingPolicy *v1.RoutingPolicy, opts metav1.UpdateOptions) (*v1.RoutingPolicy, error) + UpdateStatus(ctx context.Context, routingPolicy *v1.RoutingPolicy, opts metav1.UpdateOptions) (*v1.RoutingPolicy, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.RoutingPolicy, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.RoutingPolicyList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.RoutingPolicy, err error) RoutingPolicyExpansion } @@ -64,20 +65,20 @@ func newRoutingPolicies(c *AdmiralV1Client, namespace string) *routingPolicies { } // Get takes name of the routingPolicy, and returns the corresponding routingPolicy object, and an error if there is any. -func (c *routingPolicies) Get(name string, options metav1.GetOptions) (result *v1.RoutingPolicy, err error) { +func (c *routingPolicies) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.RoutingPolicy, err error) { result = &v1.RoutingPolicy{} err = c.client.Get(). Namespace(c.ns). Resource("routingpolicies"). Name(name). VersionedParams(&options, scheme.ParameterCodec). - Do(). + Do(ctx). Into(result) return } // List takes label and field selectors, and returns the list of RoutingPolicies that match those selectors. -func (c *routingPolicies) List(opts metav1.ListOptions) (result *v1.RoutingPolicyList, err error) { +func (c *routingPolicies) List(ctx context.Context, opts metav1.ListOptions) (result *v1.RoutingPolicyList, err error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -88,13 +89,13 @@ func (c *routingPolicies) List(opts metav1.ListOptions) (result *v1.RoutingPolic Resource("routingpolicies"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Do(). + Do(ctx). Into(result) - return result, err + return } // Watch returns a watch.Interface that watches the requested routingPolicies. -func (c *routingPolicies) Watch(opts metav1.ListOptions) (watch.Interface, error) { +func (c *routingPolicies) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { var timeout time.Duration if opts.TimeoutSeconds != nil { timeout = time.Duration(*opts.TimeoutSeconds) * time.Second @@ -105,87 +106,90 @@ func (c *routingPolicies) Watch(opts metav1.ListOptions) (watch.Interface, error Resource("routingpolicies"). VersionedParams(&opts, scheme.ParameterCodec). Timeout(timeout). - Watch() + Watch(ctx) } // Create takes the representation of a routingPolicy and creates it. Returns the server's representation of the routingPolicy, and an error, if there is any. -func (c *routingPolicies) Create(routingPolicy *v1.RoutingPolicy) (result *v1.RoutingPolicy, err error) { +func (c *routingPolicies) Create(ctx context.Context, routingPolicy *v1.RoutingPolicy, opts metav1.CreateOptions) (result *v1.RoutingPolicy, err error) { result = &v1.RoutingPolicy{} err = c.client.Post(). Namespace(c.ns). Resource("routingpolicies"). + VersionedParams(&opts, scheme.ParameterCodec). Body(routingPolicy). - Do(). + Do(ctx). Into(result) - return result, err + return } // Update takes the representation of a routingPolicy and updates it. Returns the server's representation of the routingPolicy, and an error, if there is any. -func (c *routingPolicies) Update(routingPolicy *v1.RoutingPolicy) (result *v1.RoutingPolicy, err error) { +func (c *routingPolicies) Update(ctx context.Context, routingPolicy *v1.RoutingPolicy, opts metav1.UpdateOptions) (result *v1.RoutingPolicy, err error) { result = &v1.RoutingPolicy{} err = c.client.Put(). Namespace(c.ns). Resource("routingpolicies"). Name(routingPolicy.Name). + VersionedParams(&opts, scheme.ParameterCodec). Body(routingPolicy). - Do(). + Do(ctx). Into(result) - return result, err + 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 *routingPolicies) UpdateStatus(routingPolicy *v1.RoutingPolicy) (result *v1.RoutingPolicy, err error) { +func (c *routingPolicies) UpdateStatus(ctx context.Context, routingPolicy *v1.RoutingPolicy, opts metav1.UpdateOptions) (result *v1.RoutingPolicy, err error) { result = &v1.RoutingPolicy{} err = c.client.Put(). Namespace(c.ns). Resource("routingpolicies"). Name(routingPolicy.Name). SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). Body(routingPolicy). - Do(). + Do(ctx). Into(result) - return result, err + return } // Delete takes name of the routingPolicy and deletes it. Returns an error if one occurs. -func (c *routingPolicies) Delete(name string, options *metav1.DeleteOptions) error { +func (c *routingPolicies) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("routingpolicies"). Name(name). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // DeleteCollection deletes a collection of objects. -func (c *routingPolicies) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { +func (c *routingPolicies) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { var timeout time.Duration - if listOptions.TimeoutSeconds != nil { - timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second } return c.client.Delete(). Namespace(c.ns). Resource("routingpolicies"). - VersionedParams(&listOptions, scheme.ParameterCodec). + VersionedParams(&listOpts, scheme.ParameterCodec). Timeout(timeout). - Body(options). - Do(). + Body(&opts). + Do(ctx). Error() } // Patch applies the patch and returns the patched routingPolicy. -func (c *routingPolicies) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.RoutingPolicy, err error) { +func (c *routingPolicies) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.RoutingPolicy, err error) { result = &v1.RoutingPolicy{} err = c.client.Patch(pt). Namespace(c.ns). Resource("routingpolicies"). - SubResource(subresources...). Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). Body(data). - Do(). + Do(ctx). Into(result) - return result, err + return } diff --git a/admiral/pkg/client/informers/externalversions/admiral/v1/dependency.go b/admiral/pkg/client/informers/externalversions/admiral/v1/dependency.go index fe86c2c7..75a3f41e 100644 --- a/admiral/pkg/client/informers/externalversions/admiral/v1/dependency.go +++ b/admiral/pkg/client/informers/externalversions/admiral/v1/dependency.go @@ -19,6 +19,7 @@ limitations under the License. package v1 import ( + "context" time "time" admiralv1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -61,13 +62,13 @@ func NewFilteredDependencyInformer(client versioned.Interface, namespace string, if tweakListOptions != nil { tweakListOptions(&options) } - return client.AdmiralV1().Dependencies(namespace).List(options) + return client.AdmiralV1().Dependencies(namespace).List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.AdmiralV1().Dependencies(namespace).Watch(options) + return client.AdmiralV1().Dependencies(namespace).Watch(context.TODO(), options) }, }, &admiralv1.Dependency{}, diff --git a/admiral/pkg/client/informers/externalversions/admiral/v1/globaltrafficpolicy.go b/admiral/pkg/client/informers/externalversions/admiral/v1/globaltrafficpolicy.go index 70334a04..54f8bb6e 100644 --- a/admiral/pkg/client/informers/externalversions/admiral/v1/globaltrafficpolicy.go +++ b/admiral/pkg/client/informers/externalversions/admiral/v1/globaltrafficpolicy.go @@ -19,6 +19,7 @@ limitations under the License. package v1 import ( + "context" time "time" admiralv1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -61,13 +62,13 @@ func NewFilteredGlobalTrafficPolicyInformer(client versioned.Interface, namespac if tweakListOptions != nil { tweakListOptions(&options) } - return client.AdmiralV1().GlobalTrafficPolicies(namespace).List(options) + return client.AdmiralV1().GlobalTrafficPolicies(namespace).List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.AdmiralV1().GlobalTrafficPolicies(namespace).Watch(options) + return client.AdmiralV1().GlobalTrafficPolicies(namespace).Watch(context.TODO(), options) }, }, &admiralv1.GlobalTrafficPolicy{}, diff --git a/admiral/pkg/client/informers/externalversions/admiral/v1/routingpolicy.go b/admiral/pkg/client/informers/externalversions/admiral/v1/routingpolicy.go index 0d54f5a9..a7f2fb1b 100644 --- a/admiral/pkg/client/informers/externalversions/admiral/v1/routingpolicy.go +++ b/admiral/pkg/client/informers/externalversions/admiral/v1/routingpolicy.go @@ -19,6 +19,7 @@ limitations under the License. package v1 import ( + "context" time "time" admiralv1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -61,13 +62,13 @@ func NewFilteredRoutingPolicyInformer(client versioned.Interface, namespace stri if tweakListOptions != nil { tweakListOptions(&options) } - return client.AdmiralV1().RoutingPolicies(namespace).List(options) + return client.AdmiralV1().RoutingPolicies(namespace).List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } - return client.AdmiralV1().RoutingPolicies(namespace).Watch(options) + return client.AdmiralV1().RoutingPolicies(namespace).Watch(context.TODO(), options) }, }, &admiralv1.RoutingPolicy{}, diff --git a/admiral/pkg/client/listers/admiral/v1/dependency.go b/admiral/pkg/client/listers/admiral/v1/dependency.go index 18ad358d..406d0284 100644 --- a/admiral/pkg/client/listers/admiral/v1/dependency.go +++ b/admiral/pkg/client/listers/admiral/v1/dependency.go @@ -26,8 +26,10 @@ import ( ) // DependencyLister helps list Dependencies. +// All objects returned here must be treated as read-only. type DependencyLister interface { // List lists all Dependencies in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Dependency, err error) // Dependencies returns an object that can list and get Dependencies. Dependencies(namespace string) DependencyNamespaceLister @@ -58,10 +60,13 @@ func (s *dependencyLister) Dependencies(namespace string) DependencyNamespaceLis } // DependencyNamespaceLister helps list and get Dependencies. +// All objects returned here must be treated as read-only. type DependencyNamespaceLister interface { // List lists all Dependencies in the indexer for a given namespace. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.Dependency, err error) // Get retrieves the Dependency from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.Dependency, error) DependencyNamespaceListerExpansion } diff --git a/admiral/pkg/client/listers/admiral/v1/globaltrafficpolicy.go b/admiral/pkg/client/listers/admiral/v1/globaltrafficpolicy.go index 8c4060ba..d982afe4 100644 --- a/admiral/pkg/client/listers/admiral/v1/globaltrafficpolicy.go +++ b/admiral/pkg/client/listers/admiral/v1/globaltrafficpolicy.go @@ -26,8 +26,10 @@ import ( ) // GlobalTrafficPolicyLister helps list GlobalTrafficPolicies. +// All objects returned here must be treated as read-only. type GlobalTrafficPolicyLister interface { // List lists all GlobalTrafficPolicies in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.GlobalTrafficPolicy, err error) // GlobalTrafficPolicies returns an object that can list and get GlobalTrafficPolicies. GlobalTrafficPolicies(namespace string) GlobalTrafficPolicyNamespaceLister @@ -58,10 +60,13 @@ func (s *globalTrafficPolicyLister) GlobalTrafficPolicies(namespace string) Glob } // GlobalTrafficPolicyNamespaceLister helps list and get GlobalTrafficPolicies. +// All objects returned here must be treated as read-only. type GlobalTrafficPolicyNamespaceLister interface { // List lists all GlobalTrafficPolicies in the indexer for a given namespace. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.GlobalTrafficPolicy, err error) // Get retrieves the GlobalTrafficPolicy from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.GlobalTrafficPolicy, error) GlobalTrafficPolicyNamespaceListerExpansion } diff --git a/admiral/pkg/client/listers/admiral/v1/routingpolicy.go b/admiral/pkg/client/listers/admiral/v1/routingpolicy.go index a986b99e..33a066af 100644 --- a/admiral/pkg/client/listers/admiral/v1/routingpolicy.go +++ b/admiral/pkg/client/listers/admiral/v1/routingpolicy.go @@ -26,8 +26,10 @@ import ( ) // RoutingPolicyLister helps list RoutingPolicies. +// All objects returned here must be treated as read-only. type RoutingPolicyLister interface { // List lists all RoutingPolicies in the indexer. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.RoutingPolicy, err error) // RoutingPolicies returns an object that can list and get RoutingPolicies. RoutingPolicies(namespace string) RoutingPolicyNamespaceLister @@ -58,10 +60,13 @@ func (s *routingPolicyLister) RoutingPolicies(namespace string) RoutingPolicyNam } // RoutingPolicyNamespaceLister helps list and get RoutingPolicies. +// All objects returned here must be treated as read-only. type RoutingPolicyNamespaceLister interface { // List lists all RoutingPolicies in the indexer for a given namespace. + // Objects returned here must be treated as read-only. List(selector labels.Selector) (ret []*v1.RoutingPolicy, err error) // Get retrieves the RoutingPolicy from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. Get(name string) (*v1.RoutingPolicy, error) RoutingPolicyNamespaceListerExpansion } diff --git a/admiral/pkg/clusters/envoyfilter.go b/admiral/pkg/clusters/envoyfilter.go index 2d52d64c..a2ea79e0 100644 --- a/admiral/pkg/clusters/envoyfilter.go +++ b/admiral/pkg/clusters/envoyfilter.go @@ -1,9 +1,12 @@ package clusters import ( + "context" "errors" "fmt" - "github.com/gogo/protobuf/types" + "strings" + + structPb "github.com/golang/protobuf/ptypes/struct" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/admiral" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" @@ -11,20 +14,20 @@ import ( "istio.io/api/networking/v1alpha3" networking "istio.io/client-go/pkg/apis/networking/v1alpha3" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "strings" ) var ( getSha1 = common.GetSha1 ) + const hostsKey = "hosts: " const pluginKey = "plugin: " -func createOrUpdateEnvoyFilter( rc *RemoteController, routingPolicy *v1.RoutingPolicy, eventType admiral.EventType, workloadIdentityKey string, admiralCache *AdmiralCache, workloadSelectorMap map[string]string) (*networking.EnvoyFilter, error) { +func createOrUpdateEnvoyFilter(ctx context.Context, rc *RemoteController, routingPolicy *v1.RoutingPolicy, eventType admiral.EventType, workloadIdentityKey string, admiralCache *AdmiralCache, workloadSelectorMap map[string]string) (*networking.EnvoyFilter, error) { envoyfilterSpec := constructEnvoyFilterStruct(routingPolicy, workloadSelectorMap) - selectorLabelsSha, err := getSha1(workloadIdentityKey+common.GetRoutingPolicyEnv(routingPolicy)) + selectorLabelsSha, err := getSha1(workloadIdentityKey + common.GetRoutingPolicyEnv(routingPolicy)) if err != nil { log.Error("error occurred while computing workload labels sha1") return nil, err @@ -43,6 +46,7 @@ func createOrUpdateEnvoyFilter( rc *RemoteController, routingPolicy *v1.RoutingP Name: envoyFilterName, Namespace: common.NamespaceIstioSystem, }, + //nolint Spec: *envoyfilterSpec, } @@ -51,21 +55,23 @@ func createOrUpdateEnvoyFilter( rc *RemoteController, routingPolicy *v1.RoutingP //get the envoyfilter if it exists. If it exists, update it. Otherwise create it. if eventType == admiral.Add || eventType == admiral.Update { // We query the API server instead of getting it from cache because there could be potential condition where the filter exists in the cache but not on the cluster. - filter, err = rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3().EnvoyFilters(common.NamespaceIstioSystem).Get(envoyFilterName, metaV1.GetOptions{}) + filter, err = rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3(). + EnvoyFilters(common.NamespaceIstioSystem).Get(ctx, envoyFilterName, metaV1.GetOptions{}) if err != nil { log.Infof("msg=%s filtername=%s clustername=%s", "creating the envoy filter", envoyFilterName, rc.ClusterID) - filter, err = rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3().EnvoyFilters(common.NamespaceIstioSystem).Create(envoyfilter) + filter, err = rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3(). + EnvoyFilters(common.NamespaceIstioSystem).Create(ctx, envoyfilter, metaV1.CreateOptions{}) if err != nil { log.Infof("error creating filter: %v", err) } } else { log.Infof("msg=%s filtername=%s clustername=%s", "updating existing envoy filter", envoyFilterName, rc.ClusterID) envoyfilter.ResourceVersion = filter.ResourceVersion - filter, err = rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3().EnvoyFilters(common.NamespaceIstioSystem).Update(envoyfilter) + filter, err = rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3(). + EnvoyFilters(common.NamespaceIstioSystem).Update(ctx, envoyfilter, metaV1.UpdateOptions{}) } } - return filter, err } @@ -79,42 +85,40 @@ func constructEnvoyFilterStruct(routingPolicy *v1.RoutingPolicy, workloadSelecto } envoyFilterStringConfig += fmt.Sprintf("%s: %s\n", key, val) } - if len(common.GetEnvoyFilterAdditionalConfig()) !=0 { - envoyFilterStringConfig += common.GetEnvoyFilterAdditionalConfig()+"\n" + if len(common.GetEnvoyFilterAdditionalConfig()) != 0 { + envoyFilterStringConfig += common.GetEnvoyFilterAdditionalConfig() + "\n" } envoyFilterStringConfig += getHosts(routingPolicy) + "\n" envoyFilterStringConfig += getPlugin(routingPolicy) log.Infof("msg=%s type=routingpolicy name=%s", "adding config", routingPolicy.Name) - - configuration := types.Struct{ - Fields: map[string]*types.Value{ - "@type": {Kind: &types.Value_StringValue{StringValue: "type.googleapis.com/google.protobuf.StringValue"}}, - "value": {Kind: &types.Value_StringValue{StringValue: envoyFilterStringConfig}}, + configuration := structPb.Struct{ + Fields: map[string]*structPb.Value{ + "@type": {Kind: &structPb.Value_StringValue{StringValue: "type.googleapis.com/google.protobuf.StringValue"}}, + "value": {Kind: &structPb.Value_StringValue{StringValue: envoyFilterStringConfig}}, }, } - - vmConfig := types.Struct{ - Fields: map[string]*types.Value{ - "runtime": {Kind: &types.Value_StringValue{StringValue: "envoy.wasm.runtime.v8"}}, - "code": {Kind: &types.Value_StructValue{StructValue: &types.Struct{Fields: map[string]*types.Value{ - "local": {Kind: &types.Value_StructValue{StructValue: &types.Struct{Fields: map[string]*types.Value{ - "filename": {Kind: &types.Value_StringValue{StringValue: wasmPath}}, + vmConfig := structPb.Struct{ + Fields: map[string]*structPb.Value{ + "runtime": {Kind: &structPb.Value_StringValue{StringValue: "envoy.wasm.runtime.v8"}}, + "code": {Kind: &structPb.Value_StructValue{StructValue: &structPb.Struct{Fields: map[string]*structPb.Value{ + "local": {Kind: &structPb.Value_StructValue{StructValue: &structPb.Struct{Fields: map[string]*structPb.Value{ + "filename": {Kind: &structPb.Value_StringValue{StringValue: wasmPath}}, }}}}, }}}}, }, } - typedConfigValue := types.Struct{ - Fields: map[string]*types.Value{ + typedConfigValue := structPb.Struct{ + Fields: map[string]*structPb.Value{ "config": { - Kind: &types.Value_StructValue{ - StructValue: &types.Struct{ - Fields: map[string]*types.Value{ - "configuration": {Kind: &types.Value_StructValue{StructValue: &configuration}}, - "vm_config": {Kind: &types.Value_StructValue{StructValue: &vmConfig}}, + Kind: &structPb.Value_StructValue{ + StructValue: &structPb.Struct{ + Fields: map[string]*structPb.Value{ + "configuration": {Kind: &structPb.Value_StructValue{StructValue: &configuration}}, + "vm_config": {Kind: &structPb.Value_StructValue{StructValue: &vmConfig}}, }, }, }, @@ -122,11 +126,11 @@ func constructEnvoyFilterStruct(routingPolicy *v1.RoutingPolicy, workloadSelecto }, } - typedConfig := types.Struct{ - Fields: map[string]*types.Value{ - "@type": {Kind: &types.Value_StringValue{StringValue: "type.googleapis.com/udpa.type.v1.TypedStruct"}}, - "type_url": {Kind: &types.Value_StringValue{StringValue: "type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm"}}, - "value": {Kind: &types.Value_StructValue{StructValue: &typedConfigValue}}, + typedConfig := &structPb.Struct{ + Fields: map[string]*structPb.Value{ + "@type": {Kind: &structPb.Value_StringValue{StringValue: "type.googleapis.com/udpa.type.v1.TypedStruct"}}, + "type_url": {Kind: &structPb.Value_StringValue{StringValue: "type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm"}}, + "value": {Kind: &structPb.Value_StructValue{StructValue: &typedConfigValue}}, }, } @@ -134,7 +138,7 @@ func constructEnvoyFilterStruct(routingPolicy *v1.RoutingPolicy, workloadSelecto return envoyfilterSpec } -func getEnvoyFilterSpec(workloadSelectorLabels map[string]string, typedConfig types.Struct) *v1alpha3.EnvoyFilter { +func getEnvoyFilterSpec(workloadSelectorLabels map[string]string, typedConfig *structPb.Struct) *v1alpha3.EnvoyFilter { return &v1alpha3.EnvoyFilter{ WorkloadSelector: &v1alpha3.WorkloadSelector{Labels: workloadSelectorLabels}, @@ -144,7 +148,7 @@ func getEnvoyFilterSpec(workloadSelectorLabels map[string]string, typedConfig ty Match: &v1alpha3.EnvoyFilter_EnvoyConfigObjectMatch{ Context: v1alpha3.EnvoyFilter_SIDECAR_OUTBOUND, // TODO: Figure out the possibility of using this for istio version upgrades. Can we add multiple filters with different proxy version Match here? - Proxy: &v1alpha3.EnvoyFilter_ProxyMatch{ProxyVersion: "^"+strings.ReplaceAll(common.GetEnvoyFilterVersion(),".","\\.")+".*"}, + Proxy: &v1alpha3.EnvoyFilter_ProxyMatch{ProxyVersion: "^" + strings.ReplaceAll(common.GetEnvoyFilterVersion(), ".", "\\.") + ".*"}, ObjectTypes: &v1alpha3.EnvoyFilter_EnvoyConfigObjectMatch_Listener{ Listener: &v1alpha3.EnvoyFilter_ListenerMatch{ FilterChain: &v1alpha3.EnvoyFilter_ListenerMatch_FilterChainMatch{ @@ -160,13 +164,12 @@ func getEnvoyFilterSpec(workloadSelectorLabels map[string]string, typedConfig ty }, Patch: &v1alpha3.EnvoyFilter_Patch{ Operation: v1alpha3.EnvoyFilter_Patch_INSERT_BEFORE, - //https://pkg.go.dev/github.com/gogo/protobuf/types#Value - Value: &types.Struct{ - Fields: map[string]*types.Value{ - "name": {Kind: &types.Value_StringValue{StringValue: "dynamicRoutingFilterPatch"}}, + Value: &structPb.Struct{ + Fields: map[string]*structPb.Value{ + "name": {Kind: &structPb.Value_StringValue{StringValue: "dynamicRoutingFilterPatch"}}, "typed_config": { - Kind: &types.Value_StructValue{ - StructValue: &typedConfig, + Kind: &structPb.Value_StructValue{ + StructValue: typedConfig, }, }, }, @@ -182,7 +185,7 @@ func getHosts(routingPolicy *v1.RoutingPolicy) string { for _, host := range routingPolicy.Spec.Hosts { hosts += host + "," } - hosts = strings.TrimSuffix(hosts,",") + hosts = strings.TrimSuffix(hosts, ",") return hostsKey + hosts } @@ -190,4 +193,3 @@ func getPlugin(routingPolicy *v1.RoutingPolicy) string { plugin := routingPolicy.Spec.Plugin return pluginKey + plugin } - diff --git a/admiral/pkg/clusters/envoyfilter_test.go b/admiral/pkg/clusters/envoyfilter_test.go index 07914043..dd117d74 100644 --- a/admiral/pkg/clusters/envoyfilter_test.go +++ b/admiral/pkg/clusters/envoyfilter_test.go @@ -3,6 +3,10 @@ package clusters import ( "context" "errors" + "sync" + "testing" + "time" + "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/admiral" @@ -10,12 +14,9 @@ import ( "github.com/stretchr/testify/assert" istiofake "istio.io/client-go/pkg/clientset/versioned/fake" "istio.io/client-go/pkg/clientset/versioned/typed/networking/v1alpha3/fake" - time2 "k8s.io/apimachinery/pkg/apis/meta/v1" + metaV1Time "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" testing2 "k8s.io/client-go/testing" - "sync" - "testing" - "time" ) func TestCreateOrUpdateEnvoyFilter(t *testing.T) { @@ -59,114 +60,113 @@ func TestCreateOrUpdateEnvoyFilter(t *testing.T) { registry.AdmiralCache.IdentityDependencyCache.Put("foo", "bar", "bar") registry.AdmiralCache.IdentityClusterCache.Put("bar", remoteController.ClusterID, remoteController.ClusterID) - handler.RemoteRegistry = registry routingPolicyFoo := &v1.RoutingPolicy{ - TypeMeta: time2.TypeMeta{}, - ObjectMeta: time2.ObjectMeta{ + TypeMeta: metaV1Time.TypeMeta{}, + ObjectMeta: metaV1Time.ObjectMeta{ Labels: map[string]string{ - "identity": "foo", + "identity": "foo", "admiral.io/env": "stage", }, }, - Spec: model.RoutingPolicy{ - Plugin: "test", - Hosts: []string{"e2e.testservice.mesh"}, + Spec: model.RoutingPolicy{ + Plugin: "test", + Hosts: []string{"e2e.testservice.mesh"}, Config: map[string]string{ - "cachePrefix": "cache-v1", - "cachettlSec": "86400", + "cachePrefix": "cache-v1", + "cachettlSec": "86400", "routingServiceUrl": "e2e.test.routing.service.mesh", - "pathPrefix": "/sayhello,/v1/company/{id}/", + "pathPrefix": "/sayhello,/v1/company/{id}/", }, }, - Status: v1.RoutingPolicyStatus{}, + Status: v1.RoutingPolicyStatus{}, } - selectors := map[string]string{"one":"test1", "two":"test2"} + selectors := map[string]string{"one": "test1", "two": "test2"} getSha1 = getSha1Error - envoyfilter, err := createOrUpdateEnvoyFilter(remoteController, routingPolicyFoo, admiral.Add, "barstage", registry.AdmiralCache, selectors) + ctx := context.Background() + + envoyfilter, err := createOrUpdateEnvoyFilter(ctx, remoteController, routingPolicyFoo, admiral.Add, "barstage", registry.AdmiralCache, selectors) assert.NotNil(t, err) assert.Nil(t, envoyfilter) getSha1 = common.GetSha1 - envoyfilter, err = createOrUpdateEnvoyFilter(remoteController, routingPolicyFoo, admiral.Add, "bar", registry.AdmiralCache, selectors) + envoyfilter, err = createOrUpdateEnvoyFilter(ctx, remoteController, routingPolicyFoo, admiral.Add, "bar", registry.AdmiralCache, selectors) assert.Equal(t, "test1", envoyfilter.Spec.WorkloadSelector.GetLabels()["one"]) assert.Equal(t, "test2", envoyfilter.Spec.WorkloadSelector.GetLabels()["two"]) assert.Equal(t, "test-dynamicrouting-d0fdd-1.13", envoyfilter.Name) - envoyfilter, err = createOrUpdateEnvoyFilter(remoteController, routingPolicyFoo, admiral.Update, "bar", registry.AdmiralCache, selectors) + envoyfilter, err = createOrUpdateEnvoyFilter(ctx, remoteController, routingPolicyFoo, admiral.Update, "bar", registry.AdmiralCache, selectors) assert.Nil(t, err) - remoteController.RoutingPolicyController.IstioClient.NetworkingV1alpha3().(*fake.FakeNetworkingV1alpha3).PrependReactor("create", "envoyfilters", func(action testing2.Action) (handled bool, ret runtime.Object, err error) { return true, nil, errors.New("error creating envoyfilter") }, ) - envoyfilter3, err := createOrUpdateEnvoyFilter(remoteController, routingPolicyFoo, admiral.Add, "bar2", registry.AdmiralCache, selectors) + envoyfilter3, err := createOrUpdateEnvoyFilter(ctx, remoteController, routingPolicyFoo, admiral.Add, "bar2", registry.AdmiralCache, selectors) assert.NotNil(t, err) assert.Nil(t, envoyfilter3) - } -func getSha1Error (key interface{}) (string, error) { +func getSha1Error(key interface{}) (string, error) { return "", errors.New("error occured while computing the sha") } func TestGetHosts(t *testing.T) { routingPolicyFoo := &v1.RoutingPolicy{ - TypeMeta: time2.TypeMeta{}, - ObjectMeta: time2.ObjectMeta{ + TypeMeta: metaV1Time.TypeMeta{}, + ObjectMeta: metaV1Time.ObjectMeta{ Labels: map[string]string{ - "identity": "foo", + "identity": "foo", "admiral.io/env": "stage", }, }, - Spec: model.RoutingPolicy{ - Plugin: "test", - Hosts: []string{"e2e.testservice.mesh,e2e2.testservice.mesh"}, + Spec: model.RoutingPolicy{ + Plugin: "test", + Hosts: []string{"e2e.testservice.mesh,e2e2.testservice.mesh"}, Config: map[string]string{ - "cachePrefix": "cache-v1", - "cachettlSec": "86400", + "cachePrefix": "cache-v1", + "cachettlSec": "86400", "routingServiceUrl": "e2e.test.routing.service.mesh", - "pathPrefix": "/sayhello,/v1/company/{id}/", + "pathPrefix": "/sayhello,/v1/company/{id}/", }, }, - Status: v1.RoutingPolicyStatus{}, + Status: v1.RoutingPolicyStatus{}, } hosts := getHosts(routingPolicyFoo) - assert.Equal(t, "hosts: e2e.testservice.mesh,e2e2.testservice.mesh",hosts) + assert.Equal(t, "hosts: e2e.testservice.mesh,e2e2.testservice.mesh", hosts) } func TestGetPlugin(t *testing.T) { routingPolicyFoo := &v1.RoutingPolicy{ - TypeMeta: time2.TypeMeta{}, - ObjectMeta: time2.ObjectMeta{ + TypeMeta: metaV1Time.TypeMeta{}, + ObjectMeta: metaV1Time.ObjectMeta{ Labels: map[string]string{ - "identity": "foo", + "identity": "foo", "admiral.io/env": "stage", }, }, - Spec: model.RoutingPolicy{ - Plugin: "test", - Hosts: []string{"e2e.testservice.mesh,e2e2.testservice.mesh"}, + Spec: model.RoutingPolicy{ + Plugin: "test", + Hosts: []string{"e2e.testservice.mesh,e2e2.testservice.mesh"}, Config: map[string]string{ - "cachePrefix": "cache-v1", - "cachettlSec": "86400", + "cachePrefix": "cache-v1", + "cachettlSec": "86400", "routingServiceUrl": "e2e.test.routing.service.mesh", - "pathPrefix": "/sayhello,/v1/company/{id}/", + "pathPrefix": "/sayhello,/v1/company/{id}/", }, }, - Status: v1.RoutingPolicyStatus{}, + Status: v1.RoutingPolicyStatus{}, } plugin := getPlugin(routingPolicyFoo) - assert.Equal(t, "plugin: test",plugin) + assert.Equal(t, "plugin: test", plugin) } diff --git a/admiral/pkg/clusters/handler.go b/admiral/pkg/clusters/handler.go index 1221dd2b..ffa59ebc 100644 --- a/admiral/pkg/clusters/handler.go +++ b/admiral/pkg/clusters/handler.go @@ -2,20 +2,23 @@ package clusters import ( "bytes" + "context" "fmt" "net" - "reflect" "strings" "time" argo "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" - "github.com/gogo/protobuf/types" + "github.com/golang/protobuf/ptypes/duration" + "github.com/golang/protobuf/ptypes/wrappers" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/admiral" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/util" log "github.com/sirupsen/logrus" + "google.golang.org/protobuf/testing/protocmp" v1alpha32 "istio.io/api/networking/v1alpha3" "istio.io/client-go/pkg/apis/networking/v1alpha3" k8sAppsV1 "k8s.io/api/apps/v1" @@ -55,7 +58,7 @@ type WeightedService struct { } func updateIdentityDependencyCache(sourceIdentity string, identityDependencyCache *common.MapOfMaps, dr *v1.Dependency) { - for _, dIdentity := range dr.Spec.Destinations { + for _, dIdentity := range dr.Spec.Destinations { identityDependencyCache.Put(dIdentity, sourceIdentity, sourceIdentity) } log.Infof(LogFormat, "Update", "dependency-cache", dr.Name, "", "Updated=true namespace="+dr.Namespace) @@ -68,7 +71,7 @@ func getIstioResourceName(host string, suffix string) string { func getDestinationRule(se *v1alpha32.ServiceEntry, locality string, gtpTrafficPolicy *model.TrafficPolicy) *v1alpha32.DestinationRule { var dr = &v1alpha32.DestinationRule{} dr.Host = se.Hosts[0] - dr.TrafficPolicy = &v1alpha32.TrafficPolicy{Tls: &v1alpha32.TLSSettings{Mode: v1alpha32.TLSSettings_ISTIO_MUTUAL}} + dr.TrafficPolicy = &v1alpha32.TrafficPolicy{Tls: &v1alpha32.ClientTLSSettings{Mode: v1alpha32.ClientTLSSettings_ISTIO_MUTUAL}} processGtp := true if len(locality) == 0 { log.Warnf(LogErrFormat, "Process", "GlobalTrafficPolicy", dr.Host, "", "Skipping gtp processing, locality of the cluster nodes cannot be determined. Is this minikube?") @@ -109,24 +112,24 @@ func getDestinationRule(se *v1alpha32.ServiceEntry, locality string, gtpTrafficP func getOutlierDetection(se *v1alpha32.ServiceEntry, locality string, gtpTrafficPolicy *model.TrafficPolicy) *v1alpha32.OutlierDetection { outlierDetection := &v1alpha32.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: DefaultBaseEjectionTime}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, - Interval: &types.Duration{Seconds: DefaultInterval}, + BaseEjectionTime: &duration.Duration{Seconds: DefaultBaseEjectionTime}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, + Interval: &duration.Duration{Seconds: DefaultInterval}, } if gtpTrafficPolicy != nil && gtpTrafficPolicy.OutlierDetection != nil { if gtpTrafficPolicy.OutlierDetection.BaseEjectionTime > 0 { - outlierDetection.BaseEjectionTime = &types.Duration{ + outlierDetection.BaseEjectionTime = &duration.Duration{ Seconds: gtpTrafficPolicy.OutlierDetection.BaseEjectionTime, } } if gtpTrafficPolicy.OutlierDetection.ConsecutiveGatewayErrors > 0 { - outlierDetection.ConsecutiveGatewayErrors = &types.UInt32Value{ + outlierDetection.ConsecutiveGatewayErrors = &wrappers.UInt32Value{ Value: gtpTrafficPolicy.OutlierDetection.ConsecutiveGatewayErrors, } } if gtpTrafficPolicy.OutlierDetection.Interval > 0 { - outlierDetection.Interval = &types.Duration{ + outlierDetection.Interval = &duration.Duration{ Seconds: gtpTrafficPolicy.OutlierDetection.Interval, } } @@ -180,7 +183,7 @@ func (se *ServiceEntryHandler) Deleted(obj *v1alpha3.ServiceEntry) { } } -func (dh *DestinationRuleHandler) Added(obj *v1alpha3.DestinationRule) { +func (dh *DestinationRuleHandler) Added(ctx context.Context, obj *v1alpha3.DestinationRule) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, "Add", "DestinationRule", obj.Name, dh.ClusterID, "Admiral is in read-only mode. Skipping resource from namespace="+obj.Namespace) return @@ -189,10 +192,10 @@ func (dh *DestinationRuleHandler) Added(obj *v1alpha3.DestinationRule) { log.Infof(LogFormat, "Add", "DestinationRule", obj.Name, dh.ClusterID, "Skipping resource from namespace="+obj.Namespace) return } - handleDestinationRuleEvent(obj, dh, common.Add, common.DestinationRule) + handleDestinationRuleEvent(ctx, obj, dh, common.Add, common.DestinationRule) } -func (dh *DestinationRuleHandler) Updated(obj *v1alpha3.DestinationRule) { +func (dh *DestinationRuleHandler) Updated(ctx context.Context, obj *v1alpha3.DestinationRule) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, "Update", "DestinationRule", obj.Name, dh.ClusterID, "Admiral is in read-only mode. Skipping resource from namespace="+obj.Namespace) return @@ -201,10 +204,10 @@ func (dh *DestinationRuleHandler) Updated(obj *v1alpha3.DestinationRule) { log.Infof(LogFormat, "Update", "DestinationRule", obj.Name, dh.ClusterID, "Skipping resource from namespace="+obj.Namespace) return } - handleDestinationRuleEvent(obj, dh, common.Update, common.DestinationRule) + handleDestinationRuleEvent(ctx, obj, dh, common.Update, common.DestinationRule) } -func (dh *DestinationRuleHandler) Deleted(obj *v1alpha3.DestinationRule) { +func (dh *DestinationRuleHandler) Deleted(ctx context.Context, obj *v1alpha3.DestinationRule) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, "Delete", "DestinationRule", obj.Name, dh.ClusterID, "Admiral is in read-only mode. Skipping resource from namespace="+obj.Namespace) return @@ -213,10 +216,10 @@ func (dh *DestinationRuleHandler) Deleted(obj *v1alpha3.DestinationRule) { log.Infof(LogFormat, "Delete", "DestinationRule", obj.Name, dh.ClusterID, "Skipping resource from namespace="+obj.Namespace) return } - handleDestinationRuleEvent(obj, dh, common.Delete, common.DestinationRule) + handleDestinationRuleEvent(ctx, obj, dh, common.Delete, common.DestinationRule) } -func (vh *VirtualServiceHandler) Added(obj *v1alpha3.VirtualService) { +func (vh *VirtualServiceHandler) Added(ctx context.Context, obj *v1alpha3.VirtualService) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, "Add", "VirtualService", obj.Name, vh.ClusterID, "Admiral is in read-only mode. Skipping resource from namespace="+obj.Namespace) return @@ -225,13 +228,13 @@ func (vh *VirtualServiceHandler) Added(obj *v1alpha3.VirtualService) { log.Infof(LogFormat, "Add", "VirtualService", obj.Name, vh.ClusterID, "Skipping resource from namespace="+obj.Namespace) return } - err := handleVirtualServiceEvent(obj, vh, common.Add, common.VirtualService) + err := handleVirtualServiceEvent(ctx, obj, vh, common.Add, common.VirtualService) if err != nil { log.Error(err) } } -func (vh *VirtualServiceHandler) Updated(obj *v1alpha3.VirtualService) { +func (vh *VirtualServiceHandler) Updated(ctx context.Context, obj *v1alpha3.VirtualService) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, "Update", "VirtualService", obj.Name, vh.ClusterID, "Admiral is in read-only mode. Skipping resource from namespace="+obj.Namespace) return @@ -240,13 +243,13 @@ func (vh *VirtualServiceHandler) Updated(obj *v1alpha3.VirtualService) { log.Infof(LogFormat, "Update", "VirtualService", obj.Name, vh.ClusterID, "Skipping resource from namespace="+obj.Namespace) return } - err := handleVirtualServiceEvent(obj, vh, common.Update, common.VirtualService) + err := handleVirtualServiceEvent(ctx, obj, vh, common.Update, common.VirtualService) if err != nil { log.Error(err) } } -func (vh *VirtualServiceHandler) Deleted(obj *v1alpha3.VirtualService) { +func (vh *VirtualServiceHandler) Deleted(ctx context.Context, obj *v1alpha3.VirtualService) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, "Delete", "VirtualService", obj.Name, vh.ClusterID, "Admiral is in read-only mode. Skipping resource from namespace="+obj.Namespace) return @@ -255,17 +258,17 @@ func (vh *VirtualServiceHandler) Deleted(obj *v1alpha3.VirtualService) { log.Infof(LogFormat, "Delete", "VirtualService", obj.Name, vh.ClusterID, "Skipping resource from namespace="+obj.Namespace) return } - err := handleVirtualServiceEvent(obj, vh, common.Delete, common.VirtualService) + err := handleVirtualServiceEvent(ctx, obj, vh, common.Delete, common.VirtualService) if err != nil { log.Error(err) } } -func (dh *SidecarHandler) Added(obj *v1alpha3.Sidecar) {} +func (dh *SidecarHandler) Added(ctx context.Context, obj *v1alpha3.Sidecar) {} -func (dh *SidecarHandler) Updated(obj *v1alpha3.Sidecar) {} +func (dh *SidecarHandler) Updated(ctx context.Context, obj *v1alpha3.Sidecar) {} -func (dh *SidecarHandler) Deleted(obj *v1alpha3.Sidecar) {} +func (dh *SidecarHandler) Deleted(ctx context.Context, obj *v1alpha3.Sidecar) {} func IgnoreIstioResource(exportTo []string, annotations map[string]string, namespace string) bool { @@ -289,7 +292,8 @@ func IgnoreIstioResource(exportTo []string, annotations map[string]string, names return true } -func handleDestinationRuleEvent(obj *v1alpha3.DestinationRule, dh *DestinationRuleHandler, event common.Event, resourceType common.ResourceType) { +func handleDestinationRuleEvent(ctx context.Context, obj *v1alpha3.DestinationRule, dh *DestinationRuleHandler, event common.Event, resourceType common.ResourceType) { + //nolint destinationRule := obj.Spec clusterId := dh.ClusterID @@ -316,7 +320,7 @@ func handleDestinationRuleEvent(obj *v1alpha3.DestinationRule, dh *DestinationRu if event == common.Delete { - err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Delete(obj.Name, &v12.DeleteOptions{}) + err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Delete(ctx, obj.Name, v12.DeleteOptions{}) if err != nil { log.Infof(LogFormat, "Delete", "DestinationRule", obj.Name, clusterId, "success") } else { @@ -325,11 +329,11 @@ func handleDestinationRuleEvent(obj *v1alpha3.DestinationRule, dh *DestinationRu } else { - exist, _ := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Get(obj.Name, v12.GetOptions{}) + exist, _ := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Get(ctx, obj.Name, v12.GetOptions{}) //copy destination rule only to other clusters if dependentCluster != clusterId { - addUpdateDestinationRule(obj, exist, syncNamespace, rc) + addUpdateDestinationRule(ctx, obj, exist, syncNamespace, rc) } } } @@ -344,19 +348,20 @@ func handleDestinationRuleEvent(obj *v1alpha3.DestinationRule, dh *DestinationRu if ClusterID != clusterId { rc := r.GetRemoteController(ClusterID) if event == common.Delete { - deleteDestinationRuleByName(rc,syncNamespace,obj.Name,clusterId) + deleteDestinationRuleByName(ctx, rc, syncNamespace, obj.Name, clusterId) } else { - exist, _ := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Get(obj.Name, v12.GetOptions{}) - addUpdateDestinationRule(obj, exist, syncNamespace, rc) + exist, _ := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Get(ctx, obj.Name, v12.GetOptions{}) + addUpdateDestinationRule(ctx, obj, exist, syncNamespace, rc) } } } } -func handleVirtualServiceEvent(obj *v1alpha3.VirtualService, vh *VirtualServiceHandler, event common.Event, resourceType common.ResourceType) error { +func handleVirtualServiceEvent(ctx context.Context, obj *v1alpha3.VirtualService, vh *VirtualServiceHandler, event common.Event, resourceType common.ResourceType) error { log.Infof(LogFormat, "Event", resourceType, obj.Name, vh.ClusterID, "Received event") + //nolint virtualService := obj.Spec clusterId := vh.ClusterID @@ -372,7 +377,7 @@ func handleVirtualServiceEvent(obj *v1alpha3.VirtualService, vh *VirtualServiceH //check if this virtual service is used by Argo rollouts for canary strategy, if so, update the corresponding SE with appropriate weights if common.GetAdmiralParams().ArgoRolloutsEnabled { - rollouts, err := vh.RemoteRegistry.GetRemoteController(clusterId).RolloutController.RolloutClient.Rollouts(obj.Namespace).List(v12.ListOptions{}) + rollouts, err := vh.RemoteRegistry.GetRemoteController(clusterId).RolloutController.RolloutClient.Rollouts(obj.Namespace).List(ctx, v12.ListOptions{}) if err != nil { log.Errorf(LogErrFormat, "Get", "Rollout", "Error finding rollouts in namespace="+obj.Namespace, clusterId, err) @@ -380,7 +385,7 @@ func handleVirtualServiceEvent(obj *v1alpha3.VirtualService, vh *VirtualServiceH if len(rollouts.Items) > 0 { for _, rollout := range rollouts.Items { if rollout.Spec.Strategy.Canary != nil && rollout.Spec.Strategy.Canary.TrafficRouting != nil && rollout.Spec.Strategy.Canary.TrafficRouting.Istio != nil && rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name == obj.Name { - HandleEventForRollout(admiral.Update, &rollout, vh.RemoteRegistry, clusterId) + HandleEventForRollout(ctx, admiral.Update, &rollout, vh.RemoteRegistry, clusterId) } } } @@ -400,13 +405,13 @@ func handleVirtualServiceEvent(obj *v1alpha3.VirtualService, vh *VirtualServiceH log.Infof(LogFormat, "Event", "VirtualService", obj.Name, clusterId, "Processing") if event == common.Delete { - err:= deleteVirtualService(rc,syncNamespace,obj.Name,clusterId) - if nil!= err { + err := deleteVirtualService(ctx, rc, syncNamespace, obj.Name, clusterId) + if nil != err { return err } } else { - exist, _ := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(obj.Name, v12.GetOptions{}) + exist, _ := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(ctx, obj.Name, v12.GetOptions{}) //change destination host for all http routes .. to same as host on the virtual service for _, httpRoute := range virtualService.Http { @@ -427,7 +432,7 @@ func handleVirtualServiceEvent(obj *v1alpha3.VirtualService, vh *VirtualServiceH } } - addUpdateVirtualService(obj, exist, syncNamespace, rc) + addUpdateVirtualService(ctx, obj, exist, syncNamespace, rc) } } } @@ -443,43 +448,45 @@ func handleVirtualServiceEvent(obj *v1alpha3.VirtualService, vh *VirtualServiceH if ClusterID != clusterId { rc := r.GetRemoteController(ClusterID) if event == common.Delete { - err:= deleteVirtualService(rc,syncNamespace,obj.Name,clusterId) - if nil!= err { + err := deleteVirtualService(ctx, rc, syncNamespace, obj.Name, clusterId) + if nil != err { return err } } else { - exist, _ := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(obj.Name, v12.GetOptions{}) - addUpdateVirtualService(obj, exist, syncNamespace, rc) + exist, _ := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(ctx, obj.Name, v12.GetOptions{}) + addUpdateVirtualService(ctx, obj, exist, syncNamespace, rc) } } } return nil } + /* -Add/Update Virtual service after checking if the current pod is in ReadOnly mode. -Virtual Service object is not added/updated if the current pod is in ReadOnly mode. + Add/Update Virtual service after checking if the current pod is in ReadOnly mode. + Virtual Service object is not added/updated if the current pod is in ReadOnly mode. */ -func addUpdateVirtualService(obj *v1alpha3.VirtualService, exist *v1alpha3.VirtualService, namespace string, rc *RemoteController) { +func addUpdateVirtualService(ctx context.Context, obj *v1alpha3.VirtualService, exist *v1alpha3.VirtualService, namespace string, rc *RemoteController) { var err error var op string if obj.Annotations == nil { obj.Annotations = map[string]string{} } obj.Annotations["app.kubernetes.io/created-by"] = "admiral" - vsIsNew:= (exist == nil || len(exist.Spec.Hosts) == 0) + vsIsNew := (exist == nil || len(exist.Spec.Hosts) == 0) if vsIsNew { obj.Namespace = namespace obj.ResourceVersion = "" - _, err = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(namespace).Create(obj) + _, err = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(namespace).Create(ctx, obj, v12.CreateOptions{}) op = "Add" } else { exist.Labels = obj.Labels exist.Annotations = obj.Annotations + //nolint exist.Spec = obj.Spec op = "Update" - _, err = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(namespace).Update(exist) + _, err = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(namespace).Update(ctx, exist, v12.UpdateOptions{}) } if err != nil { @@ -492,7 +499,7 @@ func addUpdateVirtualService(obj *v1alpha3.VirtualService, exist *v1alpha3.Virtu func validateAndProcessServiceEntryEndpoints(obj *v1alpha3.ServiceEntry) bool { var areEndpointsValid = true - temp := make([]*v1alpha32.ServiceEntry_Endpoint, 0) + temp := make([]*v1alpha32.WorkloadEntry, 0) for _, endpoint := range obj.Spec.Endpoints { if endpoint.Address == "dummy.admiral.global" { areEndpointsValid = false @@ -507,10 +514,11 @@ func validateAndProcessServiceEntryEndpoints(obj *v1alpha3.ServiceEntry) bool { } /* -Add/Update Service Entry objects after checking if the current pod is in ReadOnly mode. -Service Entry object is not added/updated if the current pod is in ReadOnly mode. + Add/Update Service Entry objects after checking if the current pod is in ReadOnly mode. + Service Entry object is not added/updated if the current pod is in ReadOnly mode. */ -func addUpdateServiceEntry(obj *v1alpha3.ServiceEntry, exist *v1alpha3.ServiceEntry, namespace string, rc *RemoteController) { +func addUpdateServiceEntry(ctx context.Context, obj *v1alpha3.ServiceEntry, exist *v1alpha3.ServiceEntry, + namespace string, rc *RemoteController) { var err error var op, diff string var skipUpdate bool @@ -521,14 +529,14 @@ func addUpdateServiceEntry(obj *v1alpha3.ServiceEntry, exist *v1alpha3.ServiceEn areEndpointsValid := validateAndProcessServiceEntryEndpoints(obj) - seIsNew:= (exist == nil || exist.Spec.Hosts == nil) + seIsNew := exist == nil || exist.Spec.Hosts == nil if seIsNew { op = "Add" //se will be created if endpoints are valid, in case they are not valid se will be created with just valid endpoints if len(obj.Spec.Endpoints) > 0 { obj.Namespace = namespace obj.ResourceVersion = "" - _, err = rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(namespace).Create(obj) + _, err = rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(namespace).Create(ctx, obj, v12.CreateOptions{}) log.Infof(LogFormat+" SE=%s", op, "ServiceEntry", obj.Name, rc.ClusterID, "New SE", obj.Spec.String()) } else { log.Errorf(LogFormat+" SE=%s", op, "ServiceEntry", obj.Name, rc.ClusterID, "Creation of SE skipped as endpoints are not valid", obj.Spec.String()) @@ -545,8 +553,9 @@ func addUpdateServiceEntry(obj *v1alpha3.ServiceEntry, exist *v1alpha3.ServiceEn log.Infof(LogFormat, op, "ServiceEntry", obj.Name, rc.ClusterID, "Update skipped as it was destructive during Admiral's bootup phase") return } else { + //nolint exist.Spec = obj.Spec - _, err = rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(namespace).Update(exist) + _, err = rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(namespace).Update(ctx, exist, v12.UpdateOptions{}) } } @@ -579,10 +588,12 @@ func getServiceEntryDiff(new *v1alpha3.ServiceEntry, old *v1alpha3.ServiceEntry) destructive = false format := "%s %s before: %v, after: %v;" var buffer bytes.Buffer + //nolint seNew := new.Spec + //nolint seOld := old.Spec - oldEndpointMap := make(map[string]*v1alpha32.ServiceEntry_Endpoint) + oldEndpointMap := make(map[string]*v1alpha32.WorkloadEntry) found := make(map[string]string) for _, oEndpoint := range seOld.Endpoints { oldEndpointMap[oEndpoint.Address] = oEndpoint @@ -590,7 +601,7 @@ func getServiceEntryDiff(new *v1alpha3.ServiceEntry, old *v1alpha3.ServiceEntry) for _, nEndpoint := range seNew.Endpoints { if val, ok := oldEndpointMap[nEndpoint.Address]; ok { found[nEndpoint.Address] = "1" - if !reflect.DeepEqual(val, nEndpoint) { + if !cmp.Equal(val, nEndpoint, protocmp.Transform()) { destructive = true buffer.WriteString(fmt.Sprintf(format, "endpoint", "Update", val.String(), nEndpoint.String())) } @@ -610,9 +621,9 @@ func getServiceEntryDiff(new *v1alpha3.ServiceEntry, old *v1alpha3.ServiceEntry) return destructive, diff } -func deleteServiceEntry(exist *v1alpha3.ServiceEntry, namespace string, rc *RemoteController) { +func deleteServiceEntry(ctx context.Context, exist *v1alpha3.ServiceEntry, namespace string, rc *RemoteController) { if exist != nil { - err := rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(namespace).Delete(exist.Name, &v12.DeleteOptions{}) + err := rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(namespace).Delete(ctx, exist.Name, v12.DeleteOptions{}) if err != nil { log.Errorf(LogErrFormat, "Delete", "ServiceEntry", exist.Name, rc.ClusterID, err) } else { @@ -621,25 +632,27 @@ func deleteServiceEntry(exist *v1alpha3.ServiceEntry, namespace string, rc *Remo } } -func addUpdateDestinationRule(obj *v1alpha3.DestinationRule, exist *v1alpha3.DestinationRule, namespace string, rc *RemoteController) { +func addUpdateDestinationRule(ctx context.Context, obj *v1alpha3.DestinationRule, exist *v1alpha3.DestinationRule, + namespace string, rc *RemoteController) { var err error var op string if obj.Annotations == nil { obj.Annotations = map[string]string{} } obj.Annotations["app.kubernetes.io/created-by"] = "admiral" - drIsNew:=(exist == nil || exist.Name == "" || exist.Spec.Host == "") + drIsNew := (exist == nil || exist.Name == "" || exist.Spec.Host == "") if drIsNew { obj.Namespace = namespace obj.ResourceVersion = "" - _, err = rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(namespace).Create(obj) + _, err = rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(namespace).Create(ctx, obj, v12.CreateOptions{}) op = "Add" } else { exist.Labels = obj.Labels exist.Annotations = obj.Annotations + //nolint exist.Spec = obj.Spec op = "Update" - _, err = rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(namespace).Update(exist) + _, err = rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(namespace).Update(ctx, exist, v12.UpdateOptions{}) } if err != nil { @@ -649,9 +662,10 @@ func addUpdateDestinationRule(obj *v1alpha3.DestinationRule, exist *v1alpha3.Des } } -func deleteDestinationRule(exist *v1alpha3.DestinationRule, namespace string, rc *RemoteController) { +func deleteDestinationRule(ctx context.Context, exist *v1alpha3.DestinationRule, + namespace string, rc *RemoteController) { if exist != nil { - err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(namespace).Delete(exist.Name, &v12.DeleteOptions{}) + err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(namespace).Delete(ctx, exist.Name, v12.DeleteOptions{}) if err != nil { log.Errorf(LogErrFormat, "Delete", "DestinationRule", exist.Name, rc.ClusterID, err) } else { @@ -659,14 +673,18 @@ func deleteDestinationRule(exist *v1alpha3.DestinationRule, namespace string, rc } } } + +//nolint func createServiceEntrySkeletion(se v1alpha32.ServiceEntry, name string, namespace string) *v1alpha3.ServiceEntry { return &v1alpha3.ServiceEntry{Spec: se, ObjectMeta: v12.ObjectMeta{Name: name, Namespace: namespace}} } +//nolint func createSidecarSkeletion(sidecar v1alpha32.Sidecar, name string, namespace string) *v1alpha3.Sidecar { return &v1alpha3.Sidecar{Spec: sidecar, ObjectMeta: v12.ObjectMeta{Name: name, Namespace: namespace}} } +//nolint func createDestinationRuleSkeletion(dr v1alpha32.DestinationRule, name string, namespace string) *v1alpha3.DestinationRule { return &v1alpha3.DestinationRule{Spec: dr, ObjectMeta: v12.ObjectMeta{Name: name, Namespace: namespace}} } @@ -725,18 +743,18 @@ func getDependentClusters(dependents map[string]string, identityClusterCache *co return dependentClusters } -func copyEndpoint(e *v1alpha32.ServiceEntry_Endpoint) *v1alpha32.ServiceEntry_Endpoint { +func copyEndpoint(e *v1alpha32.WorkloadEntry) *v1alpha32.WorkloadEntry { labels := make(map[string]string) util.MapCopy(labels, e.Labels) ports := make(map[string]uint32) util.MapCopy(ports, e.Ports) - return &v1alpha32.ServiceEntry_Endpoint{Address: e.Address, Ports: ports, Locality: e.Locality, Labels: labels} + return &v1alpha32.WorkloadEntry{Address: e.Address, Ports: ports, Locality: e.Locality, Labels: labels} } // A rollout can use one of 2 stratergies :- // 1. Canary strategy - which can use a virtual service to manage the weights associated with a stable and canary service. Admiral created endpoints in service entries will use the weights assigned in the Virtual Service // 2. Blue green strategy- this contains 2 service instances in a namespace, an active service and a preview service. Admiral will use repective service to create active and preview endpoints -func getServiceForRollout(rc *RemoteController, rollout *argo.Rollout) map[string]*WeightedService { +func getServiceForRollout(ctx context.Context, rc *RemoteController, rollout *argo.Rollout) map[string]*WeightedService { if rollout == nil { return nil @@ -795,7 +813,7 @@ func getServiceForRollout(rc *RemoteController, rollout *argo.Rollout) map[strin } virtualServiceName := rolloutStrategy.Canary.TrafficRouting.Istio.VirtualService.Name - virtualService, err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(rollout.Namespace).Get(virtualServiceName, v12.GetOptions{}) + virtualService, err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(rollout.Namespace).Get(ctx, virtualServiceName, v12.GetOptions{}) if err != nil { log.Warnf("Error fetching VirtualService referenced in rollout canary for rollout with name=%s in namespace=%s and cluster=%s err=%v", rollout.Name, rollout.Namespace, rc.ClusterID, err) @@ -806,6 +824,7 @@ func getServiceForRollout(rc *RemoteController, rollout *argo.Rollout) map[strin } if virtualService != nil { + //nolint var vs = virtualService.Spec if len(vs.Http) > 0 { var httpRoute *v1alpha32.HTTPRoute @@ -901,8 +920,8 @@ func getServiceForRollout(rc *RemoteController, rollout *argo.Rollout) map[strin return matchedServices } -func deleteDestinationRuleByName(rc *RemoteController,syncNamespace string, objName string, clusterId string){ - err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Delete(objName, &v12.DeleteOptions{}) +func deleteDestinationRuleByName(ctx context.Context, rc *RemoteController, syncNamespace string, objName string, clusterId string) { + err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Delete(ctx, objName, v12.DeleteOptions{}) if err != nil { log.Infof(LogErrFormat, "Delete", "DestinationRule", objName, clusterId, err) @@ -911,8 +930,8 @@ func deleteDestinationRuleByName(rc *RemoteController,syncNamespace string, objN } } -func deleteServiceEntries(rc *RemoteController,syncNamespace string, objName string, clusterId string){ - err := rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(syncNamespace).Delete(objName, &v12.DeleteOptions{}) +func deleteServiceEntries(ctx context.Context, rc *RemoteController, syncNamespace string, objName string, clusterId string) { + err := rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(syncNamespace).Delete(ctx, objName, v12.DeleteOptions{}) if err != nil { log.Infof(LogErrFormat, "Delete", "ServiceEntry", objName, clusterId, err) } else { @@ -921,8 +940,8 @@ func deleteServiceEntries(rc *RemoteController,syncNamespace string, objName str } -func deleteVirtualService(rc *RemoteController,syncNamespace string, objName string, clusterId string) (e error){ - err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(objName, &v12.DeleteOptions{}) +func deleteVirtualService(ctx context.Context, rc *RemoteController, syncNamespace string, objName string, clusterId string) error { + err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, objName, v12.DeleteOptions{}) if err != nil { log.Infof(LogErrFormat, "Delete", "VirtualService", objName, clusterId, err) return err diff --git a/admiral/pkg/clusters/handler_test.go b/admiral/pkg/clusters/handler_test.go index 70ccedb9..9d4de4bb 100644 --- a/admiral/pkg/clusters/handler_test.go +++ b/admiral/pkg/clusters/handler_test.go @@ -1,13 +1,15 @@ package clusters import ( + "context" "reflect" "strings" "testing" "time" argo "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" - "github.com/gogo/protobuf/types" + "github.com/golang/protobuf/ptypes/duration" + "github.com/golang/protobuf/ptypes/wrappers" "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/admiral" @@ -15,13 +17,14 @@ import ( "github.com/istio-ecosystem/admiral/admiral/pkg/controller/istio" "github.com/istio-ecosystem/admiral/admiral/pkg/test" "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/testing/protocmp" "istio.io/api/networking/v1alpha3" v1alpha32 "istio.io/client-go/pkg/apis/networking/v1alpha3" istiofake "istio.io/client-go/pkg/clientset/versioned/fake" coreV1 "k8s.io/api/core/v1" k8sV1 "k8s.io/api/core/v1" k8sv1 "k8s.io/apimachinery/pkg/apis/meta/v1" - v12 "k8s.io/apimachinery/pkg/apis/meta/v1" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" ) @@ -77,7 +80,7 @@ func TestGetDependentClusters(t *testing.T) { identityClusterCache: identityClusterCache, sourceServices: map[string]*k8sV1.Service{ "cl99": &k8sV1.Service{ - ObjectMeta: v12.ObjectMeta{ + ObjectMeta: metaV1.ObjectMeta{ Name: "testservice", }, }, @@ -175,14 +178,14 @@ func TestIgnoreIstioResource(t *testing.T) { func TestGetDestinationRule(t *testing.T) { //Do setup here outlierDetection := &v1alpha3.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: 300}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: 50}, - Interval: &types.Duration{Seconds: 60}, + BaseEjectionTime: &duration.Duration{Seconds: 300}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: 50}, + Interval: &duration.Duration{Seconds: 60}, MaxEjectionPercent: 100, } - mTLS := &v1alpha3.TrafficPolicy{Tls: &v1alpha3.TLSSettings{Mode: v1alpha3.TLSSettings_ISTIO_MUTUAL}, OutlierDetection: outlierDetection} + mTLS := &v1alpha3.TrafficPolicy{Tls: &v1alpha3.ClientTLSSettings{Mode: v1alpha3.ClientTLSSettings_ISTIO_MUTUAL}, OutlierDetection: outlierDetection} - se := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + se := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "east.com", Locality: "us-east-2"}, {Address: "west.com", Locality: "us-west-2"}, }} noGtpDr := v1alpha3.DestinationRule{ @@ -193,7 +196,7 @@ func TestGetDestinationRule(t *testing.T) { basicGtpDr := v1alpha3.DestinationRule{ Host: "qa.myservice.global", TrafficPolicy: &v1alpha3.TrafficPolicy{ - Tls: &v1alpha3.TLSSettings{Mode: v1alpha3.TLSSettings_ISTIO_MUTUAL}, + Tls: &v1alpha3.ClientTLSSettings{Mode: v1alpha3.ClientTLSSettings_ISTIO_MUTUAL}, LoadBalancer: &v1alpha3.LoadBalancerSettings{ LbPolicy: &v1alpha3.LoadBalancerSettings_Simple{Simple: v1alpha3.LoadBalancerSettings_ROUND_ROBIN}, LocalityLbSetting: &v1alpha3.LocalityLoadBalancerSetting{}, @@ -205,7 +208,7 @@ func TestGetDestinationRule(t *testing.T) { failoverGtpDr := v1alpha3.DestinationRule{ Host: "qa.myservice.global", TrafficPolicy: &v1alpha3.TrafficPolicy{ - Tls: &v1alpha3.TLSSettings{Mode: v1alpha3.TLSSettings_ISTIO_MUTUAL}, + Tls: &v1alpha3.ClientTLSSettings{Mode: v1alpha3.ClientTLSSettings_ISTIO_MUTUAL}, LoadBalancer: &v1alpha3.LoadBalancerSettings{ LbPolicy: &v1alpha3.LoadBalancerSettings_Simple{Simple: v1alpha3.LoadBalancerSettings_ROUND_ROBIN}, LocalityLbSetting: &v1alpha3.LocalityLoadBalancerSetting{ @@ -287,7 +290,7 @@ func TestGetDestinationRule(t *testing.T) { for _, c := range testCases { t.Run(c.name, func(t *testing.T) { result := getDestinationRule(c.se, c.locality, c.gtpPolicy) - if !cmp.Equal(result, c.destinationRule) { + if !cmp.Equal(result, c.destinationRule, protocmp.Transform()) { t.Fatalf("DestinationRule Mismatch. Diff: %v", cmp.Diff(result, c.destinationRule)) } }) @@ -297,16 +300,16 @@ func TestGetDestinationRule(t *testing.T) { func TestGetOutlierDetection(t *testing.T) { //Do setup here outlierDetection := &v1alpha3.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: DefaultBaseEjectionTime}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, - Interval: &types.Duration{Seconds: DefaultInterval}, + BaseEjectionTime: &duration.Duration{Seconds: DefaultBaseEjectionTime}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, + Interval: &duration.Duration{Seconds: DefaultInterval}, MaxEjectionPercent: 100, } outlierDetectionOneHostRemote := &v1alpha3.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: DefaultBaseEjectionTime}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, - Interval: &types.Duration{Seconds: DefaultInterval}, + BaseEjectionTime: &duration.Duration{Seconds: DefaultBaseEjectionTime}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, + Interval: &duration.Duration{Seconds: DefaultInterval}, MaxEjectionPercent: 34, } @@ -320,19 +323,19 @@ func TestGetOutlierDetection(t *testing.T) { }, } - se := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + se := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "east.com", Locality: "us-east-2"}, {Address: "west.com", Locality: "us-west-2"}, }} - seOneHostRemote := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + seOneHostRemote := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "east.com", Locality: "us-east-2"}, }} - seOneHostLocal := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + seOneHostLocal := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "hello.ns.svc.cluster.local", Locality: "us-east-2"}, }} - seOneHostRemoteIp := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + seOneHostRemoteIp := &v1alpha3.ServiceEntry{Hosts: []string{"qa.myservice.global"}, Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "95.45.25.34", Locality: "us-east-2"}, }} @@ -404,9 +407,9 @@ func TestGetOutlierDetection(t *testing.T) { }, }, outlierDetection: &v1alpha3.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: DefaultBaseEjectionTime}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: 10}, - Interval: &types.Duration{Seconds: 60}, + BaseEjectionTime: &duration.Duration{Seconds: DefaultBaseEjectionTime}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: 10}, + Interval: &duration.Duration{Seconds: 60}, MaxEjectionPercent: 100, }, }, @@ -428,9 +431,9 @@ func TestGetOutlierDetection(t *testing.T) { }, }, outlierDetection: &v1alpha3.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: 600}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, - Interval: &types.Duration{Seconds: 60}, + BaseEjectionTime: &duration.Duration{Seconds: 600}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: DefaultConsecutiveGatewayErrors}, + Interval: &duration.Duration{Seconds: 60}, MaxEjectionPercent: 100, }, }, @@ -452,9 +455,9 @@ func TestGetOutlierDetection(t *testing.T) { }, }, outlierDetection: &v1alpha3.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: 600}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: 50}, - Interval: &types.Duration{Seconds: DefaultInterval}, + BaseEjectionTime: &duration.Duration{Seconds: 600}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: 50}, + Interval: &duration.Duration{Seconds: DefaultInterval}, MaxEjectionPercent: 100, }, }, @@ -477,9 +480,9 @@ func TestGetOutlierDetection(t *testing.T) { }, }, outlierDetection: &v1alpha3.OutlierDetection{ - BaseEjectionTime: &types.Duration{Seconds: 600}, - ConsecutiveGatewayErrors: &types.UInt32Value{Value: 10}, - Interval: &types.Duration{Seconds: 60}, + BaseEjectionTime: &duration.Duration{Seconds: 600}, + ConsecutiveGatewayErrors: &wrappers.UInt32Value{Value: 10}, + Interval: &duration.Duration{Seconds: 60}, MaxEjectionPercent: 100, }, }, @@ -489,7 +492,7 @@ func TestGetOutlierDetection(t *testing.T) { for _, c := range testCases { t.Run(c.name, func(t *testing.T) { result := getOutlierDetection(c.se, c.locality, c.gtpPolicy) - if !cmp.Equal(result, c.outlierDetection) { + if !cmp.Equal(result, c.outlierDetection, protocmp.Transform()) { t.Fatalf("OutlierDetection Mismatch. Diff: %v", cmp.Diff(result, c.outlierDetection)) } }) @@ -546,16 +549,16 @@ func TestHandleVirtualServiceEvent(t *testing.T) { handlerEmptyClient := VirtualServiceHandler{ RemoteRegistry: rr1, } - + ctx := context.Background() fullFakeIstioClient := istiofake.NewSimpleClientset() - fullFakeIstioClient.NetworkingV1alpha3().VirtualServices("ns").Create(&v1alpha32.VirtualService{ - ObjectMeta: v12.ObjectMeta{ + fullFakeIstioClient.NetworkingV1alpha3().VirtualServices("ns").Create(ctx, &v1alpha32.VirtualService{ + ObjectMeta: metaV1.ObjectMeta{ Name: "vs-name", }, Spec: v1alpha3.VirtualService{ Hosts: []string{"e2e.blah.global"}, }, - }) + }, metaV1.CreateOptions{}) rr2 := NewRemoteRegistry(nil, common.AdmiralParams{}) rr2.AdmiralCache = &AdmiralCache{ CnameDependentClusterCache: goodCnameCache, @@ -640,7 +643,7 @@ func TestHandleVirtualServiceEvent(t *testing.T) { //Run the test for every provided case for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - err := handleVirtualServiceEvent(c.vs, c.handler, c.event, common.VirtualService) + err := handleVirtualServiceEvent(ctx, c.vs, c.handler, c.event, common.VirtualService) if err != c.expectedError { t.Fatalf("Error mismatch, expected %v but got %v", c.expectedError, err) } @@ -689,7 +692,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { ports := []coreV1.ServicePort{{Port: 8080}, {Port: 8081}} service := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: ServiceName, Namespace: Namespace, CreationTimestamp: v12.NewTime(time.Now())}, + ObjectMeta: metaV1.ObjectMeta{Name: ServiceName, Namespace: Namespace, CreationTimestamp: metaV1.NewTime(time.Now())}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: ports, @@ -698,7 +701,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { // namespace1 Services service1 := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: "dummy1", Namespace: "namespace1", CreationTimestamp: v12.NewTime(time.Now())}, + ObjectMeta: metaV1.ObjectMeta{Name: "dummy1", Namespace: "namespace1", CreationTimestamp: metaV1.NewTime(time.Now())}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: []coreV1.ServicePort{{ @@ -714,7 +717,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { // namespace4 Services service3 := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: "dummy3", Namespace: "namespace4", CreationTimestamp: v12.NewTime(time.Now())}, + ObjectMeta: metaV1.ObjectMeta{Name: "dummy3", Namespace: "namespace4", CreationTimestamp: metaV1.NewTime(time.Now())}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: []coreV1.ServicePort{{ @@ -729,7 +732,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { } service4 := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: "dummy4", Namespace: "namespace4", CreationTimestamp: v12.NewTime(time.Now())}, + ObjectMeta: metaV1.ObjectMeta{Name: "dummy4", Namespace: "namespace4", CreationTimestamp: metaV1.NewTime(time.Now())}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: []coreV1.ServicePort{{ @@ -742,7 +745,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { // namespace Services stableService := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: StableServiceName, Namespace: Namespace, CreationTimestamp: v12.NewTime(time.Now().Add(time.Duration(-15)))}, + ObjectMeta: metaV1.ObjectMeta{Name: StableServiceName, Namespace: Namespace, CreationTimestamp: metaV1.NewTime(time.Now().Add(time.Duration(-15)))}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: ports, @@ -750,7 +753,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { } generatedStableService := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: GeneratedStableServiceName, Namespace: Namespace, CreationTimestamp: v12.NewTime(time.Now().Add(time.Duration(-15)))}, + ObjectMeta: metaV1.ObjectMeta{Name: GeneratedStableServiceName, Namespace: Namespace, CreationTimestamp: metaV1.NewTime(time.Now().Add(time.Duration(-15)))}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: ports, @@ -758,7 +761,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { } canaryService := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: CanaryServiceName, Namespace: Namespace, CreationTimestamp: v12.NewTime(time.Now().Add(time.Duration(-15)))}, + ObjectMeta: metaV1.ObjectMeta{Name: CanaryServiceName, Namespace: Namespace, CreationTimestamp: metaV1.NewTime(time.Now().Add(time.Duration(-15)))}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: ports, @@ -766,7 +769,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { } latestMatchingService := &coreV1.Service{ - ObjectMeta: v12.ObjectMeta{Name: LatestMatchingService, Namespace: Namespace, CreationTimestamp: v12.NewTime(time.Now())}, + ObjectMeta: metaV1.ObjectMeta{Name: LatestMatchingService, Namespace: Namespace, CreationTimestamp: metaV1.NewTime(time.Now())}, Spec: coreV1.ServiceSpec{ Selector: selectorMap, Ports: ports, @@ -783,7 +786,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { rcTemp.ServiceController.Cache.Put(latestMatchingService) virtualService := &v1alpha32.VirtualService{ - ObjectMeta: v12.ObjectMeta{Name: VS_NAME_1, Namespace: Namespace}, + ObjectMeta: metaV1.ObjectMeta{Name: VS_NAME_1, Namespace: Namespace}, Spec: v1alpha3.VirtualService{ Http: []*v1alpha3.HTTPRoute{{Route: []*v1alpha3.HTTPRouteDestination{ {Destination: &v1alpha3.Destination{Host: StableServiceName}, Weight: 80}, @@ -793,7 +796,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { } vsMutipleRoutesWithMatch := &v1alpha32.VirtualService{ - ObjectMeta: v12.ObjectMeta{Name: VS_NAME_2, Namespace: Namespace}, + ObjectMeta: metaV1.ObjectMeta{Name: VS_NAME_2, Namespace: Namespace}, Spec: v1alpha3.VirtualService{ Http: []*v1alpha3.HTTPRoute{{Name: VS_ROUTE_PRIMARY, Route: []*v1alpha3.HTTPRouteDestination{ {Destination: &v1alpha3.Destination{Host: StableServiceName}, Weight: 80}, @@ -803,7 +806,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { } vsMutipleRoutesWithZeroWeight := &v1alpha32.VirtualService{ - ObjectMeta: v12.ObjectMeta{Name: VS_NAME_4, Namespace: Namespace}, + ObjectMeta: metaV1.ObjectMeta{Name: VS_NAME_4, Namespace: Namespace}, Spec: v1alpha3.VirtualService{ Http: []*v1alpha3.HTTPRoute{{Name: "random", Route: []*v1alpha3.HTTPRouteDestination{ {Destination: &v1alpha3.Destination{Host: StableServiceName}, Weight: 100}, @@ -811,10 +814,10 @@ func TestGetServiceForRolloutCanary(t *testing.T) { }}}, }, } - - rcTemp.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(Namespace).Create(virtualService) - rcTemp.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(Namespace).Create(vsMutipleRoutesWithMatch) - rcTemp.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(Namespace).Create(vsMutipleRoutesWithZeroWeight) + ctx := context.Background() + rcTemp.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(Namespace).Create(ctx, virtualService, metaV1.CreateOptions{}) + rcTemp.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(Namespace).Create(ctx, vsMutipleRoutesWithMatch, metaV1.CreateOptions{}) + rcTemp.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(Namespace).Create(ctx, vsMutipleRoutesWithZeroWeight, metaV1.CreateOptions{}) canaryRollout := argo.Rollout{ Spec: argo.RolloutSpec{Template: coreV1.PodTemplateSpec{ @@ -823,7 +826,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { matchLabel := make(map[string]string) matchLabel["app"] = "test" - labelSelector := v12.LabelSelector{ + labelSelector := metaV1.LabelSelector{ MatchLabels: matchLabel, } canaryRollout.Spec.Selector = &labelSelector @@ -840,7 +843,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { matchLabel2 := make(map[string]string) matchLabel2["app"] = "test1" - labelSelector2 := v12.LabelSelector{ + labelSelector2 := metaV1.LabelSelector{ MatchLabels: matchLabel2, } canaryRolloutNS1.Spec.Selector = &labelSelector2 @@ -856,7 +859,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { }}} matchLabel4 := make(map[string]string) matchLabel4["app"] = "test" - labelSelector4 := v12.LabelSelector{ + labelSelector4 := metaV1.LabelSelector{ MatchLabels: matchLabel4, } canaryRolloutNS4.Spec.Selector = &labelSelector4 @@ -878,7 +881,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { CanaryService: CanaryServiceName, TrafficRouting: &argo.RolloutTrafficRouting{ Istio: &argo.IstioTrafficRouting{ - VirtualService: argo.IstioVirtualService{Name: VS_NAME_1}, + VirtualService: &argo.IstioVirtualService{Name: VS_NAME_1}, }, }, }, @@ -897,7 +900,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { CanaryService: CanaryServiceName, TrafficRouting: &argo.RolloutTrafficRouting{ Istio: &argo.IstioTrafficRouting{ - VirtualService: argo.IstioVirtualService{Name: VS_NAME_2, Routes: []string{VS_ROUTE_PRIMARY}}, + VirtualService: &argo.IstioVirtualService{Name: VS_NAME_2, Routes: []string{VS_ROUTE_PRIMARY}}, }, }, }, @@ -916,7 +919,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { CanaryService: CanaryServiceName, TrafficRouting: &argo.RolloutTrafficRouting{ Istio: &argo.IstioTrafficRouting{ - VirtualService: argo.IstioVirtualService{Name: VS_NAME_2, Routes: []string{"random"}}, + VirtualService: &argo.IstioVirtualService{Name: VS_NAME_2, Routes: []string{"random"}}, }, }, }, @@ -935,7 +938,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { CanaryService: CanaryServiceName, TrafficRouting: &argo.RolloutTrafficRouting{ Istio: &argo.IstioTrafficRouting{ - VirtualService: argo.IstioVirtualService{Name: VS_NAME_4}, + VirtualService: &argo.IstioVirtualService{Name: VS_NAME_4}, }, }, }, @@ -968,7 +971,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { CanaryService: CanaryServiceName, TrafficRouting: &argo.RolloutTrafficRouting{ Istio: &argo.IstioTrafficRouting{ - VirtualService: argo.IstioVirtualService{Name: "random"}, + VirtualService: &argo.IstioVirtualService{Name: "random"}, }, }, }, @@ -1065,7 +1068,7 @@ func TestGetServiceForRolloutCanary(t *testing.T) { //Run the test for every provided case for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - result := getServiceForRollout(c.rc, c.rollout) + result := getServiceForRollout(ctx, c.rc, c.rollout) if len(c.result) == 0 { if result != nil && len(result) != 0 { t.Fatalf("Service expected to be nil") @@ -1122,7 +1125,7 @@ func TestGetServiceForRolloutBlueGreen(t *testing.T) { matchLabel := make(map[string]string) matchLabel["app"] = "test" - labelSelector := v12.LabelSelector{ + labelSelector := metaV1.LabelSelector{ MatchLabels: matchLabel, } bgRollout.Spec.Selector = &labelSelector @@ -1268,7 +1271,7 @@ func TestGetServiceForRolloutBlueGreen(t *testing.T) { matchLabel1 := make(map[string]string) matchLabel1["app"] = "test" - labelSelector1 := v12.LabelSelector{ + labelSelector1 := metaV1.LabelSelector{ MatchLabels: matchLabel, } bgRolloutNs1.Spec.Selector = &labelSelector1 @@ -1327,10 +1330,12 @@ func TestGetServiceForRolloutBlueGreen(t *testing.T) { }, } + ctx := context.Background() + //Run the test for every provided case for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - result := getServiceForRollout(c.rc, c.rollout) + result := getServiceForRollout(ctx, c.rc, c.rollout) if len(c.result) == 0 { if result != nil && len(result) > 0 { t.Fatalf("Service expected to be nil") @@ -1360,7 +1365,7 @@ func TestSkipDestructiveUpdate(t *testing.T) { Location: v1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: v1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global-west", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "dummy.admiral.global-east", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, }, @@ -1374,7 +1379,7 @@ func TestSkipDestructiveUpdate(t *testing.T) { Location: v1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: v1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global-west", Ports: map[string]uint32{"http": 90}, Locality: "us-west-2"}, {Address: "dummy.admiral.global-east", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, }, @@ -1388,34 +1393,39 @@ func TestSkipDestructiveUpdate(t *testing.T) { Location: v1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: v1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global-west", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, }, } newSeTwoEndpoints := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se1", Namespace: "random"}, - Spec: twoEndpointSe, + ObjectMeta: metaV1.ObjectMeta{Name: "se1", Namespace: "random"}, + //nolint + Spec: twoEndpointSe, } newSeTwoEndpointsUpdated := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se1", Namespace: "random"}, - Spec: twoEndpointSeUpdated, + ObjectMeta: metaV1.ObjectMeta{Name: "se1", Namespace: "random"}, + //nolint + Spec: twoEndpointSeUpdated, } newSeOneEndpoint := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se1", Namespace: "random"}, - Spec: oneEndpointSe, + ObjectMeta: metaV1.ObjectMeta{Name: "se1", Namespace: "random"}, + //nolint + Spec: oneEndpointSe, } oldSeTwoEndpoints := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se1", Namespace: "random"}, - Spec: twoEndpointSe, + ObjectMeta: metaV1.ObjectMeta{Name: "se1", Namespace: "random"}, + //nolint + Spec: twoEndpointSe, } oldSeOneEndpoint := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se1", Namespace: "random"}, - Spec: oneEndpointSe, + ObjectMeta: metaV1.ObjectMeta{Name: "se1", Namespace: "random"}, + //nolint + Spec: oneEndpointSe, } rcWarmupPhase := &RemoteController{ @@ -1505,6 +1515,8 @@ func TestSkipDestructiveUpdate(t *testing.T) { func TestAddUpdateServiceEntry(t *testing.T) { + ctx := context.Background() + fakeIstioClient := istiofake.NewSimpleClientset() seCtrl := &istio.ServiceEntryController{ @@ -1519,7 +1531,7 @@ func TestAddUpdateServiceEntry(t *testing.T) { Location: v1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: v1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global-west", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "dummy.admiral.global-east", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, }, @@ -1533,7 +1545,7 @@ func TestAddUpdateServiceEntry(t *testing.T) { Location: v1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: v1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global-west", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, }, } @@ -1546,29 +1558,34 @@ func TestAddUpdateServiceEntry(t *testing.T) { Location: v1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: v1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*v1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "test.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, }, } invalidEndpointSe := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se3", Namespace: "namespace"}, + ObjectMeta: metaV1.ObjectMeta{Name: "se3", Namespace: "namespace"}, //nolint Spec: invalidEndpoint, } newSeOneEndpoint := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se1", Namespace: "namespace"}, - Spec: oneEndpointSe, + ObjectMeta: metaV1.ObjectMeta{Name: "se1", Namespace: "namespace"}, + //nolint + Spec: oneEndpointSe, } oldSeTwoEndpoints := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "se2", Namespace: "namespace"}, - Spec: twoEndpointSe, + ObjectMeta: metaV1.ObjectMeta{Name: "se2", Namespace: "namespace"}, + //nolint + Spec: twoEndpointSe, } - seCtrl.IstioClient.NetworkingV1alpha3().ServiceEntries("namespace").Create(oldSeTwoEndpoints) + _, err := seCtrl.IstioClient.NetworkingV1alpha3().ServiceEntries("namespace").Create(ctx, oldSeTwoEndpoints, metaV1.CreateOptions{}) + if err != nil { + t.Error(err) + } rcWarmupPhase := &RemoteController{ ServiceEntryController: seCtrl, @@ -1621,10 +1638,13 @@ func TestAddUpdateServiceEntry(t *testing.T) { //Run the test for every provided case for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - addUpdateServiceEntry(c.newSe, c.oldSe, "namespace", c.rc) + addUpdateServiceEntry(ctx, c.newSe, c.oldSe, "namespace", c.rc) if c.skipDestructive { //verify the update did not go through - se, _ := c.rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries("namespace").Get(c.oldSe.Name, v12.GetOptions{}) + se, err := c.rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries("namespace").Get(ctx, c.oldSe.Name, metaV1.GetOptions{}) + if err != nil { + t.Error(err) + } _, diff := getServiceEntryDiff(c.oldSe, se) if diff != "" { t.Errorf("Failed. Got %v, expected %v", se.Spec.String(), c.oldSe.Spec.String()) @@ -1634,29 +1654,28 @@ func TestAddUpdateServiceEntry(t *testing.T) { } } - func TestValidateServiceEntryEndpoints(t *testing.T) { - twoValidEndpoints := []*v1alpha3.ServiceEntry_Endpoint{ + twoValidEndpoints := []*v1alpha3.WorkloadEntry{ {Address: "valid1.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "valid2.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, } - oneValidEndpoints := []*v1alpha3.ServiceEntry_Endpoint{ + oneValidEndpoints := []*v1alpha3.WorkloadEntry{ {Address: "valid1.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, } - dummyEndpoints := []*v1alpha3.ServiceEntry_Endpoint{ + dummyEndpoints := []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, } - validAndInvalidEndpoints := []*v1alpha3.ServiceEntry_Endpoint{ + validAndInvalidEndpoints := []*v1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "valid2.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, } twoValidEndpointsSe := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, + ObjectMeta: metaV1.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, Spec: v1alpha3.ServiceEntry{ Hosts: []string{"e2e.my-first-service.mesh"}, Addresses: []string{"240.10.1.1"}, @@ -1670,7 +1689,7 @@ func TestValidateServiceEntryEndpoints(t *testing.T) { } oneValidEndpointsSe := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, + ObjectMeta: metaV1.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, Spec: v1alpha3.ServiceEntry{ Hosts: []string{"e2e.my-first-service.mesh"}, Addresses: []string{"240.10.1.1"}, @@ -1684,7 +1703,7 @@ func TestValidateServiceEntryEndpoints(t *testing.T) { } dummyEndpointsSe := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, + ObjectMeta: metaV1.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, Spec: v1alpha3.ServiceEntry{ Hosts: []string{"e2e.my-first-service.mesh"}, Addresses: []string{"240.10.1.1"}, @@ -1698,7 +1717,7 @@ func TestValidateServiceEntryEndpoints(t *testing.T) { } validAndInvalidEndpointsSe := &v1alpha32.ServiceEntry{ - ObjectMeta: v12.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, + ObjectMeta: metaV1.ObjectMeta{Name: "twoValidEndpointsSe", Namespace: "namespace"}, Spec: v1alpha3.ServiceEntry{ Hosts: []string{"e2e.my-first-service.mesh"}, Addresses: []string{"240.10.1.1"}, @@ -1716,25 +1735,25 @@ func TestValidateServiceEntryEndpoints(t *testing.T) { name string serviceEntry *v1alpha32.ServiceEntry expectedAreEndpointsValid bool - expectedValidEndpoints []*v1alpha3.ServiceEntry_Endpoint + expectedValidEndpoints []*v1alpha3.WorkloadEntry }{ { name: "Validate SE with dummy endpoint", serviceEntry: dummyEndpointsSe, expectedAreEndpointsValid: false, - expectedValidEndpoints: []*v1alpha3.ServiceEntry_Endpoint{}, + expectedValidEndpoints: []*v1alpha3.WorkloadEntry{}, }, { name: "Validate SE with valid endpoint", serviceEntry: oneValidEndpointsSe, expectedAreEndpointsValid: true, - expectedValidEndpoints: []*v1alpha3.ServiceEntry_Endpoint{{Address: "valid1.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}}, + expectedValidEndpoints: []*v1alpha3.WorkloadEntry{{Address: "valid1.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}}, }, { name: "Validate endpoint with multiple valid endpoints", serviceEntry: twoValidEndpointsSe, expectedAreEndpointsValid: true, - expectedValidEndpoints: []*v1alpha3.ServiceEntry_Endpoint{ + expectedValidEndpoints: []*v1alpha3.WorkloadEntry{ {Address: "valid1.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "valid2.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}}, }, @@ -1742,7 +1761,7 @@ func TestValidateServiceEntryEndpoints(t *testing.T) { name: "Validate endpoint with mix of valid and dummy endpoints", serviceEntry: validAndInvalidEndpointsSe, expectedAreEndpointsValid: false, - expectedValidEndpoints: []*v1alpha3.ServiceEntry_Endpoint{ + expectedValidEndpoints: []*v1alpha3.WorkloadEntry{ {Address: "valid2.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}}, }, } @@ -1761,4 +1780,4 @@ func TestValidateServiceEntryEndpoints(t *testing.T) { } }) } -} \ No newline at end of file +} diff --git a/admiral/pkg/clusters/registry.go b/admiral/pkg/clusters/registry.go index 51ef274f..7cc39177 100644 --- a/admiral/pkg/clusters/registry.go +++ b/admiral/pkg/clusters/registry.go @@ -3,11 +3,12 @@ package clusters import ( "context" "fmt" - "github.com/istio-ecosystem/admiral/admiral/pkg/controller/istio" - "k8s.io/client-go/rest" "os" "time" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/istio" + "k8s.io/client-go/rest" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/admiral" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/secret" @@ -16,7 +17,7 @@ import ( const ( LogFormat = "op=%s type=%v name=%v cluster=%s message=%s" - LogFormatAdv = "op=%s type=%v name=%v namespace=%s cluster=%s message=%s" + LogFormatAdv = "op=%s type=%v name=%v namespace=%s cluster=%s message=%s" LogErrFormat = "op=%s type=%v name=%v cluster=%s, e=%v" ) @@ -27,8 +28,8 @@ func InitAdmiral(ctx context.Context, params common.AdmiralParams) (*RemoteRegis common.InitializeConfig(params) //init admiral state - CurrentAdmiralState = AdmiralState{ReadOnly: ReadOnlyEnabled,IsStateInitialized: StateNotInitialized} - startAdmiralStateChecker(ctx,params) + CurrentAdmiralState = AdmiralState{ReadOnly: ReadOnlyEnabled, IsStateInitialized: StateNotInitialized} + startAdmiralStateChecker(ctx, params) pauseForAdmiralToInitializeState() @@ -53,7 +54,7 @@ func InitAdmiral(ctx context.Context, params common.AdmiralParams) (*RemoteRegis return nil, fmt.Errorf("error with configmap controller init: %v", err) } w.AdmiralCache.ConfigMapController = configMapController - loadServiceEntryCacheData(w.AdmiralCache.ConfigMapController, w.AdmiralCache) + loadServiceEntryCacheData(ctx, w.AdmiralCache.ConfigMapController, w.AdmiralCache) err = createSecretController(ctx, w) if err != nil { @@ -93,12 +94,12 @@ func createSecretController(ctx context.Context, w *RemoteRegistry) error { return fmt.Errorf("could not create K8s client: %v", err) } - controller, err = secret.StartSecretController(w.secretClient, + controller, err = secret.StartSecretController(ctx, w.secretClient, w.createCacheController, w.updateCacheController, w.deleteCacheController, common.GetClusterRegistriesNamespace(), - ctx, common.GetSecretResolver(), common.GetSecretResolverConfigPath()) + common.GetSecretResolver(), common.GetSecretResolverConfigPath()) if err != nil { return fmt.Errorf("could not start secret controller: %v", err) @@ -188,9 +189,9 @@ func (r *RemoteRegistry) createCacheController(clientConfig *rest.Config, cluste return fmt.Errorf("error with Rollout controller init: %v", err) } } - + log.Infof("starting Routing Policies controller for custerID: %v", clusterID) - rc.RoutingPolicyController, err = admiral.NewRoutingPoliciesController(stop, &RoutingPolicyHandler{RemoteRegistry: r, ClusterID: clusterID}, clientConfig, 1 * time.Minute) + rc.RoutingPolicyController, err = admiral.NewRoutingPoliciesController(stop, &RoutingPolicyHandler{RemoteRegistry: r, ClusterID: clusterID}, clientConfig, 1*time.Minute) if err != nil { return fmt.Errorf("error with virtualServiceController init: %v", err) diff --git a/admiral/pkg/clusters/registry_test.go b/admiral/pkg/clusters/registry_test.go index 5e02a666..3ab641b5 100644 --- a/admiral/pkg/clusters/registry_test.go +++ b/admiral/pkg/clusters/registry_test.go @@ -2,9 +2,13 @@ package clusters import ( "context" + "strings" + "testing" + "time" + "github.com/google/go-cmp/cmp" depModel "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" - "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" + v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/admiral" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/test" @@ -17,9 +21,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" - "strings" - "testing" - "time" ) func init() { @@ -102,7 +103,7 @@ func TestCopyServiceEntry(t *testing.T) { func TestCopyEndpoint(t *testing.T) { - se := networking.ServiceEntry_Endpoint{ + se := networking.WorkloadEntry{ Address: "127.0.0.1", } @@ -121,6 +122,7 @@ func TestCopySidecar(t *testing.T) { }, } + //nolint sidecar := v1alpha3.Sidecar{Spec: spec} newSidecar := copySidecar(&sidecar) @@ -172,7 +174,8 @@ func createMockRemoteController(f func(interface{})) (*RemoteController, error) }, }, } - d.Added(&deployment) + ctx := context.Background() + d.Added(ctx, &deployment) service := k8sCoreV1.Service{ ObjectMeta: metav1.ObjectMeta{ Name: "test", @@ -185,14 +188,14 @@ func createMockRemoteController(f func(interface{})) (*RemoteController, error) }, }, } - s.Added(&service) + s.Added(ctx, &service) rc := RemoteController{ - DeploymentController: d, - ServiceController: s, - NodeController: n, - ClusterID: "test.cluster", - RolloutController: r, + DeploymentController: d, + ServiceController: s, + NodeController: n, + ClusterID: "test.cluster", + RolloutController: r, RoutingPolicyController: rpc, } return &rc, nil @@ -241,7 +244,7 @@ func TestInitAdmiral(t *testing.T) { } func TestAdded(t *testing.T) { - + ctx := context.Background() p := common.AdmiralParams{ KubeconfigPath: "testdata/fake.config", } @@ -270,8 +273,8 @@ func TestAdded(t *testing.T) { }, } - dh.Added(&depData) - dh.Deleted(&depData) + dh.Added(ctx, &depData) + dh.Deleted(ctx, &depData) } diff --git a/admiral/pkg/clusters/serviceentry.go b/admiral/pkg/clusters/serviceentry.go index 0eef335e..e9c07fe5 100644 --- a/admiral/pkg/clusters/serviceentry.go +++ b/admiral/pkg/clusters/serviceentry.go @@ -1,6 +1,7 @@ package clusters import ( + "context" "errors" "fmt" "math" @@ -12,10 +13,10 @@ import ( "time" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" + "gopkg.in/yaml.v2" argo "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" log "github.com/sirupsen/logrus" - "gopkg.in/yaml.v2" networking "istio.io/api/networking/v1alpha3" "istio.io/client-go/pkg/apis/networking/v1alpha3" k8sAppsV1 "k8s.io/api/apps/v1" @@ -34,7 +35,7 @@ type SeDrTuple struct { DestinationRule *networking.DestinationRule } -func createServiceEntry(event admiral.EventType, rc *RemoteController, admiralCache *AdmiralCache, +func createServiceEntry(ctx context.Context, event admiral.EventType, rc *RemoteController, admiralCache *AdmiralCache, meshPorts map[string]uint32, destDeployment *k8sAppsV1.Deployment, serviceEntries map[string]*networking.ServiceEntry) *networking.ServiceEntry { workloadIdentityKey := common.GetWorkloadIdentifier() @@ -42,7 +43,7 @@ func createServiceEntry(event admiral.EventType, rc *RemoteController, admiralCa //Handling retries for getting/putting service entries from/in cache - address := getUniqueAddress(admiralCache, globalFqdn) + address := getUniqueAddress(ctx, admiralCache, globalFqdn) if len(globalFqdn) == 0 || len(address) == 0 { return nil @@ -54,7 +55,7 @@ func createServiceEntry(event admiral.EventType, rc *RemoteController, admiralCa return tmpSe } -func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, sourceIdentity string, remoteRegistry *RemoteRegistry) map[string]*networking.ServiceEntry { +func modifyServiceEntryForNewServiceOrPod(ctx context.Context, event admiral.EventType, env string, sourceIdentity string, remoteRegistry *RemoteRegistry) map[string]*networking.ServiceEntry { defer util.LogElapsedTime("modifyServiceEntryForNewServiceOrPod", sourceIdentity, env, "")() @@ -120,10 +121,11 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s cname = common.GetCname(deployment, common.GetWorkloadIdentifier(), common.GetHostnameSuffix()) sourceDeployments[rc.ClusterID] = deployment - createServiceEntry(event, rc, remoteRegistry.AdmiralCache, localMeshPorts, deployment, serviceEntries) + createServiceEntry(ctx, event, rc, remoteRegistry.AdmiralCache, localMeshPorts, deployment, serviceEntries) } else if rollout != nil { remoteRegistry.AdmiralCache.IdentityClusterCache.Put(sourceIdentity, rc.ClusterID, rc.ClusterID) - weightedServices = getServiceForRollout(rc, rollout) + weightedServices = getServiceForRollout(ctx, rc, rollout) + if len(weightedServices) == 0 { log.Warnf(LogFormatAdv, "Get", "Service", rollout.Name, rollout.Namespace, rc.ClusterID, "No matching service instance found") continue @@ -140,7 +142,8 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s cname = common.GetCnameForRollout(rollout, common.GetWorkloadIdentifier(), common.GetHostnameSuffix()) cnames[cname] = "1" sourceRollouts[rc.ClusterID] = rollout - createServiceEntryForRollout(event, rc, remoteRegistry.AdmiralCache, localMeshPorts, rollout, serviceEntries) + createServiceEntryForRollout(ctx, event, rc, remoteRegistry.AdmiralCache, localMeshPorts, rollout, serviceEntries) + } else { continue } @@ -154,7 +157,7 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s } else { log.Debugf("No GTPs found for identity=%s in env=%s namespace=%s with key=%s", sourceIdentity, env, namespace, gtpKey) } - + remoteRegistry.AdmiralCache.IdentityClusterCache.Put(sourceIdentity, rc.ClusterID, rc.ClusterID) // workload selector cache is needed for routingPolicy's envoyFilter to match the dependency and apply to the right POD // using service labels @@ -194,7 +197,8 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s for key, serviceEntry := range serviceEntries { if len(serviceEntry.Endpoints) == 0 { - AddServiceEntriesWithDr(remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + AddServiceEntriesWithDr(ctx, remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + map[string]*networking.ServiceEntry{key: serviceEntry}) } clusterIngress, _ := rc.ServiceController.Cache.GetLoadBalancer(common.GetAdmiralParams().LabelSet.GatewayApp, common.NamespaceIstioSystem) @@ -206,7 +210,8 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s oldPorts := ep.Ports updateEndpointsForBlueGreen(sourceRollouts[sourceCluster], sourceWeightedServices[sourceCluster], cnames, ep, sourceCluster, key) - AddServiceEntriesWithDr(remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + AddServiceEntriesWithDr(ctx, remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + map[string]*networking.ServiceEntry{key: serviceEntry}) //swap it back to use for next iteration ep.Address = clusterIngress @@ -216,13 +221,15 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s //add one endpoint per each service, may be modify var se = copyServiceEntry(serviceEntry) updateEndpointsForWeightedServices(se, sourceWeightedServices[sourceCluster], clusterIngress, meshPorts) - AddServiceEntriesWithDr(remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + AddServiceEntriesWithDr(ctx, remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + map[string]*networking.ServiceEntry{key: se}) } else { ep.Address = localFqdn oldPorts := ep.Ports ep.Ports = meshPorts - AddServiceEntriesWithDr(remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + AddServiceEntriesWithDr(ctx, remoteRegistry, map[string]string{sourceCluster: sourceCluster}, + map[string]*networking.ServiceEntry{key: serviceEntry}) //swap it back to use for next iteration ep.Address = clusterIngress @@ -233,7 +240,7 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s } if common.GetWorkloadSidecarUpdate() == "enabled" { - modifySidecarForLocalClusterCommunication(serviceInstance.Namespace, remoteRegistry.AdmiralCache.DependencyNamespaceCache.Get(sourceIdentity), rc) + modifySidecarForLocalClusterCommunication(ctx, serviceInstance.Namespace, remoteRegistry.AdmiralCache.DependencyNamespaceCache.Get(sourceIdentity), rc) } for _, val := range dependents { @@ -255,7 +262,7 @@ func modifyServiceEntryForNewServiceOrPod(event admiral.EventType, env string, s remoteRegistry.AdmiralCache.CnameDependentClusterCache.Put(cname, clusterId, clusterId) } - AddServiceEntriesWithDr(remoteRegistry, dependentClusters, serviceEntries) + AddServiceEntriesWithDr(ctx, remoteRegistry, dependentClusters, serviceEntries) util.LogElapsedTimeSince("WriteServiceEntryToDependentClusters", sourceIdentity, env, "", start) @@ -298,7 +305,7 @@ func updateGlobalGtpCache(cache *AdmiralCache, identity, env string, gtps map[st } func updateEndpointsForBlueGreen(rollout *argo.Rollout, weightedServices map[string]*WeightedService, cnames map[string]string, - ep *networking.ServiceEntry_Endpoint, sourceCluster string, meshHost string) { + ep *networking.WorkloadEntry, sourceCluster string, meshHost string) { activeServiceName := rollout.Spec.Strategy.BlueGreen.ActiveService previewServiceName := rollout.Spec.Strategy.BlueGreen.PreviewService @@ -319,8 +326,8 @@ func updateEndpointsForBlueGreen(rollout *argo.Rollout, weightedServices map[str //update endpoints for Argo rollouts specific Service Entries to account for traffic splitting (Canary strategy) func updateEndpointsForWeightedServices(serviceEntry *networking.ServiceEntry, weightedServices map[string]*WeightedService, clusterIngress string, meshPorts map[string]uint32) { - var endpoints = make([]*networking.ServiceEntry_Endpoint, 0) - var endpointToReplace *networking.ServiceEntry_Endpoint + var endpoints = make([]*networking.WorkloadEntry, 0) + var endpointToReplace *networking.WorkloadEntry //collect all endpoints except the one to replace for _, ep := range serviceEntry.Endpoints { @@ -350,7 +357,7 @@ func updateEndpointsForWeightedServices(serviceEntry *networking.ServiceEntry, w serviceEntry.Endpoints = endpoints } -func modifySidecarForLocalClusterCommunication(sidecarNamespace string, sidecarEgressMap map[string]common.SidecarEgress, rc *RemoteController) { +func modifySidecarForLocalClusterCommunication(ctx context.Context, sidecarNamespace string, sidecarEgressMap map[string]common.SidecarEgress, rc *RemoteController) { //get existing sidecar from the cluster sidecarConfig := rc.SidecarController @@ -359,7 +366,7 @@ func modifySidecarForLocalClusterCommunication(sidecarNamespace string, sidecarE return } - sidecar, _ := sidecarConfig.IstioClient.NetworkingV1alpha3().Sidecars(sidecarNamespace).Get(common.GetWorkloadSidecarName(), v12.GetOptions{}) + sidecar, _ := sidecarConfig.IstioClient.NetworkingV1alpha3().Sidecars(sidecarNamespace).Get(ctx, common.GetWorkloadSidecarName(), v12.GetOptions{}) if sidecar == nil || (sidecar.Spec.Egress == nil) { return @@ -385,15 +392,16 @@ func modifySidecarForLocalClusterCommunication(sidecarNamespace string, sidecarE } } + //nolint newSidecarConfig := createSidecarSkeletion(newSidecar.Spec, common.GetWorkloadSidecarName(), sidecarNamespace) //insert into cluster if newSidecarConfig != nil { - addUpdateSidecar(newSidecarConfig, sidecar, sidecarNamespace, rc) + addUpdateSidecar(ctx, newSidecarConfig, sidecar, sidecarNamespace, rc) } } -func addUpdateSidecar(obj *v1alpha3.Sidecar, exist *v1alpha3.Sidecar, namespace string, rc *RemoteController) { +func addUpdateSidecar(ctx context.Context, obj *v1alpha3.Sidecar, exist *v1alpha3.Sidecar, namespace string, rc *RemoteController) { var err error exist.Labels = obj.Labels exist.Annotations = obj.Annotations @@ -402,7 +410,7 @@ func addUpdateSidecar(obj *v1alpha3.Sidecar, exist *v1alpha3.Sidecar, namespace log.Infof(LogErrFormat, "Update", "Sidecar", obj.Name, rc.ClusterID, "Skipped as Admiral pod is in read only mode") return } - _, err = rc.SidecarController.IstioClient.NetworkingV1alpha3().Sidecars(namespace).Update(exist) + _, err = rc.SidecarController.IstioClient.NetworkingV1alpha3().Sidecars(namespace).Update(ctx, obj, v12.UpdateOptions{}) if err != nil { log.Infof(LogErrFormat, "Update", "Sidecar", obj.Name, rc.ClusterID, err) @@ -419,8 +427,8 @@ func copySidecar(sidecar *v1alpha3.Sidecar) *v1alpha3.Sidecar { return newSidecarObj } -//This will create the default service entries and also additional ones specified in GTP -func AddServiceEntriesWithDr(rr *RemoteRegistry, sourceClusters map[string]string, serviceEntries map[string]*networking.ServiceEntry) { +//AddServiceEntriesWithDr will create the default service entries and also additional ones specified in GTP +func AddServiceEntriesWithDr(ctx context.Context, rr *RemoteRegistry, sourceClusters map[string]string, serviceEntries map[string]*networking.ServiceEntry) { cache := rr.AdmiralCache @@ -450,16 +458,16 @@ func AddServiceEntriesWithDr(rr *RemoteRegistry, sourceClusters map[string]strin } //check if there is a gtp and add additional hosts/destination rules - var seDrSet = createSeAndDrSetFromGtp(env, rc.NodeController.Locality.Region, se, globalTrafficPolicy, cache) + var seDrSet = createSeAndDrSetFromGtp(ctx, env, rc.NodeController.Locality.Region, se, globalTrafficPolicy, cache) for _, seDr := range seDrSet { - oldServiceEntry, err := rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(syncNamespace).Get(seDr.SeName, v12.GetOptions{}) + oldServiceEntry, err := rc.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(syncNamespace).Get(ctx, seDr.SeName, v12.GetOptions{}) // if old service entry not find, just create a new service entry instead if err != nil { log.Infof(LogFormat, "Get (error)", "old ServiceEntry", seDr.SeName, sourceCluster, err) oldServiceEntry = nil } - oldDestinationRule, err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Get(seDr.DrName, v12.GetOptions{}) + oldDestinationRule, err := rc.DestinationRuleController.IstioClient.NetworkingV1alpha3().DestinationRules(syncNamespace).Get(ctx, seDr.DrName, v12.GetOptions{}) if err != nil { log.Infof(LogFormat, "Get (error)", "old DestinationRule", seDr.DrName, sourceCluster, err) @@ -476,30 +484,31 @@ func AddServiceEntriesWithDr(rr *RemoteRegistry, sourceClusters map[string]strin //clean service entry in case no endpoints are configured or if all the endpoints are invalid if (len(seDr.ServiceEntry.Endpoints) == 0) || deleteOldServiceEntry { - deleteServiceEntry(oldServiceEntry, syncNamespace, rc) + deleteServiceEntry(ctx, oldServiceEntry, syncNamespace, rc) cache.SeClusterCache.Delete(seDr.ServiceEntry.Hosts[0]) // after deleting the service entry, destination rule also need to be deleted if the service entry host no longer exists - deleteDestinationRule(oldDestinationRule, syncNamespace, rc) + deleteDestinationRule(ctx, oldDestinationRule, syncNamespace, rc) } else { + //nolint newServiceEntry := createServiceEntrySkeletion(*seDr.ServiceEntry, seDr.SeName, syncNamespace) if newServiceEntry != nil { newServiceEntry.Annotations = map[string]string{common.GetWorkloadIdentifier(): fmt.Sprintf("%v", identityId)} - addUpdateServiceEntry(newServiceEntry, oldServiceEntry, syncNamespace, rc) + addUpdateServiceEntry(ctx, newServiceEntry, oldServiceEntry, syncNamespace, rc) cache.SeClusterCache.Put(newServiceEntry.Spec.Hosts[0], rc.ClusterID, rc.ClusterID) } + //nolint newDestinationRule := createDestinationRuleSkeletion(*seDr.DestinationRule, seDr.DrName, syncNamespace) // if event was deletion when this function was called, then GlobalTrafficCache should already deleted the cache globalTrafficPolicy is an empty shell object - addUpdateDestinationRule(newDestinationRule, oldDestinationRule, syncNamespace, rc) + addUpdateDestinationRule(ctx, newDestinationRule, oldDestinationRule, syncNamespace, rc) } } } } } -func createSeAndDrSetFromGtp(env, region string, se *networking.ServiceEntry, globalTrafficPolicy *v1.GlobalTrafficPolicy, - cache *AdmiralCache) map[string]*SeDrTuple { +func createSeAndDrSetFromGtp(ctx context.Context, env, region string, se *networking.ServiceEntry, globalTrafficPolicy *v1.GlobalTrafficPolicy, cache *AdmiralCache) map[string]*SeDrTuple { var defaultDrName = getIstioResourceName(se.Hosts[0], "-default-dr") var defaultSeName = getIstioResourceName(se.Hosts[0], "-se") var seDrSet = make(map[string]*SeDrTuple) @@ -519,7 +528,7 @@ func createSeAndDrSetFromGtp(env, region string, se *networking.ServiceEntry, gl drName, seName = getIstioResourceName(host, "-dr"), getIstioResourceName(host, "-se") modifiedSe = copyServiceEntry(se) modifiedSe.Hosts[0] = host - modifiedSe.Addresses[0] = getUniqueAddress(cache, host) + modifiedSe.Addresses[0] = getUniqueAddress(ctx, cache, host) } var seDr = &SeDrTuple{ DrName: drName, @@ -543,8 +552,8 @@ func createSeAndDrSetFromGtp(env, region string, se *networking.ServiceEntry, gl return seDrSet } -func makeRemoteEndpointForServiceEntry(address string, locality string, portName string, portNumber int) *networking.ServiceEntry_Endpoint { - return &networking.ServiceEntry_Endpoint{Address: address, +func makeRemoteEndpointForServiceEntry(address string, locality string, portName string, portNumber int) *networking.WorkloadEntry { + return &networking.WorkloadEntry{Address: address, Locality: locality, Ports: map[string]uint32{portName: uint32(portNumber)}} // } @@ -555,8 +564,8 @@ func copyServiceEntry(se *networking.ServiceEntry) *networking.ServiceEntry { return newSe } -func loadServiceEntryCacheData(c admiral.ConfigMapControllerInterface, admiralCache *AdmiralCache) { - configmap, err := c.GetConfigMap() +func loadServiceEntryCacheData(ctx context.Context, c admiral.ConfigMapControllerInterface, admiralCache *AdmiralCache) { + configmap, err := c.GetConfigMap(ctx) if err != nil { log.Warnf("Failed to refresh configmap state Error: %v", err) return //No need to invalidate the cache @@ -571,21 +580,22 @@ func loadServiceEntryCacheData(c admiral.ConfigMapControllerInterface, admiralCa } -//Gets a guarenteed unique local address for a serviceentry. Returns the address, True iff the configmap was updated false otherwise, and an error if any +//GetLocalAddressForSe gets a guarenteed unique local address for a serviceentry. Returns the address, True iff the configmap was updated false otherwise, and an error if any //Any error coupled with an empty string address means the method should be retried -func GetLocalAddressForSe(seName string, seAddressCache *ServiceEntryAddressStore, configMapController admiral.ConfigMapControllerInterface) (string, bool, error) { +func GetLocalAddressForSe(ctx context.Context, seName string, seAddressCache *ServiceEntryAddressStore, configMapController admiral.ConfigMapControllerInterface) (string, bool, error) { var address = seAddressCache.EntryAddresses[seName] if len(address) == 0 { - address, err := GenerateNewAddressAndAddToConfigMap(seName, configMapController) + address, err := GenerateNewAddressAndAddToConfigMap(ctx, seName, configMapController) return address, true, err } return address, false, nil } -func GetServiceEntriesByCluster(clusterID string, remoteRegistry *RemoteRegistry) ([]v1alpha3.ServiceEntry, error) { +func GetServiceEntriesByCluster(ctx context.Context, clusterID string, remoteRegistry *RemoteRegistry) ([]*v1alpha3.ServiceEntry, error) { remoteController := remoteRegistry.GetRemoteController(clusterID) + if remoteController != nil { - serviceEnteries, err := remoteController.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(common.GetSyncNamespace()).List(v12.ListOptions{}) + serviceEnteries, err := remoteController.ServiceEntryController.IstioClient.NetworkingV1alpha3().ServiceEntries(common.GetSyncNamespace()).List(ctx, v12.ListOptions{}) if err != nil { log.Errorf(LogFormat, "Get", "ServiceEntries", "", clusterID, err) @@ -599,10 +609,10 @@ func GetServiceEntriesByCluster(clusterID string, remoteRegistry *RemoteRegistry } } -//an atomic fetch and update operation against the configmap (using K8s built in optimistic consistency mechanism via resource version) -func GenerateNewAddressAndAddToConfigMap(seName string, configMapController admiral.ConfigMapControllerInterface) (string, error) { +//GenerateNewAddressAndAddToConfigMap an atomic fetch and update operation against the configmap (using K8s built in optimistic consistency mechanism via resource version) +func GenerateNewAddressAndAddToConfigMap(ctx context.Context, seName string, configMapController admiral.ConfigMapControllerInterface) (string, error) { //1. get cm, see if there. 2. gen new uq address. 3. put configmap. RETURN SUCCESSFULLY IFF CONFIGMAP PUT SUCCEEDS - cm, err := configMapController.GetConfigMap() + cm, err := configMapController.GetConfigMap(ctx) if err != nil { return "", err } @@ -633,7 +643,7 @@ func GenerateNewAddressAndAddToConfigMap(seName string, configMapController admi newAddressState.Addresses = append(newAddressState.Addresses, address) newAddressState.EntryAddresses[seName] = address - err = putServiceEntryStateFromConfigmap(configMapController, cm, newAddressState) + err = putServiceEntryStateFromConfigmap(ctx, configMapController, cm, newAddressState) if err != nil { return "", err @@ -642,7 +652,7 @@ func GenerateNewAddressAndAddToConfigMap(seName string, configMapController admi } //puts new data into an existing configmap. Providing the original is necessary to prevent fetch and update race conditions -func putServiceEntryStateFromConfigmap(c admiral.ConfigMapControllerInterface, originalConfigmap *k8sV1.ConfigMap, data *ServiceEntryAddressStore) error { +func putServiceEntryStateFromConfigmap(ctx context.Context, c admiral.ConfigMapControllerInterface, originalConfigmap *k8sV1.ConfigMap, data *ServiceEntryAddressStore) error { if originalConfigmap == nil { return errors.New("configmap must not be nil") } @@ -666,18 +676,19 @@ func putServiceEntryStateFromConfigmap(c admiral.ConfigMapControllerInterface, o return err } - return c.PutConfigMap(originalConfigmap) + return c.PutConfigMap(ctx, originalConfigmap) } -func createServiceEntryForRollout(event admiral.EventType, rc *RemoteController, admiralCache *AdmiralCache, - meshPorts map[string]uint32, destRollout *argo.Rollout, serviceEntries map[string]*networking.ServiceEntry) *networking.ServiceEntry { +func createServiceEntryForRollout(ctx context.Context, event admiral.EventType, rc *RemoteController, + admiralCache *AdmiralCache, meshPorts map[string]uint32, destRollout *argo.Rollout, + serviceEntries map[string]*networking.ServiceEntry) *networking.ServiceEntry { workloadIdentityKey := common.GetWorkloadIdentifier() globalFqdn := common.GetCnameForRollout(destRollout, workloadIdentityKey, common.GetHostnameSuffix()) //Handling retries for getting/putting service entries from/in cache - address := getUniqueAddress(admiralCache, globalFqdn) + address := getUniqueAddress(ctx, admiralCache, globalFqdn) if len(globalFqdn) == 0 || len(address) == 0 { return nil @@ -686,10 +697,10 @@ func createServiceEntryForRollout(event admiral.EventType, rc *RemoteController, san := getSanForRollout(destRollout, workloadIdentityKey) if destRollout.Spec.Strategy.BlueGreen != nil && destRollout.Spec.Strategy.BlueGreen.PreviewService != "" { - rolloutServices := getServiceForRollout(rc, destRollout) + rolloutServices := getServiceForRollout(ctx, rc, destRollout) if _, ok := rolloutServices[destRollout.Spec.Strategy.BlueGreen.PreviewService]; ok { previewGlobalFqdn := common.BlueGreenRolloutPreviewPrefix + common.Sep + common.GetCnameForRollout(destRollout, workloadIdentityKey, common.GetHostnameSuffix()) - previewAddress := getUniqueAddress(admiralCache, previewGlobalFqdn) + previewAddress := getUniqueAddress(ctx, admiralCache, previewGlobalFqdn) if len(previewGlobalFqdn) != 0 && len(previewAddress) != 0 { generateServiceEntry(event, admiralCache, meshPorts, previewGlobalFqdn, rc, serviceEntries, previewAddress, san) } @@ -722,7 +733,7 @@ func getSanForRollout(destRollout *argo.Rollout, workloadIdentityKey string) (sa } -func getUniqueAddress(admiralCache *AdmiralCache, globalFqdn string) (address string) { +func getUniqueAddress(ctx context.Context, admiralCache *AdmiralCache, globalFqdn string) (address string) { //initializations var err error = nil @@ -732,7 +743,7 @@ func getUniqueAddress(admiralCache *AdmiralCache, globalFqdn string) (address st needsCacheUpdate := false for err == nil && counter < maxRetries { - address, needsCacheUpdate, err = GetLocalAddressForSe(getIstioResourceName(globalFqdn, "-se"), admiralCache.ServiceEntryAddressStore, admiralCache.ConfigMapController) + address, needsCacheUpdate, err = GetLocalAddressForSe(ctx, getIstioResourceName(globalFqdn, "-se"), admiralCache.ServiceEntryAddressStore, admiralCache.ConfigMapController) if err != nil { log.Errorf("Error getting local address for Service Entry. Err: %v", err) @@ -752,13 +763,15 @@ func getUniqueAddress(admiralCache *AdmiralCache, globalFqdn string) (address st } if needsCacheUpdate { - loadServiceEntryCacheData(admiralCache.ConfigMapController, admiralCache) + loadServiceEntryCacheData(ctx, admiralCache.ConfigMapController, admiralCache) } return address } -func generateServiceEntry(event admiral.EventType, admiralCache *AdmiralCache, meshPorts map[string]uint32, globalFqdn string, rc *RemoteController, serviceEntries map[string]*networking.ServiceEntry, address string, san []string) *networking.ServiceEntry { +func generateServiceEntry(event admiral.EventType, admiralCache *AdmiralCache, meshPorts map[string]uint32, + globalFqdn string, rc *RemoteController, serviceEntries map[string]*networking.ServiceEntry, + address string, san []string) *networking.ServiceEntry { admiralCache.CnameClusterCache.Put(globalFqdn, rc.ClusterID, rc.ClusterID) tmpSe := serviceEntries[globalFqdn] @@ -783,10 +796,11 @@ func generateServiceEntry(event admiral.EventType, admiralCache *AdmiralCache, m Addresses: []string{address}, //It is possible that the address is an empty string. That is fine as the se creation will fail and log an error SubjectAltNames: san, } - tmpSe.Endpoints = []*networking.ServiceEntry_Endpoint{} + tmpSe.Endpoints = []*networking.WorkloadEntry{} } - endpointAddress, port := rc.ServiceController.Cache.GetLoadBalancer(common.GetAdmiralParams().LabelSet.GatewayApp, common.NamespaceIstioSystem) + endpointAddress, port := rc.ServiceController.Cache. + GetLoadBalancer(common.GetAdmiralParams().LabelSet.GatewayApp, common.NamespaceIstioSystem) var locality string if rc.NodeController.Locality != nil { @@ -800,7 +814,7 @@ func generateServiceEntry(event admiral.EventType, admiralCache *AdmiralCache, m tmpSe.Endpoints = append(tmpSe.Endpoints, seEndpoint) } else if event == admiral.Delete { // create a tmp endpoint list to store all the endpoints that we intend to keep - remainEndpoints := []*networking.ServiceEntry_Endpoint{} + remainEndpoints := []*networking.WorkloadEntry{} // if the endpoint is not equal to the endpoint we intend to delete, append it to remainEndpoint list for _, existingEndpoint := range tmpSe.Endpoints { if !reflect.DeepEqual(existingEndpoint, seEndpoint) { diff --git a/admiral/pkg/clusters/serviceentry_test.go b/admiral/pkg/clusters/serviceentry_test.go index bf6a19e8..d175cbec 100644 --- a/admiral/pkg/clusters/serviceentry_test.go +++ b/admiral/pkg/clusters/serviceentry_test.go @@ -20,6 +20,7 @@ import ( "github.com/istio-ecosystem/admiral/admiral/pkg/controller/istio" "github.com/istio-ecosystem/admiral/admiral/pkg/test" "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/testing/protocmp" "gopkg.in/yaml.v2" istionetworkingv1alpha3 "istio.io/api/networking/v1alpha3" "istio.io/client-go/pkg/apis/networking/v1alpha3" @@ -47,24 +48,25 @@ func TestAddServiceEntriesWithDr(t *testing.T) { se := istionetworkingv1alpha3.ServiceEntry{ Hosts: []string{"dev.bar.global"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "127.0.0.1", Ports: map[string]uint32{"https": 80}, Labels: map[string]string{}, Network: "mesh1", Locality: "us-west", Weight: 100}, }, } emptyEndpointSe := istionetworkingv1alpha3.ServiceEntry{ Hosts: []string{"dev.bar.global"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{}, + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{}, } dummyEndpointSe := istionetworkingv1alpha3.ServiceEntry{ Hosts: []string{"dev.dummy.global"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"https": 80}, Labels: map[string]string{}, Network: "mesh1", Locality: "us-west", Weight: 100}, }, } seConfig := v1alpha3.ServiceEntry{ + //nolint Spec: se, } seConfig.Name = "se1" @@ -77,9 +79,12 @@ func TestAddServiceEntriesWithDr(t *testing.T) { dummySeConfig.Name = "dummySe" dummySeConfig.Namespace = "admiral-sync" + ctx := context.Background() + fakeIstioClient := istiofake.NewSimpleClientset() - fakeIstioClient.NetworkingV1alpha3().ServiceEntries("admiral-sync").Create(&seConfig) - fakeIstioClient.NetworkingV1alpha3().ServiceEntries("admiral-sync").Create(&dummySeConfig) + fakeIstioClient.NetworkingV1alpha3().ServiceEntries("admiral-sync").Create(ctx, &seConfig, v12.CreateOptions{}) + fakeIstioClient.NetworkingV1alpha3().ServiceEntries("admiral-sync").Create(ctx, &dummySeConfig, v12.CreateOptions{}) + rc := &RemoteController{ ServiceEntryController: &istio.ServiceEntryController{ IstioClient: fakeIstioClient, @@ -96,9 +101,9 @@ func TestAddServiceEntriesWithDr(t *testing.T) { rr := NewRemoteRegistry(nil, common.AdmiralParams{}) rr.PutRemoteController("cl1", rc) rr.AdmiralCache = &admiralCache - AddServiceEntriesWithDr(rr, map[string]string{"cl1": "cl1"}, map[string]*istionetworkingv1alpha3.ServiceEntry{"se1": &se}) - AddServiceEntriesWithDr(rr, map[string]string{"cl1": "cl1"}, map[string]*istionetworkingv1alpha3.ServiceEntry{"se1": &emptyEndpointSe}) - AddServiceEntriesWithDr(rr, map[string]string{"cl1": "cl1"}, map[string]*istionetworkingv1alpha3.ServiceEntry{"dummySe": &dummyEndpointSe}) + AddServiceEntriesWithDr(ctx, rr, map[string]string{"cl1": "cl1"}, map[string]*istionetworkingv1alpha3.ServiceEntry{"se1": &se}) + AddServiceEntriesWithDr(ctx, rr, map[string]string{"cl1": "cl1"}, map[string]*istionetworkingv1alpha3.ServiceEntry{"se1": &emptyEndpointSe}) + AddServiceEntriesWithDr(ctx, rr, map[string]string{"cl1": "cl1"}, map[string]*istionetworkingv1alpha3.ServiceEntry{"dummySe": &dummyEndpointSe}) } func TestCreateSeAndDrSetFromGtp(t *testing.T) { @@ -131,7 +136,7 @@ func TestCreateSeAndDrSetFromGtp(t *testing.T) { se := &istionetworkingv1alpha3.ServiceEntry{ Addresses: []string{"240.10.1.0"}, Hosts: []string{host}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "127.0.0.1", Ports: map[string]uint32{"https": 80}, Labels: map[string]string{}, Locality: "us-west-2"}, {Address: "240.20.0.1", Ports: map[string]uint32{"https": 80}, Labels: map[string]string{}, Locality: "us-east-2"}, }, @@ -234,11 +239,11 @@ func TestCreateSeAndDrSetFromGtp(t *testing.T) { strings.ToLower(common.GetCnameVal([]string{eastWithCaps, host})): nil}, }, } - + ctx := context.Background() //Run the test for every provided case for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - result := createSeAndDrSetFromGtp(c.env, c.locality, c.se, c.gtp, &admiralCache) + result := createSeAndDrSetFromGtp(ctx, c.env, c.locality, c.se, c.gtp, &admiralCache) generatedHosts := make([]string, 0, len(result)) for generatedHost := range result { generatedHosts = append(generatedHosts, generatedHost) @@ -293,7 +298,7 @@ func TestCreateServiceEntryForNewServiceOrPod(t *testing.T) { } rr.PutRemoteController("test.cluster", rc) - modifyServiceEntryForNewServiceOrPod(admiral.Add, "test", "bar", rr) + modifyServiceEntryForNewServiceOrPod(context.Background(), admiral.Add, "test", "bar", rr) } @@ -412,10 +417,10 @@ func TestGetLocalAddressForSe(t *testing.T) { wantedError: errors.New("BAD THINGS HAPPENED"), }, } - + ctx := context.Background() for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - seAddress, needsCacheUpdate, err := GetLocalAddressForSe(c.seName, &c.seAddressCache, c.cacheController) + seAddress, needsCacheUpdate, err := GetLocalAddressForSe(ctx, c.seName, &c.seAddressCache, c.cacheController) if c.wantAddess != "" { if !reflect.DeepEqual(seAddress, c.wantAddess) { t.Errorf("Wanted se address: %s, got: %s", c.wantAddess, seAddress) @@ -477,10 +482,14 @@ func TestModifyNonExistingSidecarForLocalClusterCommunication(t *testing.T) { sidecarEgressMap := make(map[string]common.SidecarEgress) sidecarEgressMap["test-dependency-namespace"] = common.SidecarEgress{Namespace: "test-dependency-namespace", FQDN: "test-local-fqdn"} + ctx := context.Background() - modifySidecarForLocalClusterCommunication("test-sidecar-namespace", sidecarEgressMap, remoteController) + modifySidecarForLocalClusterCommunication(ctx, "test-sidecar-namespace", sidecarEgressMap, remoteController) - sidecarObj, _ := sidecarController.IstioClient.NetworkingV1alpha3().Sidecars("test-sidecar-namespace").Get(common.GetWorkloadSidecarName(), v12.GetOptions{}) + sidecarObj, err := sidecarController.IstioClient.NetworkingV1alpha3().Sidecars("test-sidecar-namespace").Get(ctx, common.GetWorkloadSidecarName(), v12.GetOptions{}) + if err == nil { + t.Errorf("expected 404 not found error but got nil") + } if sidecarObj != nil { t.Fatalf("Modify non existing resource failed, as no new resource should be created.") @@ -507,15 +516,18 @@ func TestModifyExistingSidecarForLocalClusterCommunication(t *testing.T) { Egress: []*istionetworkingv1alpha3.IstioEgressListener{&istioEgress}, } - createdSidecar, _ := sidecarController.IstioClient.NetworkingV1alpha3().Sidecars("test-sidecar-namespace").Create(existingSidecarObj) - + ctx := context.Background() + createdSidecar, err := sidecarController.IstioClient.NetworkingV1alpha3().Sidecars("test-sidecar-namespace").Create(ctx, existingSidecarObj, v12.CreateOptions{}) + if err != nil { + t.Error(err) + } if createdSidecar != nil { sidecarEgressMap := make(map[string]common.SidecarEgress) sidecarEgressMap["test-dependency-namespace"] = common.SidecarEgress{Namespace: "test-dependency-namespace", FQDN: "test-local-fqdn", CNAMEs: map[string]string{"test.myservice.global": "1"}} - modifySidecarForLocalClusterCommunication("test-sidecar-namespace", sidecarEgressMap, remoteController) + modifySidecarForLocalClusterCommunication(ctx, "test-sidecar-namespace", sidecarEgressMap, remoteController) - updatedSidecar, err := sidecarController.IstioClient.NetworkingV1alpha3().Sidecars("test-sidecar-namespace").Get("default", v12.GetOptions{}) + updatedSidecar, err := sidecarController.IstioClient.NetworkingV1alpha3().Sidecars("test-sidecar-namespace").Get(ctx, "default", v12.GetOptions{}) if err != nil || updatedSidecar == nil { t.Fail() @@ -530,7 +542,7 @@ func TestModifyExistingSidecarForLocalClusterCommunication(t *testing.T) { createdSidecar.Spec.Egress = createdSidecar.Spec.Egress[:0] updatedSidecar.Spec.Egress = updatedSidecar.Spec.Egress[:0] - if !cmp.Equal(updatedSidecar, createdSidecar) { + if !cmp.Equal(updatedSidecar, createdSidecar, protocmp.Transform()) { t.Fatalf("Modify existing sidecar failed as configuration is not same. Details - %v", cmp.Diff(updatedSidecar, createdSidecar)) } var matched *istionetworkingv1alpha3.IstioEgressListener @@ -549,7 +561,7 @@ func TestModifyExistingSidecarForLocalClusterCommunication(t *testing.T) { listener.Hosts = listener.Hosts[:0] matched.Hosts = matched.Hosts[:0] assert.ElementsMatch(t, oldHosts, newHosts, "hosts should match") - if !cmp.Equal(listener, matched) { + if !cmp.Equal(listener, matched, protocmp.Transform()) { t.Fatalf("Listeners do not match. Details - %v", cmp.Diff(listener, matched)) } } else { @@ -632,7 +644,7 @@ func TestCreateServiceEntry(t *testing.T) { Location: istionetworkingv1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: istionetworkingv1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, }, } @@ -645,7 +657,7 @@ func TestCreateServiceEntry(t *testing.T) { Location: istionetworkingv1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: istionetworkingv1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, }, } @@ -658,7 +670,7 @@ func TestCreateServiceEntry(t *testing.T) { Location: istionetworkingv1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: istionetworkingv1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, }, @@ -672,7 +684,7 @@ func TestCreateServiceEntry(t *testing.T) { Location: istionetworkingv1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: istionetworkingv1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-west-2"}, {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, @@ -686,7 +698,7 @@ func TestCreateServiceEntry(t *testing.T) { Location: istionetworkingv1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: istionetworkingv1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"http": 0}, Locality: "us-east-2"}, }, } @@ -699,7 +711,7 @@ func TestCreateServiceEntry(t *testing.T) { Location: istionetworkingv1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: istionetworkingv1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{}, + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{}, } grpcSe := istionetworkingv1alpha3.ServiceEntry{ @@ -710,7 +722,7 @@ func TestCreateServiceEntry(t *testing.T) { Location: istionetworkingv1alpha3.ServiceEntry_MESH_INTERNAL, Resolution: istionetworkingv1alpha3.ServiceEntry_DNS, SubjectAltNames: []string{"spiffe://prefix/my-first-service"}, - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Address: "dummy.admiral.global", Ports: map[string]uint32{"grpc": 0}, Locality: "us-west-2"}, }, } @@ -783,11 +795,13 @@ func TestCreateServiceEntry(t *testing.T) { }, } + ctx := context.Background() + //Run the test for every provided case for _, c := range deploymentSeCreationTestCases { t.Run(c.name, func(t *testing.T) { var createdSE *istionetworkingv1alpha3.ServiceEntry - createdSE = createServiceEntry(c.action, c.rc, &c.admiralCache, c.meshPorts, &c.deployment, c.serviceEntries) + createdSE = createServiceEntry(ctx, c.action, c.rc, &c.admiralCache, c.meshPorts, &c.deployment, c.serviceEntries) if !reflect.DeepEqual(createdSE, c.expectedResult) { t.Errorf("Test %s failed, expected: %v got %v", c.name, c.expectedResult, createdSE) } @@ -827,7 +841,7 @@ func TestCreateServiceEntry(t *testing.T) { //Run the test for every provided case for _, c := range rolloutSeCreationTestCases { t.Run(c.name, func(t *testing.T) { - createdSE := createServiceEntryForRollout(admiral.Add, c.rc, &c.admiralCache, c.meshPorts, &c.rollout, map[string]*istionetworkingv1alpha3.ServiceEntry{}) + createdSE := createServiceEntryForRollout(ctx, admiral.Add, c.rc, &c.admiralCache, c.meshPorts, &c.rollout, map[string]*istionetworkingv1alpha3.ServiceEntry{}) if !reflect.DeepEqual(createdSE, c.expectedResult) { t.Errorf("Test %s failed, expected: %v got %v", c.name, c.expectedResult, createdSE) } @@ -842,6 +856,8 @@ func TestCreateServiceEntryForNewServiceOrPodRolloutsUsecase(t *testing.T) { const SERVICENAME = "serviceNameActive" const ROLLOUT_POD_HASH_LABEL string = "rollouts-pod-template-hash" + ctx := context.Background() + p := common.AdmiralParams{ KubeconfigPath: "testdata/fake.config", } @@ -903,9 +919,9 @@ func TestCreateServiceEntryForNewServiceOrPodRolloutsUsecase(t *testing.T) { GlobalTrafficCache: &globalTrafficCache{ mutex: &sync.Mutex{}, }, - DependencyNamespaceCache: common.NewSidecarEgressMap(), - SeClusterCache: common.NewMapOfMaps(), - WorkloadSelectorCache: common.NewMapOfMaps(), + DependencyNamespaceCache: common.NewSidecarEgressMap(), + SeClusterCache: common.NewMapOfMaps(), + WorkloadSelectorCache: common.NewMapOfMaps(), } rr.AdmiralCache = admiralCache @@ -961,7 +977,7 @@ func TestCreateServiceEntryForNewServiceOrPodRolloutsUsecase(t *testing.T) { activeService.Spec.Ports = ports s.Cache.Put(activeService) - se := modifyServiceEntryForNewServiceOrPod(admiral.Add, "test", "bar", rr) + se := modifyServiceEntryForNewServiceOrPod(ctx, admiral.Add, "test", "bar", rr) if nil == se { t.Fatalf("no service entries found") } @@ -981,6 +997,8 @@ func TestCreateServiceEntryForBlueGreenRolloutsUsecase(t *testing.T) { const PREVIEW_SERVICENAME = "serviceNamePreview" const ROLLOUT_POD_HASH_LABEL string = "rollouts-pod-template-hash" + ctx := context.Background() + p := common.AdmiralParams{ KubeconfigPath: "testdata/fake.config", PreviewHostnamePrefix: "preview", @@ -1042,9 +1060,9 @@ func TestCreateServiceEntryForBlueGreenRolloutsUsecase(t *testing.T) { GlobalTrafficCache: &globalTrafficCache{ mutex: &sync.Mutex{}, }, - DependencyNamespaceCache: common.NewSidecarEgressMap(), - SeClusterCache: common.NewMapOfMaps(), - WorkloadSelectorCache: common.NewMapOfMaps(), + DependencyNamespaceCache: common.NewSidecarEgressMap(), + SeClusterCache: common.NewMapOfMaps(), + WorkloadSelectorCache: common.NewMapOfMaps(), } rr.AdmiralCache = admiralCache @@ -1113,7 +1131,7 @@ func TestCreateServiceEntryForBlueGreenRolloutsUsecase(t *testing.T) { s.Cache.Put(previewService) - se := modifyServiceEntryForNewServiceOrPod(admiral.Add, "test", "bar", rr) + se := modifyServiceEntryForNewServiceOrPod(ctx, admiral.Add, "test", "bar", rr) if nil == se { t.Fatalf("no service entries found") @@ -1135,7 +1153,7 @@ func TestCreateServiceEntryForBlueGreenRolloutsUsecase(t *testing.T) { BlueGreen: &argo.BlueGreenStrategy{ActiveService: ACTIVE_SERVICENAME}, } - se = modifyServiceEntryForNewServiceOrPod(admiral.Add, "test", "bar", rr) + se = modifyServiceEntryForNewServiceOrPod(ctx, admiral.Add, "test", "bar", rr) if len(se) != 1 { t.Fatalf("Expected 1 service entries to be created but found %d", len(se)) @@ -1155,7 +1173,7 @@ func TestUpdateEndpointsForBlueGreen(t *testing.T) { const ACTIVE_MESH_HOST = "qal.example.mesh" const PREVIEW_MESH_HOST = "preview.qal.example.mesh" - rollout := argo.Rollout{} + rollout := &argo.Rollout{} rollout.Spec.Strategy = argo.RolloutStrategy{ BlueGreen: &argo.BlueGreenStrategy{ ActiveService: ACTIVE_SERVICE, @@ -1165,7 +1183,7 @@ func TestUpdateEndpointsForBlueGreen(t *testing.T) { rollout.Spec.Template.Annotations = map[string]string{} rollout.Spec.Template.Annotations[common.SidecarEnabledPorts] = "8080" - endpoint := istionetworkingv1alpha3.ServiceEntry_Endpoint{ + endpoint := &istionetworkingv1alpha3.WorkloadEntry{ Labels: map[string]string{}, Address: CLUSTER_INGRESS_1, Ports: map[string]uint32{"http": 15443}, } @@ -1176,23 +1194,23 @@ func TestUpdateEndpointsForBlueGreen(t *testing.T) { PREVIEW_SERVICE: {Service: &v1.Service{ObjectMeta: v12.ObjectMeta{Name: PREVIEW_SERVICE, Namespace: NAMESPACE}}}, } - activeWantedEndpoints := istionetworkingv1alpha3.ServiceEntry_Endpoint{ + activeWantedEndpoints := &istionetworkingv1alpha3.WorkloadEntry{ Address: ACTIVE_SERVICE + common.Sep + NAMESPACE + common.DotLocalDomainSuffix, Ports: meshPorts, } - previewWantedEndpoints := istionetworkingv1alpha3.ServiceEntry_Endpoint{ + previewWantedEndpoints := &istionetworkingv1alpha3.WorkloadEntry{ Address: PREVIEW_SERVICE + common.Sep + NAMESPACE + common.DotLocalDomainSuffix, Ports: meshPorts, } testCases := []struct { name string - rollout argo.Rollout - inputEndpoint istionetworkingv1alpha3.ServiceEntry_Endpoint + rollout *argo.Rollout + inputEndpoint *istionetworkingv1alpha3.WorkloadEntry weightedServices map[string]*WeightedService clusterIngress string meshPorts map[string]uint32 meshHost string - wantedEndpoints istionetworkingv1alpha3.ServiceEntry_Endpoint + wantedEndpoints *istionetworkingv1alpha3.WorkloadEntry }{ { name: "should return endpoint with active service address", @@ -1216,7 +1234,7 @@ func TestUpdateEndpointsForBlueGreen(t *testing.T) { for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - updateEndpointsForBlueGreen(&c.rollout, c.weightedServices, map[string]string{}, &c.inputEndpoint, "test", c.meshHost) + updateEndpointsForBlueGreen(c.rollout, c.weightedServices, map[string]string{}, c.inputEndpoint, "test", c.meshHost) if c.inputEndpoint.Address != c.wantedEndpoints.Address { t.Errorf("Wanted %s endpoint, got: %s", c.wantedEndpoints.Address, c.inputEndpoint.Address) } @@ -1234,7 +1252,7 @@ func TestUpdateEndpointsForWeightedServices(t *testing.T) { const NAMESPACE = "namespace" se := &istionetworkingv1alpha3.ServiceEntry{ - Endpoints: []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + Endpoints: []*istionetworkingv1alpha3.WorkloadEntry{ {Labels: map[string]string{}, Address: CLUSTER_INGRESS_1, Weight: 10, Ports: map[string]uint32{"http": 15443}}, {Labels: map[string]string{}, Address: CLUSTER_INGRESS_2, Weight: 10, Ports: map[string]uint32{"http": 15443}}, }, @@ -1251,13 +1269,13 @@ func TestUpdateEndpointsForWeightedServices(t *testing.T) { STABLE_SERVICE: {Weight: 100, Service: &v1.Service{ObjectMeta: v12.ObjectMeta{Name: STABLE_SERVICE, Namespace: NAMESPACE}}}, } - wantedEndpoints := []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + wantedEndpoints := []*istionetworkingv1alpha3.WorkloadEntry{ {Address: CLUSTER_INGRESS_2, Weight: 10, Ports: map[string]uint32{"http": 15443}}, {Address: STABLE_SERVICE + common.Sep + NAMESPACE + common.DotLocalDomainSuffix, Weight: 90, Ports: meshPorts}, {Address: CANARY_SERVICE + common.Sep + NAMESPACE + common.DotLocalDomainSuffix, Weight: 10, Ports: meshPorts}, } - wantedEndpointsZeroWeights := []*istionetworkingv1alpha3.ServiceEntry_Endpoint{ + wantedEndpointsZeroWeights := []*istionetworkingv1alpha3.WorkloadEntry{ {Address: CLUSTER_INGRESS_2, Weight: 10, Ports: map[string]uint32{"http": 15443}}, {Address: STABLE_SERVICE + common.Sep + NAMESPACE + common.DotLocalDomainSuffix, Weight: 100, Ports: meshPorts}, } @@ -1268,7 +1286,7 @@ func TestUpdateEndpointsForWeightedServices(t *testing.T) { weightedServices map[string]*WeightedService clusterIngress string meshPorts map[string]uint32 - wantedEndpoints []*istionetworkingv1alpha3.ServiceEntry_Endpoint + wantedEndpoints []*istionetworkingv1alpha3.WorkloadEntry }{ { name: "should return endpoints with assigned weights", diff --git a/admiral/pkg/clusters/types.go b/admiral/pkg/clusters/types.go index b06ca740..dae6337f 100644 --- a/admiral/pkg/clusters/types.go +++ b/admiral/pkg/clusters/types.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sync" "time" @@ -17,6 +16,7 @@ import ( log "github.com/sirupsen/logrus" k8sAppsV1 "k8s.io/api/apps/v1" k8sV1 "k8s.io/api/core/v1" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" k8s "k8s.io/client-go/kubernetes" ) @@ -43,7 +43,7 @@ type AdmiralCache struct { CnameDependentClusterCache *common.MapOfMaps CnameIdentityCache *sync.Map IdentityClusterCache *common.MapOfMaps - WorkloadSelectorCache *common.MapOfMaps + WorkloadSelectorCache *common.MapOfMaps ClusterLocalityCache *common.MapOfMaps IdentityDependencyCache *common.MapOfMaps SubsetServiceEntryIdentityCache *sync.Map @@ -52,9 +52,9 @@ type AdmiralCache struct { GlobalTrafficCache GlobalTrafficCache //The cache needs to live in the handler because it needs access to deployments DependencyNamespaceCache *common.SidecarEgressMap SeClusterCache *common.MapOfMaps - RoutingPolicyFilterCache *routingPolicyFilterCache + RoutingPolicyFilterCache *routingPolicyFilterCache RoutingPolicyCache *routingPolicyCache - argoRolloutsEnabled bool + argoRolloutsEnabled bool } type RemoteRegistry struct { @@ -218,17 +218,16 @@ func (g *globalTrafficCache) Delete(identity string, environment string) error { type RoutingPolicyHandler struct { RemoteRegistry *RemoteRegistry - ClusterID string + ClusterID string } type routingPolicyCache struct { // map of routing policies key=environment.identity, value: RoutingPolicy object // only one routing policy per identity + env is allowed identityCache map[string]*v1.RoutingPolicy - mutex *sync.Mutex + mutex *sync.Mutex } - func (r *routingPolicyCache) Delete(identity string, environment string) { defer r.mutex.Unlock() r.mutex.Lock() @@ -239,7 +238,7 @@ func (r *routingPolicyCache) Delete(identity string, environment string) { } } -func (r *routingPolicyCache ) GetFromIdentity(identity string, environment string) *v1.RoutingPolicy { +func (r *routingPolicyCache) GetFromIdentity(identity string, environment string) *v1.RoutingPolicy { defer r.mutex.Unlock() r.mutex.Lock() return r.identityCache[common.ConstructRoutingPolicyKey(environment, identity)] @@ -265,11 +264,10 @@ func (r *routingPolicyCache) Put(rp *v1.RoutingPolicy) error { return nil } - type routingPolicyFilterCache struct { // map of envoyFilters key=environment+identity of the routingPolicy, value is a map [clusterId -> map [filterName -> filterName]] filterCache map[string]map[string]map[string]string - mutex *sync.Mutex + mutex *sync.Mutex } func (r *routingPolicyFilterCache) Get(identityEnvKey string) (filters map[string]map[string]string) { @@ -301,18 +299,18 @@ func (r *routingPolicyFilterCache) Delete(identityEnvKey string) { r.mutex.Lock() // delete all envoyFilters for a given identity+env key delete(r.filterCache, identityEnvKey) - }else { + } else { log.Infof(LogFormat, admiral.Delete, "routingpolicy", identityEnvKey, "", "routingpolicy disabled") } } -func (r RoutingPolicyHandler) Added(obj *v1.RoutingPolicy) { +func (r RoutingPolicyHandler) Added(ctx context.Context, obj *v1.RoutingPolicy) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, admiral.Add, "routingpolicy", "", "", "skipping read-only mode") return } if common.GetEnableRoutingPolicy() { if common.ShouldIgnoreResource(obj.ObjectMeta) { - log.Infof(LogFormat, "success", "routingpolicy", obj.Name, obj.ClusterName, "Ignored the RoutingPolicy because of the annotation") + log.Infof(LogFormat, "success", "routingpolicy", obj.Name, "", "Ignored the RoutingPolicy because of the annotation") return } dependents := getDependents(obj, r) @@ -320,24 +318,24 @@ func (r RoutingPolicyHandler) Added(obj *v1.RoutingPolicy) { log.Info("No dependents found for Routing Policy - ", obj.Name) return } - r.processroutingPolicy(dependents, obj, admiral.Add) + r.processroutingPolicy(ctx, dependents, obj, admiral.Add) - log.Infof(LogFormat, admiral.Add, "routingpolicy", obj.Name, obj.ClusterName, "finished processing routing policy") - }else { - log.Infof(LogFormat, admiral.Add, "routingpolicy", obj.Name, obj.ClusterName, "routingpolicy disabled") + log.Infof(LogFormat, admiral.Add, "routingpolicy", obj.Name, "", "finished processing routing policy") + } else { + log.Infof(LogFormat, admiral.Add, "routingpolicy", obj.Name, "", "routingpolicy disabled") } } -func (r RoutingPolicyHandler) processroutingPolicy(dependents map[string]string, routingPolicy *v1.RoutingPolicy, eventType admiral.EventType ) { +func (r RoutingPolicyHandler) processroutingPolicy(ctx context.Context, dependents map[string]string, routingPolicy *v1.RoutingPolicy, eventType admiral.EventType) { for _, remoteController := range r.RemoteRegistry.remoteControllers { - for _, dependent := range dependents { + for _, dependent := range dependents { // Check if the dependent exists in this remoteCluster. If so, we create an envoyFilter with dependent identity as workload selector if _, ok := r.RemoteRegistry.AdmiralCache.IdentityClusterCache.Get(dependent).Copy()[remoteController.ClusterID]; ok { - selectors := r.RemoteRegistry.AdmiralCache.WorkloadSelectorCache.Get(dependent+remoteController.ClusterID).Copy() + selectors := r.RemoteRegistry.AdmiralCache.WorkloadSelectorCache.Get(dependent + remoteController.ClusterID).Copy() if len(selectors) != 0 { - filter, err := createOrUpdateEnvoyFilter(remoteController, routingPolicy, eventType, dependent, r.RemoteRegistry.AdmiralCache, selectors) + filter, err := createOrUpdateEnvoyFilter(ctx, remoteController, routingPolicy, eventType, dependent, r.RemoteRegistry.AdmiralCache, selectors) if err != nil { // Best effort create log.Errorf(LogErrFormat, eventType, "routingpolicy", routingPolicy.Name, remoteController.ClusterID, err) @@ -351,27 +349,27 @@ func (r RoutingPolicyHandler) processroutingPolicy(dependents map[string]string, } } -func (r RoutingPolicyHandler) Updated(obj *v1.RoutingPolicy) { +func (r RoutingPolicyHandler) Updated(ctx context.Context, obj *v1.RoutingPolicy) { if CurrentAdmiralState.ReadOnly { log.Infof(LogFormat, admiral.Update, "routingpolicy", "", "", "skipping read-only mode") return } if common.GetEnableRoutingPolicy() { if common.ShouldIgnoreResource(obj.ObjectMeta) { - log.Infof(LogFormat, admiral.Update, "routingpolicy", obj.Name, obj.ClusterName, "Ignored the RoutingPolicy because of the annotation") + log.Infof(LogFormat, admiral.Update, "routingpolicy", obj.Name, "", "Ignored the RoutingPolicy because of the annotation") // We need to process this as a delete event. - r.Deleted(obj) + r.Deleted(ctx, obj) return } dependents := getDependents(obj, r) if len(dependents) == 0 { return } - r.processroutingPolicy(dependents, obj, admiral.Update) + r.processroutingPolicy(ctx, dependents, obj, admiral.Update) - log.Infof(LogFormat, admiral.Update, "routingpolicy", obj.Name, obj.ClusterName, "updated routing policy") - }else { - log.Infof(LogFormat, admiral.Update, "routingpolicy", obj.Name, obj.ClusterName, "routingpolicy disabled") + log.Infof(LogFormat, admiral.Update, "routingpolicy", obj.Name, "", "updated routing policy") + } else { + log.Infof(LogFormat, admiral.Update, "routingpolicy", obj.Name, "", "routingpolicy disabled") } } @@ -389,15 +387,16 @@ func getDependents(obj *v1.RoutingPolicy, r RoutingPolicyHandler) map[string]str return dependents } -func (r RoutingPolicyHandler) Deleted(obj *v1.RoutingPolicy) { +func (r RoutingPolicyHandler) Deleted(ctx context.Context, obj *v1.RoutingPolicy) { dependents := getDependents(obj, r) - if len(dependents) != 0 { - r.deleteEnvoyFilters(dependents, obj, admiral.Delete) - log.Infof(LogFormat, admiral.Delete, "routingpolicy", obj.Name, obj.ClusterName, "deleted envoy filter for routing policy") + if len(dependents) != 0 { + r.deleteEnvoyFilters(ctx, dependents, obj, admiral.Delete) + log.Infof(LogFormat, admiral.Delete, "routingpolicy", obj.Name, "", "deleted envoy filter for routing policy") } } -func (r RoutingPolicyHandler) deleteEnvoyFilters(dependents map[string]string, obj *v1.RoutingPolicy, eventType admiral.EventType) { +func (r RoutingPolicyHandler) deleteEnvoyFilters(ctx context.Context, dependents map[string]string, + obj *v1.RoutingPolicy, eventType admiral.EventType) { for _, dependent := range dependents { key := dependent + common.GetRoutingPolicyEnv(obj) clusterIdFilterMap := r.RemoteRegistry.AdmiralCache.RoutingPolicyFilterCache.Get(key) @@ -405,7 +404,7 @@ func (r RoutingPolicyHandler) deleteEnvoyFilters(dependents map[string]string, o if filterMap, ok := clusterIdFilterMap[rc.ClusterID]; ok { for _, filter := range filterMap { log.Infof(LogFormat, eventType, "envoyfilter", filter, rc.ClusterID, "deleting") - err := rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3().EnvoyFilters("istio-system").Delete(filter, &metaV1.DeleteOptions{}) + err := rc.RoutingPolicyController.IstioClient.NetworkingV1alpha3().EnvoyFilters("istio-system").Delete(ctx, filter, metaV1.DeleteOptions{}) if err != nil { // Best effort delete log.Errorf(LogErrFormat, eventType, "envoyfilter", filter, rc.ClusterID, err) @@ -434,31 +433,32 @@ type ServiceHandler struct { ClusterID string } -func (sh *ServiceHandler) Added(obj *k8sV1.Service) { +func (sh *ServiceHandler) Added(ctx context.Context, obj *k8sV1.Service) { log.Infof(LogFormat, "Added", "service", obj.Name, sh.ClusterID, "received") - err := HandleEventForService(obj, sh.RemoteRegistry, sh.ClusterID) + err := HandleEventForService(ctx, obj, sh.RemoteRegistry, sh.ClusterID) if err != nil { log.Errorf(LogErrFormat, "Error", "service", obj.Name, sh.ClusterID, err) } } -func (sh *ServiceHandler) Updated(obj *k8sV1.Service) { +func (sh *ServiceHandler) Updated(ctx context.Context, obj *k8sV1.Service) { log.Infof(LogFormat, "Updated", "service", obj.Name, sh.ClusterID, "received") - err := HandleEventForService(obj, sh.RemoteRegistry, sh.ClusterID) + err := HandleEventForService(ctx, obj, sh.RemoteRegistry, sh.ClusterID) if err != nil { log.Errorf(LogErrFormat, "Error", "service", obj.Name, sh.ClusterID, err) } } -func (sh *ServiceHandler) Deleted(obj *k8sV1.Service) { +func (sh *ServiceHandler) Deleted(ctx context.Context, obj *k8sV1.Service) { log.Infof(LogFormat, "Deleted", "service", obj.Name, sh.ClusterID, "received") - err := HandleEventForService(obj, sh.RemoteRegistry, sh.ClusterID) + err := HandleEventForService(ctx, obj, sh.RemoteRegistry, sh.ClusterID) if err != nil { log.Errorf(LogErrFormat, "Error", "service", obj.Name, sh.ClusterID, err) } } -func HandleEventForService(svc *k8sV1.Service, remoteRegistry *RemoteRegistry, clusterName string) error { +func HandleEventForService(ctx context.Context, svc *k8sV1.Service, remoteRegistry *RemoteRegistry, + clusterName string) error { if svc.Spec.Selector == nil { return fmt.Errorf("selector missing on service=%s in namespace=%s cluster=%s", svc.Name, svc.Namespace, clusterName) } @@ -469,45 +469,45 @@ func HandleEventForService(svc *k8sV1.Service, remoteRegistry *RemoteRegistry, c deploymentController := rc.DeploymentController rolloutController := rc.RolloutController if deploymentController != nil { - matchingDeployements := deploymentController.GetDeploymentBySelectorInNamespace(svc.Spec.Selector, svc.Namespace) + matchingDeployements := deploymentController.GetDeploymentBySelectorInNamespace(ctx, svc.Spec.Selector, svc.Namespace) if len(matchingDeployements) > 0 { for _, deployment := range matchingDeployements { - HandleEventForDeployment(admiral.Update, &deployment, remoteRegistry, clusterName) + HandleEventForDeployment(ctx, admiral.Update, &deployment, remoteRegistry, clusterName) } } } if common.GetAdmiralParams().ArgoRolloutsEnabled && rolloutController != nil { - matchingRollouts := rolloutController.GetRolloutBySelectorInNamespace(svc.Spec.Selector, svc.Namespace) + matchingRollouts := rolloutController.GetRolloutBySelectorInNamespace(ctx, svc.Spec.Selector, svc.Namespace) if len(matchingRollouts) > 0 { for _, rollout := range matchingRollouts { - HandleEventForRollout(admiral.Update, &rollout, remoteRegistry, clusterName) + HandleEventForRollout(ctx, admiral.Update, &rollout, remoteRegistry, clusterName) } } } return nil } -func (dh *DependencyHandler) Added(obj *v1.Dependency) { +func (dh *DependencyHandler) Added(ctx context.Context, obj *v1.Dependency) { log.Infof(LogFormat, "Add", "dependency-record", obj.Name, "", "Received=true namespace="+obj.Namespace) - HandleDependencyRecord(obj, dh.RemoteRegistry) + HandleDependencyRecord(ctx, obj, dh.RemoteRegistry) } -func (dh *DependencyHandler) Updated(obj *v1.Dependency) { +func (dh *DependencyHandler) Updated(ctx context.Context, obj *v1.Dependency) { log.Infof(LogFormat, "Update", "dependency-record", obj.Name, "", "Received=true namespace="+obj.Namespace) // need clean up before handle it as added, I need to handle update that delete the dependency, find diff first // this is more complex cos want to make sure no other service depend on the same service (which we just removed the dependancy). // need to make sure nothing depend on that before cleaning up the SE for that service - HandleDependencyRecord(obj, dh.RemoteRegistry) + HandleDependencyRecord(ctx, obj, dh.RemoteRegistry) } -func HandleDependencyRecord(obj *v1.Dependency, remoteRegitry *RemoteRegistry) { +func HandleDependencyRecord(ctx context.Context, obj *v1.Dependency, remoteRegitry *RemoteRegistry) { sourceIdentity := obj.Spec.Source if len(sourceIdentity) == 0 { @@ -517,58 +517,59 @@ func HandleDependencyRecord(obj *v1.Dependency, remoteRegitry *RemoteRegistry) { updateIdentityDependencyCache(sourceIdentity, remoteRegitry.AdmiralCache.IdentityDependencyCache, obj) } -func (dh *DependencyHandler) Deleted(obj *v1.Dependency) { +func (dh *DependencyHandler) Deleted(ctx context.Context, obj *v1.Dependency) { // special case of update, delete the dependency crd file for one service, need to loop through all ones we plan to update // and make sure nobody else is relying on the same SE in same cluster log.Infof(LogFormat, "Deleted", "dependency", obj.Name, "", "Skipping, not implemented") } -func (gtp *GlobalTrafficHandler) Added(obj *v1.GlobalTrafficPolicy) { +func (gtp *GlobalTrafficHandler) Added(ctx context.Context, obj *v1.GlobalTrafficPolicy) { log.Infof(LogFormat, "Added", "globaltrafficpolicy", obj.Name, gtp.ClusterID, "received") - err := HandleEventForGlobalTrafficPolicy(obj, gtp.RemoteRegistry, gtp.ClusterID) + err := HandleEventForGlobalTrafficPolicy(ctx, admiral.Add, obj, gtp.RemoteRegistry, gtp.ClusterID) if err != nil { log.Infof(err.Error()) } } -func (gtp *GlobalTrafficHandler) Updated(obj *v1.GlobalTrafficPolicy) { +func (gtp *GlobalTrafficHandler) Updated(ctx context.Context, obj *v1.GlobalTrafficPolicy) { log.Infof(LogFormat, "Updated", "globaltrafficpolicy", obj.Name, gtp.ClusterID, "received") - err := HandleEventForGlobalTrafficPolicy(obj, gtp.RemoteRegistry, gtp.ClusterID) + err := HandleEventForGlobalTrafficPolicy(ctx, admiral.Update, obj, gtp.RemoteRegistry, gtp.ClusterID) if err != nil { log.Infof(err.Error()) } } -func (gtp *GlobalTrafficHandler) Deleted(obj *v1.GlobalTrafficPolicy) { +func (gtp *GlobalTrafficHandler) Deleted(ctx context.Context, obj *v1.GlobalTrafficPolicy) { log.Infof(LogFormat, "Deleted", "globaltrafficpolicy", obj.Name, gtp.ClusterID, "received") - err := HandleEventForGlobalTrafficPolicy(obj, gtp.RemoteRegistry, gtp.ClusterID) + err := HandleEventForGlobalTrafficPolicy(ctx, admiral.Delete, obj, gtp.RemoteRegistry, gtp.ClusterID) if err != nil { log.Infof(err.Error()) } } -func (pc *DeploymentHandler) Added(obj *k8sAppsV1.Deployment) { - HandleEventForDeployment(admiral.Add, obj, pc.RemoteRegistry, pc.ClusterID) +func (pc *DeploymentHandler) Added(ctx context.Context, obj *k8sAppsV1.Deployment) { + HandleEventForDeployment(ctx, admiral.Add, obj, pc.RemoteRegistry, pc.ClusterID) } -func (pc *DeploymentHandler) Deleted(obj *k8sAppsV1.Deployment) { - HandleEventForDeployment(admiral.Delete, obj, pc.RemoteRegistry, pc.ClusterID) +func (pc *DeploymentHandler) Deleted(ctx context.Context, obj *k8sAppsV1.Deployment) { + HandleEventForDeployment(ctx, admiral.Delete, obj, pc.RemoteRegistry, pc.ClusterID) } -func (rh *RolloutHandler) Added(obj *argo.Rollout) { - HandleEventForRollout(admiral.Add, obj, rh.RemoteRegistry, rh.ClusterID) +func (rh *RolloutHandler) Added(ctx context.Context, obj *argo.Rollout) { + HandleEventForRollout(ctx, admiral.Add, obj, rh.RemoteRegistry, rh.ClusterID) } -func (rh *RolloutHandler) Updated(obj *argo.Rollout) { +func (rh *RolloutHandler) Updated(ctx context.Context, obj *argo.Rollout) { log.Infof(LogFormat, "Updated", "rollout", obj.Name, rh.ClusterID, "received") } -func (rh *RolloutHandler) Deleted(obj *argo.Rollout) { - HandleEventForRollout(admiral.Delete, obj, rh.RemoteRegistry, rh.ClusterID) +func (rh *RolloutHandler) Deleted(ctx context.Context, obj *argo.Rollout) { + HandleEventForRollout(ctx, admiral.Delete, obj, rh.RemoteRegistry, rh.ClusterID) } -// helper function to handle add and delete for RolloutHandler -func HandleEventForRollout(event admiral.EventType, obj *argo.Rollout, remoteRegistry *RemoteRegistry, clusterName string) { +// HandleEventForRollout helper function to handle add and delete for RolloutHandler +func HandleEventForRollout(ctx context.Context, event admiral.EventType, obj *argo.Rollout, + remoteRegistry *RemoteRegistry, clusterName string) { log.Infof(LogFormat, event, "rollout", obj.Name, clusterName, "Received") globalIdentifier := common.GetRolloutGlobalIdentifier(obj) @@ -581,11 +582,12 @@ func HandleEventForRollout(event admiral.EventType, obj *argo.Rollout, remoteReg env := common.GetEnvForRollout(obj) // Use the same function as added deployment function to update and put new service entry in place to replace old one - modifyServiceEntryForNewServiceOrPod(event, env, globalIdentifier, remoteRegistry) + modifyServiceEntryForNewServiceOrPod(ctx, event, env, globalIdentifier, remoteRegistry) } // helper function to handle add and delete for DeploymentHandler -func HandleEventForDeployment(event admiral.EventType, obj *k8sAppsV1.Deployment, remoteRegistry *RemoteRegistry, clusterName string) { +func HandleEventForDeployment(ctx context.Context, event admiral.EventType, obj *k8sAppsV1.Deployment, + remoteRegistry *RemoteRegistry, clusterName string) { globalIdentifier := common.GetDeploymentGlobalIdentifier(obj) @@ -597,11 +599,12 @@ func HandleEventForDeployment(event admiral.EventType, obj *k8sAppsV1.Deployment env := common.GetEnv(obj) // Use the same function as added deployment function to update and put new service entry in place to replace old one - modifyServiceEntryForNewServiceOrPod(event, env, globalIdentifier, remoteRegistry) + modifyServiceEntryForNewServiceOrPod(ctx, event, env, globalIdentifier, remoteRegistry) } // HandleEventForGlobalTrafficPolicy processes all the events related to GTPs -func HandleEventForGlobalTrafficPolicy(gtp *v1.GlobalTrafficPolicy, remoteRegistry *RemoteRegistry, clusterName string) error { +func HandleEventForGlobalTrafficPolicy(ctx context.Context, event admiral.EventType, gtp *v1.GlobalTrafficPolicy, + remoteRegistry *RemoteRegistry, clusterName string) error { globalIdentifier := common.GetGtpIdentity(gtp) @@ -615,6 +618,6 @@ func HandleEventForGlobalTrafficPolicy(gtp *v1.GlobalTrafficPolicy, remoteRegist // the endpoints from being deleted. // TODO: Need to come up with a way to prevent deleting default endpoints so that this hack can be removed. // Use the same function as added deployment function to update and put new service entry in place to replace old one - modifyServiceEntryForNewServiceOrPod(admiral.Update, env, globalIdentifier, remoteRegistry) + modifyServiceEntryForNewServiceOrPod(ctx, admiral.Update, env, globalIdentifier, remoteRegistry) return nil } diff --git a/admiral/pkg/clusters/types_test.go b/admiral/pkg/clusters/types_test.go index f64cb1e8..f0b2a453 100644 --- a/admiral/pkg/clusters/types_test.go +++ b/admiral/pkg/clusters/types_test.go @@ -4,14 +4,15 @@ import ( "bytes" "context" "fmt" - "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" - istiofake "istio.io/client-go/pkg/clientset/versioned/fake" "os" "strings" "sync" "testing" "time" + "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" + istiofake "istio.io/client-go/pkg/clientset/versioned/fake" + argo "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/google/go-cmp/cmp/cmpopts" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -52,6 +53,8 @@ func init() { func TestDeploymentHandler(t *testing.T) { + ctx := context.Background() + p := common.AdmiralParams{ KubeconfigPath: "testdata/fake.config", } @@ -124,14 +127,16 @@ func TestDeploymentHandler(t *testing.T) { gtpCache.mutex = &sync.Mutex{} handler.RemoteRegistry.AdmiralCache.GlobalTrafficCache = gtpCache - handler.Added(&deployment) - handler.Deleted(&deployment) + handler.Added(ctx, &deployment) + handler.Deleted(ctx, &deployment) }) } } func TestRolloutHandler(t *testing.T) { + ctx := context.Background() + p := common.AdmiralParams{ KubeconfigPath: "testdata/fake.config", } @@ -209,14 +214,16 @@ func TestRolloutHandler(t *testing.T) { gtpCache.mutex = &sync.Mutex{} handler.RemoteRegistry.AdmiralCache.GlobalTrafficCache = gtpCache - handler.Added(c.addedRolout) - handler.Deleted(c.addedRolout) - handler.Updated(c.addedRolout) + handler.Added(ctx, c.addedRolout) + handler.Deleted(ctx, c.addedRolout) + handler.Updated(ctx, c.addedRolout) }) } } func TestHandleEventForGlobalTrafficPolicy(t *testing.T) { + ctx := context.Background() + event := admiral.EventType("Add") p := common.AdmiralParams{ KubeconfigPath: "testdata/fake.config", } @@ -263,14 +270,13 @@ func TestHandleEventForGlobalTrafficPolicy(t *testing.T) { for _, c := range testcases { t.Run(c.name, func(t *testing.T) { - err := HandleEventForGlobalTrafficPolicy(c.gtp, registry, "testcluster") + err := HandleEventForGlobalTrafficPolicy(ctx, event, c.gtp, registry, "testcluster") assert.Equal(t, err != nil, c.doesError) }) } } - -func TestRoutingPolicyHandler(t *testing.T) { +func TestRoutingPolicyHandler(t *testing.T) { p := common.AdmiralParams{ KubeconfigPath: "testdata/fake.config", LabelSet: &common.LabelSet{}, @@ -298,7 +304,6 @@ func TestRoutingPolicyHandler(t *testing.T) { rpFilterCache.filterCache = make(map[string]map[string]map[string]string) rpFilterCache.mutex = &sync.Mutex{} - routingPolicyController := &admiral.RoutingPolicyController{IstioClient: istiofake.NewSimpleClientset()} remoteController, _ := createMockRemoteController(func(i interface{}) { @@ -312,7 +317,6 @@ func TestRoutingPolicyHandler(t *testing.T) { registry.AdmiralCache.IdentityDependencyCache.Put("foo", "bar", "bar") registry.AdmiralCache.IdentityClusterCache.Put("bar", remoteController.ClusterID, remoteController.ClusterID) - // foo is also dependent upon bar2 but bar2 is in a different cluster, so this cluster should not have the envoyfilter created registry.AdmiralCache.IdentityDependencyCache.Put("foo", "bar2", "bar2") registry.AdmiralCache.IdentityClusterCache.Put("bar2", "differentCluster", "differentCluster") @@ -321,74 +325,72 @@ func TestRoutingPolicyHandler(t *testing.T) { registry.AdmiralCache.IdentityDependencyCache.Put("foo1", "bar1", "bar1") var mp = common.NewMap() - mp.Put("k1","v1") + mp.Put("k1", "v1") registry.AdmiralCache.WorkloadSelectorCache.PutMap("bar"+remoteController.ClusterID, mp) registry.AdmiralCache.WorkloadSelectorCache.PutMap("bar2differentCluster", mp) handler.RemoteRegistry = registry routingPolicyFoo := &v1.RoutingPolicy{ - TypeMeta: time2.TypeMeta{}, + TypeMeta: time2.TypeMeta{}, ObjectMeta: time2.ObjectMeta{ Labels: map[string]string{ - "identity": "foo", + "identity": "foo", "admiral.io/env": "stage", }, }, - Spec: model.RoutingPolicy{ - Plugin: "test", - Hosts: []string{"e2e.testservice.mesh"}, + Spec: model.RoutingPolicy{ + Plugin: "test", + Hosts: []string{"e2e.testservice.mesh"}, Config: map[string]string{ - "cachePrefix": "cache-v1", - "cachettlSec": "86400", + "cachePrefix": "cache-v1", + "cachettlSec": "86400", "routingServiceUrl": "e2e.test.routing.service.mesh", - "pathPrefix": "/sayhello,/v1/company/{id}/", + "pathPrefix": "/sayhello,/v1/company/{id}/", }, }, - Status: v1.RoutingPolicyStatus{}, + Status: v1.RoutingPolicyStatus{}, } - routingPolicyFoo1 := routingPolicyFoo.DeepCopy() routingPolicyFoo1.Labels[common.GetWorkloadIdentifier()] = "foo1" - testCases := []struct { - name string - routingPolicy *v1.RoutingPolicy - expectedFilterCacheKey string - valueExpected bool - - } { + name string + routingPolicy *v1.RoutingPolicy + expectedFilterCacheKey string + valueExpected bool + }{ { - name: "If dependent deployment exists, should fetch filter from cache", - routingPolicy: routingPolicyFoo, - expectedFilterCacheKey: "barstage", - valueExpected: true, + name: "If dependent deployment exists, should fetch filter from cache", + routingPolicy: routingPolicyFoo, + expectedFilterCacheKey: "barstage", + valueExpected: true, }, { - name: "If dependent deployment does not exist, the filter should not be created", - routingPolicy: routingPolicyFoo1, - expectedFilterCacheKey: "bar1stage", - valueExpected: false, + name: "If dependent deployment does not exist, the filter should not be created", + routingPolicy: routingPolicyFoo1, + expectedFilterCacheKey: "bar1stage", + valueExpected: false, }, { - name: "If dependent deployment exists in a different cluster, the filter should not be created", - routingPolicy: routingPolicyFoo, - expectedFilterCacheKey: "bar2stage", - valueExpected: false, + name: "If dependent deployment exists in a different cluster, the filter should not be created", + routingPolicy: routingPolicyFoo, + expectedFilterCacheKey: "bar2stage", + valueExpected: false, }, - } - time.Sleep(time.Second*30) + ctx := context.Background() + + time.Sleep(time.Second * 30) for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - handler.Added(c.routingPolicy) + handler.Added(ctx, c.routingPolicy) if c.valueExpected { filterCacheValue := registry.AdmiralCache.RoutingPolicyFilterCache.Get(c.expectedFilterCacheKey) assert.NotNil(t, filterCacheValue) - selectorLabelsSha, err := common.GetSha1("bar"+common.GetRoutingPolicyEnv(c.routingPolicy)) + selectorLabelsSha, err := common.GetSha1("bar" + common.GetRoutingPolicyEnv(c.routingPolicy)) if err != nil { t.Error("Error ocurred while computing workload Labels sha1") } @@ -398,7 +400,7 @@ func TestRoutingPolicyHandler(t *testing.T) { assert.NotNil(t, filterMap[envoyFilterName]) // once the routing policy is deleted, the corresponding filter should also be deleted - handler.Deleted(c.routingPolicy) + handler.Deleted(ctx, c.routingPolicy) assert.Nil(t, registry.AdmiralCache.RoutingPolicyFilterCache.Get(c.expectedFilterCacheKey)) } else { assert.Nil(t, registry.AdmiralCache.RoutingPolicyFilterCache.Get(c.expectedFilterCacheKey)) @@ -407,15 +409,13 @@ func TestRoutingPolicyHandler(t *testing.T) { }) } - - // Test for multiple filters registry.AdmiralCache.IdentityDependencyCache.Put("foo", "bar3", "bar3") registry.AdmiralCache.IdentityClusterCache.Put("bar3", remoteController.ClusterID, remoteController.ClusterID) registry.AdmiralCache.WorkloadSelectorCache.PutMap("bar3"+remoteController.ClusterID, mp) - handler.Added(routingPolicyFoo) + handler.Added(ctx, routingPolicyFoo) - selectorLabelsShaBar3, err := common.GetSha1("bar3"+common.GetRoutingPolicyEnv(routingPolicyFoo)) + selectorLabelsShaBar3, err := common.GetSha1("bar3" + common.GetRoutingPolicyEnv(routingPolicyFoo)) if err != nil { t.Error("Error ocurred while computing workload Labels sha1") } @@ -427,13 +427,12 @@ func TestRoutingPolicyHandler(t *testing.T) { assert.NotNil(t, filterMap) assert.NotNil(t, filterMap[envoyFilterNameBar3]) - registry.AdmiralCache.IdentityDependencyCache.Put("foo", "bar4", "bar4") registry.AdmiralCache.IdentityClusterCache.Put("bar4", remoteController.ClusterID, remoteController.ClusterID) registry.AdmiralCache.WorkloadSelectorCache.PutMap("bar4"+remoteController.ClusterID, mp) - handler.Updated(routingPolicyFoo) + handler.Updated(ctx, routingPolicyFoo) - selectorLabelsShaBar4, err := common.GetSha1("bar4"+common.GetRoutingPolicyEnv(routingPolicyFoo)) + selectorLabelsShaBar4, err := common.GetSha1("bar4" + common.GetRoutingPolicyEnv(routingPolicyFoo)) if err != nil { t.Error("Error ocurred while computing workload Labels sha1") } @@ -453,7 +452,7 @@ func TestRoutingPolicyHandler(t *testing.T) { annotations[common.AdmiralIgnoreAnnotation] = "true" routingPolicyFoo.SetAnnotations(annotations) - handler.Updated(routingPolicyFoo) + handler.Updated(ctx, routingPolicyFoo) assert.Nil(t, registry.AdmiralCache.RoutingPolicyFilterCache.Get("bar4stage")) assert.Nil(t, registry.AdmiralCache.RoutingPolicyFilterCache.Get("bar3stage")) @@ -483,33 +482,31 @@ func TestRoutingPolicyReadOnly(t *testing.T) { testcases := []struct { name string - rp *v1.RoutingPolicy - readOnly bool + rp *v1.RoutingPolicy + readOnly bool doesError bool }{ { - name: "Readonly test - Routing Policy", - rp: &v1.RoutingPolicy{ - - }, - readOnly: true, + name: "Readonly test - Routing Policy", + rp: &v1.RoutingPolicy{}, + readOnly: true, doesError: true, }, { - name: "Readonly false test - Routing Policy", - rp: &v1.RoutingPolicy{ - - }, - readOnly: false, + name: "Readonly false test - Routing Policy", + rp: &v1.RoutingPolicy{}, + readOnly: false, doesError: false, }, } + ctx := context.Background() + for _, c := range testcases { t.Run(c.name, func(t *testing.T) { if c.readOnly { CurrentAdmiralState.ReadOnly = true - }else{ + } else { CurrentAdmiralState.ReadOnly = false } var buf bytes.Buffer @@ -518,22 +515,22 @@ func TestRoutingPolicyReadOnly(t *testing.T) { log.SetOutput(os.Stderr) }() // Add routing policy test - handler.Added(c.rp) + handler.Added(ctx, c.rp) t.Log(buf.String()) - val := strings.Contains(buf.String(),"skipping read-only mode") - assert.Equal(t, c.doesError,val) + val := strings.Contains(buf.String(), "skipping read-only mode") + assert.Equal(t, c.doesError, val) // Update routing policy test - handler.Updated(c.rp) + handler.Updated(ctx, c.rp) t.Log(buf.String()) - val = strings.Contains(buf.String(),"skipping read-only mode") - assert.Equal(t, c.doesError,val) + val = strings.Contains(buf.String(), "skipping read-only mode") + assert.Equal(t, c.doesError, val) // Delete routing policy test - handler.Deleted(c.rp) + handler.Deleted(ctx, c.rp) t.Log(buf.String()) - val = strings.Contains(buf.String(),"skipping read-only mode") - assert.Equal(t, c.doesError,val) + val = strings.Contains(buf.String(), "skipping read-only mode") + assert.Equal(t, c.doesError, val) }) } -} \ No newline at end of file +} diff --git a/admiral/pkg/controller/admiral/configmap.go b/admiral/pkg/controller/admiral/configmap.go index 7f730c80..8156d9b8 100644 --- a/admiral/pkg/controller/admiral/configmap.go +++ b/admiral/pkg/controller/admiral/configmap.go @@ -1,26 +1,28 @@ package admiral import ( + "context" + "strings" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" - "strings" ) const configmapName = "se-address-configmap" type ConfigMapControllerInterface interface { - GetConfigMap() (*v1.ConfigMap, error) - PutConfigMap(newMap *v1.ConfigMap) error - GetIPPrefixForServiceEntries()(seIPPrefix string) + GetConfigMap(ctx context.Context) (*v1.ConfigMap, error) + PutConfigMap(ctx context.Context, newMap *v1.ConfigMap) error + GetIPPrefixForServiceEntries() (seIPPrefix string) } type ConfigMapController struct { - K8sClient kubernetes.Interface - ConfigmapNamespace string + K8sClient kubernetes.Interface + ConfigmapNamespace string ServiceEntryIPPrefix string } @@ -40,8 +42,8 @@ func NewConfigMapController(seIPPrefix string) (*ConfigMapController, error) { return nil, err } controller := ConfigMapController{ - K8sClient: client, - ConfigmapNamespace: namespaceToUse, + K8sClient: client, + ConfigmapNamespace: namespaceToUse, ServiceEntryIPPrefix: seIPPrefix, } return &controller, nil @@ -58,8 +60,8 @@ func NewConfigMapController(seIPPrefix string) (*ConfigMapController, error) { return nil, err } controller := ConfigMapController{ - K8sClient: client, - ConfigmapNamespace: namespaceToUse, + K8sClient: client, + ConfigmapNamespace: namespaceToUse, ServiceEntryIPPrefix: seIPPrefix, } return &controller, nil @@ -67,9 +69,9 @@ func NewConfigMapController(seIPPrefix string) (*ConfigMapController, error) { } -func (c *ConfigMapController) GetConfigMap() (*v1.ConfigMap, error) { +func (c *ConfigMapController) GetConfigMap(ctx context.Context) (*v1.ConfigMap, error) { getOpts := metaV1.GetOptions{} - configMap, err := c.K8sClient.CoreV1().ConfigMaps(c.ConfigmapNamespace).Get(configmapName, getOpts) + configMap, err := c.K8sClient.CoreV1().ConfigMaps(c.ConfigmapNamespace).Get(ctx, configmapName, getOpts) if err == nil { return configMap, err @@ -79,18 +81,18 @@ func (c *ConfigMapController) GetConfigMap() (*v1.ConfigMap, error) { cm := v1.ConfigMap{} cm.Name = configmapName cm.Namespace = c.ConfigmapNamespace - configMap, err = c.K8sClient.CoreV1().ConfigMaps(c.ConfigmapNamespace).Create(&cm) + configMap, err = c.K8sClient.CoreV1().ConfigMaps(c.ConfigmapNamespace).Create(ctx, &cm, metaV1.CreateOptions{}) } return configMap, err } -func (c *ConfigMapController) PutConfigMap(newMap *v1.ConfigMap) error { - _, err := c.K8sClient.CoreV1().ConfigMaps(c.ConfigmapNamespace).Update(newMap) +func (c *ConfigMapController) PutConfigMap(ctx context.Context, newMap *v1.ConfigMap) error { + _, err := c.K8sClient.CoreV1().ConfigMaps(c.ConfigmapNamespace).Update(ctx, newMap, metaV1.UpdateOptions{}) return err } -func (c *ConfigMapController)GetIPPrefixForServiceEntries() (string) { +func (c *ConfigMapController) GetIPPrefixForServiceEntries() string { return c.ServiceEntryIPPrefix } diff --git a/admiral/pkg/controller/admiral/configmap_test.go b/admiral/pkg/controller/admiral/configmap_test.go index cbb2eb36..c2e79541 100644 --- a/admiral/pkg/controller/admiral/configmap_test.go +++ b/admiral/pkg/controller/admiral/configmap_test.go @@ -1,15 +1,18 @@ package admiral import ( + "context" "errors" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" _ "github.com/istio-ecosystem/admiral/admiral/pkg/test" log "github.com/sirupsen/logrus" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" - "testing" - "time" ) func init() { @@ -29,6 +32,7 @@ func init() { p.LabelSet.WorkloadIdentityKey = "identity" p.LabelSet.GlobalTrafficDeploymentLabel = "identity" + p.LabelSet.EnvKey = "admiral.io/env" common.InitializeConfig(p) } @@ -42,7 +46,8 @@ func TestConfigMapController_GetConfigMap(t *testing.T) { cm.Name = "se-address-configmap" cm.Namespace = "admiral" cm.Labels = map[string]string{"foo": "bar"} //differentiating from a new/empty cm - _, err := client.CoreV1().ConfigMaps("admiral").Create(&cm) + ctx := context.Background() + _, err := client.CoreV1().ConfigMaps("admiral").Create(ctx, &cm, metav1.CreateOptions{}) if err != nil { t.Errorf("%v", err) } @@ -80,7 +85,7 @@ func TestConfigMapController_GetConfigMap(t *testing.T) { for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - cm, err := c.configMapController.GetConfigMap() + cm, err := c.configMapController.GetConfigMap(ctx) if err == nil && c.expectedError == nil { //we're fine } else if c.expectedError == nil && err != nil { @@ -147,7 +152,8 @@ func TestConfigMapController_PutConfigMap(t *testing.T) { cm := v1.ConfigMap{} cm.Name = "se-address-configmap" cm.Namespace = "admiral-remote-ctx" - _, err := client.CoreV1().ConfigMaps("admiral-remote-ctx").Create(&cm) + ctx := context.Background() + _, err := client.CoreV1().ConfigMaps("admiral-remote-ctx").Create(ctx, &cm, metav1.CreateOptions{}) if err != nil { t.Errorf("%v", err) } @@ -155,7 +161,7 @@ func TestConfigMapController_PutConfigMap(t *testing.T) { cm.Data = map[string]string{"Foo": "Bar"} - err = configmapController.PutConfigMap(&cm) + err = configmapController.PutConfigMap(ctx, &cm) if err != nil { t.Errorf("No error expected. Err: %v", err) diff --git a/admiral/pkg/controller/admiral/controller.go b/admiral/pkg/controller/admiral/controller.go index 33fc427e..4f9fd65c 100644 --- a/admiral/pkg/controller/admiral/controller.go +++ b/admiral/pkg/controller/admiral/controller.go @@ -1,7 +1,10 @@ package admiral import ( + "context" "fmt" + "time" + log "github.com/sirupsen/logrus" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -9,18 +12,17 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" - "time" ) const ( maxRetries = 5 ) -// Handler interface contains the methods that are required +// Delegator interface contains the methods that are required type Delegator interface { - Added(interface{}) - Updated(interface{}, interface{}) - Deleted(interface{}) + Added(context.Context, interface{}) + Updated(context.Context, interface{}, interface{}) + Deleted(context.Context, interface{}) } type EventType string @@ -39,16 +41,16 @@ type InformerCacheObj struct { } type Controller struct { - name string + name string delegator Delegator queue workqueue.RateLimitingInterface informer cache.SharedIndexInformer } -func NewController(name string, stopCh <-chan struct{}, delegator Delegator, informer cache.SharedIndexInformer) Controller { +func NewController(name string, stopCh <-chan struct{}, delegator Delegator, informer cache.SharedIndexInformer) Controller { controller := Controller{ - name: name, + name: name, informer: informer, delegator: delegator, queue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()), @@ -101,7 +103,7 @@ func (c *Controller) Run(stopCh <-chan struct{}) { log.Infof("Informer caches synced for controller=%v, current keys=%v", c.name, c.informer.GetStore().ListKeys()) - wait.Until(c.runWorker, 5 * time.Second, stopCh) + wait.Until(c.runWorker, 5*time.Second, stopCh) } func (c *Controller) runWorker() { @@ -135,13 +137,13 @@ func (c *Controller) processNextItem() bool { } func (c *Controller) processItem(informerCacheObj InformerCacheObj) error { - + ctx := context.Background() if informerCacheObj.eventType == Delete { - c.delegator.Deleted(informerCacheObj.obj) + c.delegator.Deleted(ctx, informerCacheObj.obj) } else if informerCacheObj.eventType == Update { - c.delegator.Updated(informerCacheObj.obj, informerCacheObj.oldObj) + c.delegator.Updated(ctx, informerCacheObj.obj, informerCacheObj.oldObj) } else if informerCacheObj.eventType == Add { - c.delegator.Added(informerCacheObj.obj) + c.delegator.Added(ctx, informerCacheObj.obj) } return nil } diff --git a/admiral/pkg/controller/admiral/dependency.go b/admiral/pkg/controller/admiral/dependency.go index 52106723..9fb94940 100644 --- a/admiral/pkg/controller/admiral/dependency.go +++ b/admiral/pkg/controller/admiral/dependency.go @@ -1,22 +1,24 @@ package admiral import ( + "context" "fmt" - "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/cache" "sync" "time" + v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + clientset "github.com/istio-ecosystem/admiral/admiral/pkg/client/clientset/versioned" informerV1 "github.com/istio-ecosystem/admiral/admiral/pkg/client/informers/externalversions/admiral/v1" ) -// Handler interface contains the methods that are required +// DepHandler interface contains the methods that are required type DepHandler interface { - Added(obj *v1.Dependency) - Updated(obj *v1.Dependency) - Deleted(obj *v1.Dependency) + Added(ctx context.Context, obj *v1.Dependency) + Updated(ctx context.Context, obj *v1.Dependency) + Deleted(ctx context.Context, obj *v1.Dependency) } type DependencyController struct { @@ -91,20 +93,20 @@ func NewDependencyController(stopCh <-chan struct{}, handler DepHandler, configP return &depController, nil } -func (d *DependencyController) Added(ojb interface{}) { +func (d *DependencyController) Added(ctx context.Context, ojb interface{}) { dep := ojb.(*v1.Dependency) d.Cache.Put(dep) - d.DepHandler.Added(dep) + d.DepHandler.Added(ctx, dep) } -func (d *DependencyController) Updated(obj interface{}, oldObj interface{}) { +func (d *DependencyController) Updated(ctx context.Context, obj interface{}, oldObj interface{}) { dep := obj.(*v1.Dependency) d.Cache.Put(dep) - d.DepHandler.Updated(dep) + d.DepHandler.Updated(ctx, dep) } -func (d *DependencyController) Deleted(ojb interface{}) { +func (d *DependencyController) Deleted(ctx context.Context, ojb interface{}) { dep := ojb.(*v1.Dependency) d.Cache.Delete(dep) - d.DepHandler.Deleted(dep) + d.DepHandler.Deleted(ctx, dep) } diff --git a/admiral/pkg/controller/admiral/dependency_test.go b/admiral/pkg/controller/admiral/dependency_test.go index 01da167f..8d1dc6e3 100644 --- a/admiral/pkg/controller/admiral/dependency_test.go +++ b/admiral/pkg/controller/admiral/dependency_test.go @@ -1,13 +1,15 @@ package admiral import ( + "context" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/test" v12 "k8s.io/apimachinery/pkg/apis/meta/v1" - "testing" - "time" ) func TestNewDependencyController(t *testing.T) { @@ -39,11 +41,13 @@ func TestDependencyAddUpdateAndDelete(t *testing.T) { t.Errorf("Dependency controller should never be nil without an error thrown") } + ctx := context.Background() + //test add depName := "dep1" dep := model.Dependency{IdentityLabel: "identity", Destinations: []string{"greeting", "payments"}, Source: "webapp"} depObj := makeK8sDependencyObj(depName, "namespace1", dep) - dependencyController.Added(depObj) + dependencyController.Added(ctx, depObj) newDepObj := dependencyController.Cache.Get(depName) @@ -54,7 +58,7 @@ func TestDependencyAddUpdateAndDelete(t *testing.T) { //test update updatedDep := model.Dependency{IdentityLabel: "identity", Destinations: []string{"greeting", "payments", "newservice"}, Source: "webapp"} updatedObj := makeK8sDependencyObj(depName, "namespace1", updatedDep) - dependencyController.Updated(makeK8sDependencyObj(depName, "namespace1", updatedDep), depObj) + dependencyController.Updated(ctx, makeK8sDependencyObj(depName, "namespace1", updatedDep), depObj) updatedDepObj := dependencyController.Cache.Get(depName) @@ -63,7 +67,7 @@ func TestDependencyAddUpdateAndDelete(t *testing.T) { } //test delete - dependencyController.Deleted(updatedDepObj) + dependencyController.Deleted(ctx, updatedDepObj) deletedDepObj := dependencyController.Cache.Get(depName) diff --git a/admiral/pkg/controller/admiral/deployment.go b/admiral/pkg/controller/admiral/deployment.go index 4753d723..0d5361ea 100644 --- a/admiral/pkg/controller/admiral/deployment.go +++ b/admiral/pkg/controller/admiral/deployment.go @@ -1,26 +1,29 @@ package admiral import ( + "context" "fmt" + "time" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/util" "github.com/sirupsen/logrus" k8sAppsV1 "k8s.io/api/apps/v1" k8sAppsinformers "k8s.io/client-go/informers/apps/v1" "k8s.io/client-go/rest" - "time" + + "sync" log "github.com/sirupsen/logrus" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" - "sync" ) -// Handler interface contains the methods that are required +// DeploymentHandler interface contains the methods that are required type DeploymentHandler interface { - Added(obj *k8sAppsV1.Deployment) - Deleted(obj *k8sAppsV1.Deployment) + Added(ctx context.Context, obj *k8sAppsV1.Deployment) + Deleted(ctx context.Context, obj *k8sAppsV1.Deployment) } type DeploymentClusterEntry struct { @@ -113,7 +116,7 @@ func NewDeploymentController(stopCh <-chan struct{}, handler DeploymentHandler, cache.Indexers{}, ) - NewController("deployment-ctrl-" + config.Host , stopCh, &deploymentController, deploymentController.informer) + NewController("deployment-ctrl-"+config.Host, stopCh, &deploymentController, deploymentController.informer) return &deploymentController, nil } @@ -125,22 +128,22 @@ func NewDeploymentControllerWithLabelOverride(stopCh <-chan struct{}, handler De return dc, err } -func (d *DeploymentController) Added(obj interface{}) { - HandleAddUpdateDeployment(obj, d) +func (d *DeploymentController) Added(ctx context.Context, obj interface{}) { + HandleAddUpdateDeployment(ctx, obj, d) } -func (d *DeploymentController) Updated(obj interface{}, oldObj interface{}) { - HandleAddUpdateDeployment(obj, d) +func (d *DeploymentController) Updated(ctx context.Context, obj interface{}, oldObj interface{}) { + HandleAddUpdateDeployment(ctx, obj, d) } -func HandleAddUpdateDeployment(ojb interface{}, d *DeploymentController) { +func HandleAddUpdateDeployment(ctx context.Context, ojb interface{}, d *DeploymentController) { deployment := ojb.(*k8sAppsV1.Deployment) key := d.Cache.getKey(deployment) - defer util.LogElapsedTime("HandleAddUpdateRollout", key, deployment.Name + "_" + deployment.Namespace, "") + defer util.LogElapsedTime("HandleAddUpdateRollout", key, deployment.Name+"_"+deployment.Namespace, "") if len(key) > 0 { - if !d.shouldIgnoreBasedOnLabels(deployment) { + if !d.shouldIgnoreBasedOnLabels(ctx, deployment) { d.Cache.UpdateDeploymentToClusterCache(key, deployment) - d.DeploymentHandler.Added(deployment) + d.DeploymentHandler.Added(ctx, deployment) } else { d.Cache.DeleteFromDeploymentClusterCache(key, deployment) log.Infof("op=%s type=%v name=%v namespace=%s cluster=%s message=%s", "Get", "Deployment", deployment.Name, deployment.Namespace, "", "ignoring deployment and deleting from cache") @@ -148,16 +151,16 @@ func HandleAddUpdateDeployment(ojb interface{}, d *DeploymentController) { } } -func (d *DeploymentController) Deleted(ojb interface{}) { +func (d *DeploymentController) Deleted(ctx context.Context, ojb interface{}) { deployment := ojb.(*k8sAppsV1.Deployment) key := d.Cache.getKey(deployment) - d.DeploymentHandler.Deleted(deployment) + d.DeploymentHandler.Deleted(ctx, deployment) if len(key) > 0 { d.Cache.DeleteFromDeploymentClusterCache(key, deployment) } } -func (d *DeploymentController) shouldIgnoreBasedOnLabels(deployment *k8sAppsV1.Deployment) bool { +func (d *DeploymentController) shouldIgnoreBasedOnLabels(ctx context.Context, deployment *k8sAppsV1.Deployment) bool { if deployment.Spec.Template.Labels[d.labelSet.AdmiralIgnoreLabel] == "true" { //if we should ignore, do that and who cares what else is there return true } @@ -170,7 +173,7 @@ func (d *DeploymentController) shouldIgnoreBasedOnLabels(deployment *k8sAppsV1.D return true } - ns, err := d.K8sClient.CoreV1().Namespaces().Get(deployment.Namespace, meta_v1.GetOptions{}) + ns, err := d.K8sClient.CoreV1().Namespaces().Get(ctx, deployment.Namespace, meta_v1.GetOptions{}) if err != nil { log.Warnf("Failed to get namespace object for deployment with namespace %v, err: %v", deployment.Namespace, err) return false @@ -182,9 +185,9 @@ func (d *DeploymentController) shouldIgnoreBasedOnLabels(deployment *k8sAppsV1.D return false //labels are fine, we should not ignore } -func (d *DeploymentController) GetDeploymentBySelectorInNamespace(serviceSelector map[string]string, namespace string) []k8sAppsV1.Deployment { +func (d *DeploymentController) GetDeploymentBySelectorInNamespace(ctx context.Context, serviceSelector map[string]string, namespace string) []k8sAppsV1.Deployment { - matchedDeployments, err := d.K8sClient.AppsV1().Deployments(namespace).List(meta_v1.ListOptions{}) + matchedDeployments, err := d.K8sClient.AppsV1().Deployments(namespace).List(ctx, meta_v1.ListOptions{}) if err != nil { logrus.Errorf("Failed to list deployments in cluster, error: %v", err) diff --git a/admiral/pkg/controller/admiral/deployment_test.go b/admiral/pkg/controller/admiral/deployment_test.go index b11dc3b3..c24f5be5 100644 --- a/admiral/pkg/controller/admiral/deployment_test.go +++ b/admiral/pkg/controller/admiral/deployment_test.go @@ -1,21 +1,25 @@ package admiral import ( + "context" + "sort" + "sync" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/test" k8sAppsV1 "k8s.io/api/apps/v1" coreV1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/clientcmd" - "sort" - "sync" - "testing" - "time" ) func TestDeploymentController_Added(t *testing.T) { + ctx := context.Background() //Deployments with the correct label are added to the cache mdh := test.MockDeploymentHandler{} cache := deploymentCache{ @@ -98,14 +102,14 @@ func TestDeploymentController_Added(t *testing.T) { ns := coreV1.Namespace{} ns.Name = "test-ns" ns.Annotations = map[string]string{"admiral.io/ignore": "true"} - depController.K8sClient.CoreV1().Namespaces().Create(&ns) + depController.K8sClient.CoreV1().Namespaces().Create(ctx, &ns, metav1.CreateOptions{}) } depController.Cache.cache = map[string]*DeploymentClusterEntry{} if c.name == "Expects ignored deployment identified by label to be removed from the cache" { depController.Cache.UpdateDeploymentToClusterCache("id", &deployment) } - depController.Added(c.deployment) + depController.Added(ctx, c.deployment) if c.expectedDeployment == nil { if len(depController.Cache.cache) != 0 || (depController.Cache.cache["id"] != nil && len(depController.Cache.cache["id"].Deployments) != 0) { @@ -143,22 +147,24 @@ func TestDeploymentController_Deleted(t *testing.T) { deployment.Spec.Template.Annotations = map[string]string{"sidecar.istio.io/inject": "true"} testCases := []struct { - name string - deployment *k8sAppsV1.Deployment - expectedDeployment *k8sAppsV1.Deployment + name string + deployment *k8sAppsV1.Deployment + expectedDeployment *k8sAppsV1.Deployment }{ { - name: "Expects deployment to be deleted from the cache when the correct label is present", - deployment: &deployment, - expectedDeployment: nil, + name: "Expects deployment to be deleted from the cache when the correct label is present", + deployment: &deployment, + expectedDeployment: nil, }, { - name: "Expects no error thrown if calling delete on an deployment not exist in cache", - deployment: &deployment, - expectedDeployment: nil, + name: "Expects no error thrown if calling delete on an deployment not exist in cache", + deployment: &deployment, + expectedDeployment: nil, }, } + ctx := context.Background() + for _, c := range testCases { t.Run(c.name, func(t *testing.T) { depController.K8sClient = fake.NewSimpleClientset() @@ -171,7 +177,7 @@ func TestDeploymentController_Deleted(t *testing.T) { }, } } - depController.Deleted(c.deployment) + depController.Deleted(ctx, c.deployment) if c.expectedDeployment == nil { if len(depController.Cache.cache) > 0 && len(depController.Cache.cache["id"].Deployments) != 0 { @@ -202,7 +208,7 @@ func TestDeploymentController_GetDeploymentBySelectorInNamespace(t *testing.T) { deployment.Namespace = "namespace" deployment.Name = "fake-app-deployment-qal" deployment.Spec = k8sAppsV1.DeploymentSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app1", "env": "qal"}, @@ -214,7 +220,7 @@ func TestDeploymentController_GetDeploymentBySelectorInNamespace(t *testing.T) { deployment2.Namespace = "namespace" deployment2.Name = "fake-app-deployment-e2e" deployment2.Spec = k8sAppsV1.DeploymentSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app1", "env": "e2e"}, @@ -227,7 +233,7 @@ func TestDeploymentController_GetDeploymentBySelectorInNamespace(t *testing.T) { deployment3.Name = "fake-app-deployment-prf-1" deployment3.CreationTimestamp = v1.Now() deployment3.Spec = k8sAppsV1.DeploymentSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app1", "env": "prf"}, @@ -240,7 +246,7 @@ func TestDeploymentController_GetDeploymentBySelectorInNamespace(t *testing.T) { deployment4.Name = "fake-app-deployment-prf-2" deployment4.CreationTimestamp = v1.Date(2020, 1, 1, 1, 1, 1, 1, time.UTC) deployment4.Spec = k8sAppsV1.DeploymentSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app2"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app2"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app2", "env": "prf"}, @@ -295,11 +301,12 @@ func TestDeploymentController_GetDeploymentBySelectorInNamespace(t *testing.T) { }, } + ctx := context.Background() //Run the test for every provided case for _, c := range testCases { t.Run(c.name, func(t *testing.T) { deploymentController.K8sClient = c.fakeClient - returnedDeployments := deploymentController.GetDeploymentBySelectorInNamespace(c.selector, "namespace") + returnedDeployments := deploymentController.GetDeploymentBySelectorInNamespace(ctx, c.selector, "namespace") sort.Slice(returnedDeployments, func(i, j int) bool { return returnedDeployments[i].Name > returnedDeployments[j].Name diff --git a/admiral/pkg/controller/admiral/globaltraffic.go b/admiral/pkg/controller/admiral/globaltraffic.go index d7c88d0a..53f987c7 100644 --- a/admiral/pkg/controller/admiral/globaltraffic.go +++ b/admiral/pkg/controller/admiral/globaltraffic.go @@ -1,31 +1,33 @@ package admiral import ( + "context" "fmt" - "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" + "sync" + "time" + + v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/sirupsen/logrus" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" - "sync" - "time" clientset "github.com/istio-ecosystem/admiral/admiral/pkg/client/clientset/versioned" informerV1 "github.com/istio-ecosystem/admiral/admiral/pkg/client/informers/externalversions/admiral/v1" ) -// Handler interface contains the methods that are required +// GlobalTrafficHandler interface contains the methods that are required type GlobalTrafficHandler interface { - Added(obj *v1.GlobalTrafficPolicy) - Updated(obj *v1.GlobalTrafficPolicy) - Deleted(obj *v1.GlobalTrafficPolicy) + Added(ctx context.Context, obj *v1.GlobalTrafficPolicy) + Updated(ctx context.Context, obj *v1.GlobalTrafficPolicy) + Deleted(ctx context.Context, obj *v1.GlobalTrafficPolicy) } type GlobalTrafficController struct { CrdClient clientset.Interface GlobalTrafficHandler GlobalTrafficHandler - Cache *gtpCache + Cache *gtpCache informer cache.SharedIndexInformer } @@ -47,7 +49,7 @@ func (p *gtpCache) Put(obj *v1.GlobalTrafficPolicy) { if namespaceGtps == nil { namespaceGtps = make(map[string]*v1.GlobalTrafficPolicy) } - if common.ShouldIgnoreResource(obj.ObjectMeta){ + if common.ShouldIgnoreResource(obj.ObjectMeta) { delete(namespaceGtps, obj.Name) } else { namespaceGtps[obj.Name] = obj @@ -84,13 +86,13 @@ func (p *gtpCache) Get(key, namespace string) []*v1.GlobalTrafficPolicy { namespacesWithGtp := p.cache[key] matchedGtps := make([]*v1.GlobalTrafficPolicy, 0) for ns, gtps := range namespacesWithGtp { - if namespace == ns { - for _, gtp := range gtps { - logrus.Debugf("GTP match for identity=%s, from namespace=%v", key, ns) - //make a copy for safer iterations elsewhere - matchedGtps = append(matchedGtps, gtp.DeepCopy()) - } - } + if namespace == ns { + for _, gtp := range gtps { + logrus.Debugf("GTP match for identity=%s, from namespace=%v", key, ns) + //make a copy for safer iterations elsewhere + matchedGtps = append(matchedGtps, gtp.DeepCopy()) + } + } } return matchedGtps } @@ -121,25 +123,25 @@ func NewGlobalTrafficController(stopCh <-chan struct{}, handler GlobalTrafficHan cache.Indexers{}, ) - NewController("gtp-ctrl-" + configPath.Host, stopCh, &globalTrafficController, globalTrafficController.informer) + NewController("gtp-ctrl-"+configPath.Host, stopCh, &globalTrafficController, globalTrafficController.informer) return &globalTrafficController, nil } -func (d *GlobalTrafficController) Added(ojb interface{}) { +func (d *GlobalTrafficController) Added(ctx context.Context, ojb interface{}) { gtp := ojb.(*v1.GlobalTrafficPolicy) d.Cache.Put(gtp) - d.GlobalTrafficHandler.Added(gtp) + d.GlobalTrafficHandler.Added(ctx, gtp) } -func (d *GlobalTrafficController) Updated(ojb interface{}, oldObj interface{}) { +func (d *GlobalTrafficController) Updated(ctx context.Context, ojb interface{}, oldObj interface{}) { gtp := ojb.(*v1.GlobalTrafficPolicy) d.Cache.Put(gtp) - d.GlobalTrafficHandler.Updated(gtp) + d.GlobalTrafficHandler.Updated(ctx, gtp) } -func (d *GlobalTrafficController) Deleted(ojb interface{}) { +func (d *GlobalTrafficController) Deleted(ctx context.Context, ojb interface{}) { gtp := ojb.(*v1.GlobalTrafficPolicy) d.Cache.Delete(gtp) - d.GlobalTrafficHandler.Deleted(gtp) -} \ No newline at end of file + d.GlobalTrafficHandler.Deleted(ctx, gtp) +} diff --git a/admiral/pkg/controller/admiral/globaltraffic_test.go b/admiral/pkg/controller/admiral/globaltraffic_test.go index 5799ad82..75be3a98 100644 --- a/admiral/pkg/controller/admiral/globaltraffic_test.go +++ b/admiral/pkg/controller/admiral/globaltraffic_test.go @@ -1,6 +1,13 @@ package admiral import ( + "context" + "reflect" + "sort" + "sync" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" @@ -8,10 +15,6 @@ import ( "github.com/istio-ecosystem/admiral/admiral/pkg/test" v12 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" - "reflect" - "sync" - "testing" - "time" ) func TestNewGlobalTrafficController(t *testing.T) { @@ -51,10 +54,12 @@ func TestGlobalTrafficAddUpdateDelete(t *testing.T) { t.Errorf("GlobalTraffic controller should never be nil without an error thrown") } + ctx := context.Background() + gtpName := "gtp1" gtp := model.GlobalTrafficPolicy{Selector: map[string]string{"identity": "payments", "env": "e2e"}, Policy: []*model.TrafficPolicy{}} gtpObj := makeK8sGtpObj(gtpName, "namespace1", gtp) - globalTrafficController.Added(gtpObj) + globalTrafficController.Added(ctx, gtpObj) if !cmp.Equal(handler.Obj.Spec, gtpObj.Spec) { t.Errorf("Add should call the handler with the object") @@ -63,13 +68,13 @@ func TestGlobalTrafficAddUpdateDelete(t *testing.T) { updatedGtp := model.GlobalTrafficPolicy{Selector: map[string]string{"identity": "payments", "env": "qa"}, Policy: []*model.TrafficPolicy{}} updatedGtpObj := makeK8sGtpObj(gtpName, "namespace1", updatedGtp) - globalTrafficController.Updated(updatedGtpObj, gtpObj) + globalTrafficController.Updated(ctx, updatedGtpObj, gtpObj) if !cmp.Equal(handler.Obj.Spec, updatedGtpObj.Spec) { t.Errorf("Update should call the handler with the updated object") } - globalTrafficController.Deleted(updatedGtpObj) + globalTrafficController.Deleted(ctx, updatedGtpObj) if handler.Obj != nil { t.Errorf("Delete should delete the gtp") @@ -80,48 +85,48 @@ func TestGlobalTrafficAddUpdateDelete(t *testing.T) { func TestGlobalTrafficController_Updated(t *testing.T) { var ( - - gth = test.MockGlobalTrafficHandler{} + gth = test.MockGlobalTrafficHandler{} cache = gtpCache{ cache: make(map[string]map[string]map[string]*v1.GlobalTrafficPolicy), mutex: &sync.Mutex{}, } gtpController = GlobalTrafficController{ GlobalTrafficHandler: >h, - Cache: &cache, + Cache: &cache, } gtp = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}}, Spec: model.GlobalTrafficPolicy{ - Policy: []*model.TrafficPolicy {{DnsPrefix: "hello"}}, - },} + Policy: []*model.TrafficPolicy{{DnsPrefix: "hello"}}, + }} gtpUpdated = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}}, Spec: model.GlobalTrafficPolicy{ - Policy: []*model.TrafficPolicy {{DnsPrefix: "helloUpdated"}}, - },} + Policy: []*model.TrafficPolicy{{DnsPrefix: "helloUpdated"}}, + }} gtpUpdatedToIgnore = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}, Annotations: map[string]string{"admiral.io/ignore": "true"}}} - ) + ctx := context.Background() + //add the base object to cache - gtpController.Added(>p) + gtpController.Added(ctx, >p) testCases := []struct { - name string - gtp *v1.GlobalTrafficPolicy - expectedGtps []*v1.GlobalTrafficPolicy + name string + gtp *v1.GlobalTrafficPolicy + expectedGtps []*v1.GlobalTrafficPolicy }{ { - name: "Gtp with should be updated", - gtp: >pUpdated, - expectedGtps: []*v1.GlobalTrafficPolicy{>pUpdated}, + name: "Gtp with should be updated", + gtp: >pUpdated, + expectedGtps: []*v1.GlobalTrafficPolicy{>pUpdated}, }, { - name: "Should remove gtp from cache when update with Ignore annotation", - gtp: >pUpdatedToIgnore, - expectedGtps: []*v1.GlobalTrafficPolicy{}, + name: "Should remove gtp from cache when update with Ignore annotation", + gtp: >pUpdatedToIgnore, + expectedGtps: []*v1.GlobalTrafficPolicy{}, }, } for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - gtpController.Updated(c.gtp, gtp) + gtpController.Updated(ctx, c.gtp, gtp) gtpKey := common.GetGtpKey(c.gtp) matchedGtps := gtpController.Cache.Get(gtpKey, c.gtp.Namespace) if !reflect.DeepEqual(c.expectedGtps, matchedGtps) { @@ -134,51 +139,53 @@ func TestGlobalTrafficController_Updated(t *testing.T) { func TestGlobalTrafficController_Deleted(t *testing.T) { var ( - gth = test.MockGlobalTrafficHandler{} + gth = test.MockGlobalTrafficHandler{} cache = gtpCache{ cache: make(map[string]map[string]map[string]*v1.GlobalTrafficPolicy), mutex: &sync.Mutex{}, } gtpController = GlobalTrafficController{ GlobalTrafficHandler: >h, - Cache: &cache, + Cache: &cache, } gtp = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}}, Spec: model.GlobalTrafficPolicy{ - Policy: []*model.TrafficPolicy {{DnsPrefix: "hello"}}, - },} + Policy: []*model.TrafficPolicy{{DnsPrefix: "hello"}}, + }} gtp2 = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp2", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}}, Spec: model.GlobalTrafficPolicy{ - Policy: []*model.TrafficPolicy {{DnsPrefix: "hellogtp2"}}, - },} + Policy: []*model.TrafficPolicy{{DnsPrefix: "hellogtp2"}}, + }} gtp3 = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp3", Namespace: "namespace2", Labels: map[string]string{"identity": "id2", "admiral.io/env": "stage"}}, Spec: model.GlobalTrafficPolicy{ - Policy: []*model.TrafficPolicy {{DnsPrefix: "hellogtp3"}}, - },} + Policy: []*model.TrafficPolicy{{DnsPrefix: "hellogtp3"}}, + }} ) + ctx := context.Background() + //add the base object to cache - gtpController.Added(>p) - gtpController.Added(>p2) + gtpController.Added(ctx, >p) + gtpController.Added(ctx, >p2) testCases := []struct { - name string - gtp *v1.GlobalTrafficPolicy - expectedGtps []*v1.GlobalTrafficPolicy + name string + gtp *v1.GlobalTrafficPolicy + expectedGtps []*v1.GlobalTrafficPolicy }{ { - name: "Should delete gtp", - gtp: >p, - expectedGtps: []*v1.GlobalTrafficPolicy{>p2}, + name: "Should delete gtp", + gtp: >p, + expectedGtps: []*v1.GlobalTrafficPolicy{>p2}, }, { - name: "Deleting non existing gtp should be a no-op", - gtp: >p3, - expectedGtps: []*v1.GlobalTrafficPolicy{}, + name: "Deleting non existing gtp should be a no-op", + gtp: >p3, + expectedGtps: []*v1.GlobalTrafficPolicy{}, }, } for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - gtpController.Deleted(c.gtp) + gtpController.Deleted(ctx, c.gtp) gtpKey := common.GetGtpKey(c.gtp) matchedGtps := gtpController.Cache.Get(gtpKey, c.gtp.Namespace) if !reflect.DeepEqual(c.expectedGtps, matchedGtps) { @@ -191,17 +198,8 @@ func TestGlobalTrafficController_Deleted(t *testing.T) { func TestGlobalTrafficController_Added(t *testing.T) { var ( - - gth = test.MockGlobalTrafficHandler{} - cache = gtpCache{ - cache: make(map[string]map[string]map[string]*v1.GlobalTrafficPolicy), - mutex: &sync.Mutex{}, - } - gtpController = GlobalTrafficController{ - GlobalTrafficHandler: >h, - Cache: &cache, - } - gtp = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}},} + gth = test.MockGlobalTrafficHandler{} + gtp = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}}} gtpWithIgnoreLabels = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtpWithIgnoreLabels", Namespace: "namespace2", Labels: map[string]string{"identity": "id2", "admiral.io/env": "stage"}, Annotations: map[string]string{"admiral.io/ignore": "true"}}} gtp2 = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp2", Namespace: "namespace1", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}}} @@ -209,37 +207,60 @@ func TestGlobalTrafficController_Added(t *testing.T) { gtp3 = v1.GlobalTrafficPolicy{ObjectMeta: v12.ObjectMeta{Name: "gtp3", Namespace: "namespace3", Labels: map[string]string{"identity": "id", "admiral.io/env": "stage"}}} ) + ctx := context.Background() + testCases := []struct { - name string - gtp *v1.GlobalTrafficPolicy - expectedGtps []*v1.GlobalTrafficPolicy + name string + gtpKey string + namespace string + gtp []*v1.GlobalTrafficPolicy + expectedGtps []*v1.GlobalTrafficPolicy }{ { - name: "Gtp should be added to the cache", - gtp: >p, - expectedGtps: []*v1.GlobalTrafficPolicy{>p}, + name: "Gtp should be added to the cache", + gtpKey: "stage.id", + namespace: "namespace1", + gtp: []*v1.GlobalTrafficPolicy{>p}, + expectedGtps: []*v1.GlobalTrafficPolicy{>p}, }, { - name: "Gtp with ignore annotation should not be added to the cache", - gtp: >pWithIgnoreLabels, - expectedGtps: []*v1.GlobalTrafficPolicy{}, + name: "Gtp with ignore annotation should not be added to the cache", + gtpKey: "stage.id2", + namespace: "namespace2", + gtp: []*v1.GlobalTrafficPolicy{>pWithIgnoreLabels}, + expectedGtps: []*v1.GlobalTrafficPolicy{}, }, { - name: "Should cache multiple gtps in a namespace", - gtp: >p2, - expectedGtps: []*v1.GlobalTrafficPolicy{>p, >p2}, + name: "Should cache multiple gtps in a namespace", + gtpKey: "stage.id", + namespace: "namespace1", + gtp: []*v1.GlobalTrafficPolicy{>p, >p2}, + expectedGtps: []*v1.GlobalTrafficPolicy{>p, >p2}, }, { - name: "Should cache gtps in from multiple namespaces", - gtp: >p3, - expectedGtps: []*v1.GlobalTrafficPolicy{>p3}, + name: "Should cache gtps in from multiple namespaces", + gtpKey: "stage.id", + namespace: "namespace3", + gtp: []*v1.GlobalTrafficPolicy{>p, >p3}, + expectedGtps: []*v1.GlobalTrafficPolicy{>p3}, }, } for _, c := range testCases { t.Run(c.name, func(t *testing.T) { - gtpController.Added(c.gtp) - gtpKey := common.GetGtpKey(c.gtp) - matchedGtps := gtpController.Cache.Get(gtpKey, c.gtp.Namespace) + gtpController := GlobalTrafficController{ + GlobalTrafficHandler: >h, + Cache: >pCache{ + cache: make(map[string]map[string]map[string]*v1.GlobalTrafficPolicy), + mutex: &sync.Mutex{}, + }, + } + for _, g := range c.gtp { + gtpController.Added(ctx, g) + } + matchedGtps := gtpController.Cache.Get(c.gtpKey, c.namespace) + sort.Slice(matchedGtps, func(i, j int) bool { + return matchedGtps[i].Name < matchedGtps[j].Name + }) if !reflect.DeepEqual(c.expectedGtps, matchedGtps) { t.Errorf("Test %s failed; expected %v, got %v", c.name, c.expectedGtps, matchedGtps) } diff --git a/admiral/pkg/controller/admiral/node.go b/admiral/pkg/controller/admiral/node.go index 317c2a79..6ff1c292 100644 --- a/admiral/pkg/controller/admiral/node.go +++ b/admiral/pkg/controller/admiral/node.go @@ -1,7 +1,9 @@ package admiral import ( + "context" "fmt" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" k8sV1Informers "k8s.io/client-go/informers/core/v1" "k8s.io/client-go/rest" @@ -11,7 +13,7 @@ import ( "k8s.io/client-go/tools/cache" ) -// Handler interface contains the methods that are required +// NodeHandler interface contains the methods that are required type NodeHandler interface { } @@ -49,17 +51,17 @@ func NewNodeController(stopCh <-chan struct{}, handler NodeHandler, config *rest return &nodeController, nil } -func (p *NodeController) Added(obj interface{}) { +func (p *NodeController) Added(ctx context.Context, obj interface{}) { node := obj.(*k8sV1.Node) if p.Locality == nil { p.Locality = &Locality{Region: common.GetNodeLocality(node)} } } -func (p *NodeController) Updated(obj interface{}, oldObj interface{}) { +func (p *NodeController) Updated(ctx context.Context, obj interface{}, oldObj interface{}) { //ignore } -func (p *NodeController) Deleted(obj interface{}) { +func (p *NodeController) Deleted(ctx context.Context, obj interface{}) { //ignore } diff --git a/admiral/pkg/controller/admiral/node_test.go b/admiral/pkg/controller/admiral/node_test.go index edc8fc2b..408bcf2c 100644 --- a/admiral/pkg/controller/admiral/node_test.go +++ b/admiral/pkg/controller/admiral/node_test.go @@ -1,12 +1,14 @@ package admiral import ( + "context" + "testing" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/test" k8sV1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" - "testing" ) func TestNewNodeController(t *testing.T) { @@ -48,7 +50,9 @@ func TestNodeAddUpdateDelete(t *testing.T) { region := "us-west-2" nodeObj := &k8sV1.Node{Spec: k8sV1.NodeSpec{}, ObjectMeta: v1.ObjectMeta{Labels: map[string]string{common.NodeRegionLabel: region}}} - nodeController.Added(nodeObj) + ctx := context.Background() + + nodeController.Added(ctx, nodeObj) locality := nodeController.Locality @@ -56,13 +60,13 @@ func TestNodeAddUpdateDelete(t *testing.T) { t.Errorf("region expected %v, got: %v", region, locality.Region) } - nodeController.Updated(nodeObj, nodeObj) + nodeController.Updated(ctx, nodeObj, nodeObj) //update should make no difference if locality.Region != region { t.Errorf("region expected %v, got: %v", region, locality.Region) } - nodeController.Deleted(nodeObj) + nodeController.Deleted(ctx, nodeObj) //delete should make no difference if locality.Region != region { t.Errorf("region expected %v, got: %v", region, locality.Region) diff --git a/admiral/pkg/controller/admiral/rollouts.go b/admiral/pkg/controller/admiral/rollouts.go index 3a2501d8..fc8cf18a 100644 --- a/admiral/pkg/controller/admiral/rollouts.go +++ b/admiral/pkg/controller/admiral/rollouts.go @@ -1,6 +1,7 @@ package admiral import ( + "context" "fmt" "sync" "time" @@ -11,19 +12,19 @@ import ( argoinformers "github.com/argoproj/argo-rollouts/pkg/client/informers/externalversions" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/util" - "github.com/prometheus/common/log" "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" ) -// Handler interface contains the methods that are required +// RolloutHandler interface contains the methods that are required type RolloutHandler interface { - Added(obj *argo.Rollout) - Updated(obj *argo.Rollout) - Deleted(obj *argo.Rollout) + Added(ctx context.Context, obj *argo.Rollout) + Updated(ctx context.Context, obj *argo.Rollout) + Deleted(ctx context.Context, obj *argo.Rollout) } type RolloutsEntry struct { @@ -110,7 +111,7 @@ func (p *rolloutCache) DeleteFromRolloutToClusterCache(key string, rollout *argo } } -func (d *RolloutController) shouldIgnoreBasedOnLabelsForRollout(rollout *argo.Rollout) bool { +func (d *RolloutController) shouldIgnoreBasedOnLabelsForRollout(ctx context.Context, rollout *argo.Rollout) bool { if rollout.Spec.Template.Labels[d.labelSet.AdmiralIgnoreLabel] == "true" { //if we should ignore, do that and who cares what else is there return true } @@ -123,7 +124,7 @@ func (d *RolloutController) shouldIgnoreBasedOnLabelsForRollout(rollout *argo.Ro return true } - ns, err := d.K8sClient.CoreV1().Namespaces().Get(rollout.Namespace, meta_v1.GetOptions{}) + ns, err := d.K8sClient.CoreV1().Namespaces().Get(ctx, rollout.Namespace, meta_v1.GetOptions{}) if err != nil { log.Warnf("Failed to get namespace object for rollout with namespace %v, err: %v", rollout.Namespace, err) return false @@ -168,7 +169,7 @@ func NewRolloutsController(stopCh <-chan struct{}, handler RolloutHandler, confi //Initialize informer roController.informer = argoRolloutsInformerFactory.Argoproj().V1alpha1().Rollouts().Informer() - NewController("rollouts-ctrl-" + config.Host , stopCh, &roController, roController.informer) + NewController("rollouts-ctrl-"+config.Host, stopCh, &roController, roController.informer) return &roController, nil } @@ -178,22 +179,22 @@ func NewRolloutsControllerWithLabelOverride(stopCh <-chan struct{}, handler Roll return rc, err } -func (roc *RolloutController) Added(ojb interface{}) { - HandleAddUpdateRollout(ojb, roc) +func (roc *RolloutController) Added(ctx context.Context, ojb interface{}) { + HandleAddUpdateRollout(ctx, ojb, roc) } -func (roc *RolloutController) Updated(ojb interface{}, oldObj interface{}) { - HandleAddUpdateRollout(ojb, roc) +func (roc *RolloutController) Updated(ctx context.Context, ojb interface{}, oldObj interface{}) { + HandleAddUpdateRollout(ctx, ojb, roc) } -func HandleAddUpdateRollout(ojb interface{}, roc *RolloutController) { +func HandleAddUpdateRollout(ctx context.Context, ojb interface{}, roc *RolloutController) { rollout := ojb.(*argo.Rollout) key := roc.Cache.getKey(rollout) - defer util.LogElapsedTime("HandleAddUpdateRollout", key, rollout.Name + "_" + rollout.Namespace, "") + defer util.LogElapsedTime("HandleAddUpdateRollout", key, rollout.Name+"_"+rollout.Namespace, "") if len(key) > 0 { - if !roc.shouldIgnoreBasedOnLabelsForRollout(rollout) { + if !roc.shouldIgnoreBasedOnLabelsForRollout(ctx, rollout) { roc.Cache.UpdateRolloutToClusterCache(key, rollout) - roc.RolloutHandler.Added(rollout) + roc.RolloutHandler.Added(ctx, rollout) } else { roc.Cache.DeleteFromRolloutToClusterCache(key, rollout) log.Debugf("ignoring rollout %v based on labels", rollout.Name) @@ -201,18 +202,18 @@ func HandleAddUpdateRollout(ojb interface{}, roc *RolloutController) { } } -func (roc *RolloutController) Deleted(ojb interface{}) { +func (roc *RolloutController) Deleted(ctx context.Context, ojb interface{}) { rollout := ojb.(*argo.Rollout) key := roc.Cache.getKey(rollout) if len(key) > 0 { roc.Cache.DeleteFromRolloutToClusterCache(key, rollout) } - roc.RolloutHandler.Deleted(rollout) + roc.RolloutHandler.Deleted(ctx, rollout) } -func (d *RolloutController) GetRolloutBySelectorInNamespace(serviceSelector map[string]string, namespace string) []argo.Rollout { +func (d *RolloutController) GetRolloutBySelectorInNamespace(ctx context.Context, serviceSelector map[string]string, namespace string) []argo.Rollout { - matchedRollouts, err := d.RolloutClient.Rollouts(namespace).List(meta_v1.ListOptions{}) + matchedRollouts, err := d.RolloutClient.Rollouts(namespace).List(ctx, meta_v1.ListOptions{}) if err != nil { logrus.Errorf("Failed to list rollouts in cluster, error: %v", err) diff --git a/admiral/pkg/controller/admiral/rollouts_test.go b/admiral/pkg/controller/admiral/rollouts_test.go index 2640dad0..7624af8d 100644 --- a/admiral/pkg/controller/admiral/rollouts_test.go +++ b/admiral/pkg/controller/admiral/rollouts_test.go @@ -1,6 +1,12 @@ package admiral import ( + "context" + "sort" + "sync" + "testing" + "time" + argo "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" argofake "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/fake" argoprojv1alpha1 "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/typed/rollouts/v1alpha1" @@ -8,13 +14,10 @@ import ( "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/istio-ecosystem/admiral/admiral/pkg/test" coreV1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/clientcmd" - "sort" - "sync" - "testing" - "time" ) func TestNewRolloutController(t *testing.T) { @@ -33,6 +36,7 @@ func TestNewRolloutController(t *testing.T) { } func TestRolloutController_Added(t *testing.T) { + ctx := context.Background() //Rollouts with the correct label are added to the cache mdh := test.MockRolloutHandler{} cache := rolloutCache{ @@ -115,10 +119,10 @@ func TestRolloutController_Added(t *testing.T) { ns := coreV1.Namespace{} ns.Name = "test-ns" ns.Annotations = map[string]string{"admiral.io/ignore": "true"} - depController.K8sClient.CoreV1().Namespaces().Create(&ns) + depController.K8sClient.CoreV1().Namespaces().Create(ctx, &ns, metav1.CreateOptions{}) } depController.Cache.cache = map[string]*RolloutClusterEntry{} - depController.Added(c.rollout) + depController.Added(ctx, c.rollout) if c.expectedRollout == nil { if len(depController.Cache.cache) != 0 || (depController.Cache.cache["id"] != nil && len(depController.Cache.cache["id"].Rollouts) != 0) { t.Errorf("Cache should be empty if expected rollout is nil") @@ -135,6 +139,7 @@ func TestRolloutController_Added(t *testing.T) { } func TestRolloutController_Deleted(t *testing.T) { + ctx := context.Background() //Rollouts with the correct label are added to the cache mdh := test.MockRolloutHandler{} cache := rolloutCache{ @@ -183,7 +188,7 @@ func TestRolloutController_Deleted(t *testing.T) { }, } } - depController.Deleted(c.rollout) + depController.Deleted(ctx, c.rollout) if c.expectedRollout == nil { if len(depController.Cache.cache) > 0 && len(depController.Cache.cache["id"].Rollouts) != 0 { @@ -196,11 +201,12 @@ func TestRolloutController_Deleted(t *testing.T) { } func TestRolloutController_GetRolloutBySelectorInNamespace(t *testing.T) { + rollout := argo.Rollout{} rollout.Namespace = "namespace" rollout.Name = "fake-app-rollout-qal" rollout.Spec = argo.RolloutSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app1", "env": "qal"}, @@ -212,7 +218,7 @@ func TestRolloutController_GetRolloutBySelectorInNamespace(t *testing.T) { rollout2.Namespace = "namespace" rollout2.Name = "fake-app-rollout-e2e" rollout2.Spec = argo.RolloutSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app1", "env": "e2e"}, @@ -225,7 +231,7 @@ func TestRolloutController_GetRolloutBySelectorInNamespace(t *testing.T) { rollout3.Name = "fake-app-rollout-prf-1" rollout3.CreationTimestamp = v1.Now() rollout3.Spec = argo.RolloutSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app1"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app1", "env": "prf"}, @@ -238,7 +244,7 @@ func TestRolloutController_GetRolloutBySelectorInNamespace(t *testing.T) { rollout4.Name = "fake-app-rollout-prf-2" rollout4.CreationTimestamp = v1.Date(2020, 1, 1, 1, 1, 1, 1, time.UTC) rollout4.Spec = argo.RolloutSpec{ - Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app2"},}, + Selector: &v1.LabelSelector{MatchLabels: map[string]string{"identity": "app2"}}, Template: coreV1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"identity": "app2", "env": "prf"}, @@ -265,39 +271,41 @@ func TestRolloutController_GetRolloutBySelectorInNamespace(t *testing.T) { name: "Get one", expectedRollouts: []argo.Rollout{rollout}, fakeClient: oneRolloutClient, - selector: map[string]string {"identity": "app1", common.RolloutPodHashLabel: "random-hash"}, + selector: map[string]string{"identity": "app1", common.RolloutPodHashLabel: "random-hash"}, }, { name: "Get one from long list", expectedRollouts: []argo.Rollout{rollout4}, fakeClient: allRolloutsClient, - selector: map[string]string {"identity": "app2", common.RolloutPodHashLabel: "random-hash"}, + selector: map[string]string{"identity": "app2", common.RolloutPodHashLabel: "random-hash"}, }, { name: "Get many from long list", expectedRollouts: []argo.Rollout{rollout, rollout3, rollout2}, fakeClient: allRolloutsClient, - selector: map[string]string {"identity": "app1", common.RolloutPodHashLabel: "random-hash"}, + selector: map[string]string{"identity": "app1", common.RolloutPodHashLabel: "random-hash"}, }, { name: "Get none from long list", expectedRollouts: []argo.Rollout{}, fakeClient: allRolloutsClient, - selector: map[string]string {"identity": "app3", common.RolloutPodHashLabel: "random-hash"}, + selector: map[string]string{"identity": "app3", common.RolloutPodHashLabel: "random-hash"}, }, { name: "Get none from empty list", expectedRollouts: []argo.Rollout{}, fakeClient: noRolloutsClient, - selector: map[string]string {"identity": "app1"}, + selector: map[string]string{"identity": "app1"}, }, } + ctx := context.Background() + //Run the test for every provided case for _, c := range testCases { t.Run(c.name, func(t *testing.T) { rolloutController.RolloutClient = c.fakeClient - returnedRollouts := rolloutController.GetRolloutBySelectorInNamespace(c.selector, "namespace") + returnedRollouts := rolloutController.GetRolloutBySelectorInNamespace(ctx, c.selector, "namespace") sort.Slice(returnedRollouts, func(i, j int) bool { return returnedRollouts[i].Name > returnedRollouts[j].Name diff --git a/admiral/pkg/controller/admiral/routingpolicy.go b/admiral/pkg/controller/admiral/routingpolicy.go index c16f99a3..fb9eef87 100644 --- a/admiral/pkg/controller/admiral/routingpolicy.go +++ b/admiral/pkg/controller/admiral/routingpolicy.go @@ -1,9 +1,11 @@ - package admiral import ( + "context" "fmt" - "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" + "time" + + v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" clientset "github.com/istio-ecosystem/admiral/admiral/pkg/client/clientset/versioned" informerV1 "github.com/istio-ecosystem/admiral/admiral/pkg/client/informers/externalversions/admiral/v1" "istio.io/client-go/pkg/clientset/versioned" @@ -11,48 +13,46 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" - "time" ) -// Handler interface contains the methods that are required +// RoutingPolicyHandler interface contains the methods that are required type RoutingPolicyHandler interface { - Added(obj *v1.RoutingPolicy) - Updated(obj *v1.RoutingPolicy) - Deleted(obj *v1.RoutingPolicy) + Added(ctx context.Context, obj *v1.RoutingPolicy) + Updated(ctx context.Context, obj *v1.RoutingPolicy) + Deleted(ctx context.Context, obj *v1.RoutingPolicy) } type RoutingPolicyEntry struct { - Identity string - RoutingPolicy *v1.RoutingPolicy + Identity string + RoutingPolicy *v1.RoutingPolicy } type RoutingPolicyClusterEntry struct { - Identity string + Identity string RoutingPolicies map[string]*v1.RoutingPolicy } type RoutingPolicyController struct { - K8sClient kubernetes.Interface + K8sClient kubernetes.Interface CrdClient clientset.Interface - IstioClient versioned.Interface + IstioClient versioned.Interface RoutingPolicyHandler RoutingPolicyHandler informer cache.SharedIndexInformer } - -func (r *RoutingPolicyController) Added(obj interface{}) { +func (r *RoutingPolicyController) Added(ctx context.Context, obj interface{}) { routingPolicy := obj.(*v1.RoutingPolicy) - r.RoutingPolicyHandler.Added(routingPolicy) + r.RoutingPolicyHandler.Added(ctx, routingPolicy) } -func (r *RoutingPolicyController) Updated(obj interface{}, oldObj interface{}) { +func (r *RoutingPolicyController) Updated(ctx context.Context, obj interface{}, oldObj interface{}) { routingPolicy := obj.(*v1.RoutingPolicy) - r.RoutingPolicyHandler.Updated(routingPolicy) + r.RoutingPolicyHandler.Updated(ctx, routingPolicy) } -func (r *RoutingPolicyController) Deleted(obj interface{}) { +func (r *RoutingPolicyController) Deleted(ctx context.Context, obj interface{}) { routingPolicy := obj.(*v1.RoutingPolicy) - r.RoutingPolicyHandler.Deleted(routingPolicy) + r.RoutingPolicyHandler.Deleted(ctx, routingPolicy) } func NewRoutingPoliciesController(stopCh <-chan struct{}, handler RoutingPolicyHandler, configPath *rest.Config, resyncPeriod time.Duration) (*RoutingPolicyController, error) { @@ -84,7 +84,7 @@ func NewRoutingPoliciesController(stopCh <-chan struct{}, handler RoutingPolicyH cache.Indexers{}, ) - NewController("rp-ctrl-" + configPath.Host, stopCh, &rpController, rpController.informer) + NewController("rp-ctrl-"+configPath.Host, stopCh, &rpController, rpController.informer) return &rpController, nil } diff --git a/admiral/pkg/controller/admiral/routingpolicy_test.go b/admiral/pkg/controller/admiral/routingpolicy_test.go index 6219f953..47ec8114 100644 --- a/admiral/pkg/controller/admiral/routingpolicy_test.go +++ b/admiral/pkg/controller/admiral/routingpolicy_test.go @@ -1,17 +1,18 @@ package admiral import ( + "context" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/model" v1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/test" v12 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" - "testing" - "time" ) - func TestNewroutingPolicyController(t *testing.T) { config, err := clientcmd.BuildConfigFromFlags("", "../../test/resources/admins@fake-cluster.k8s.local") if err != nil { @@ -31,7 +32,6 @@ func TestNewroutingPolicyController(t *testing.T) { } } - func TestRoutingPolicyAddUpdateDelete(t *testing.T) { config, err := clientcmd.BuildConfigFromFlags("", "../../test/resources/admins@fake-cluster.k8s.local") if err != nil { @@ -53,11 +53,13 @@ func TestRoutingPolicyAddUpdateDelete(t *testing.T) { rp := model.RoutingPolicy{ Config: map[string]string{"cacheTTL": "86400", "dispatcherUrl": "stage.greeting.router.mesh", "pathPrefix": "/hello,/hello/v2/"}, Plugin: "greeting", - Hosts: []string{"stage.greeting.mesh"}, + Hosts: []string{"stage.greeting.mesh"}, } + ctx := context.Background() + rpObj := makeK8sRoutingPolicyObj(rpName, "namespace1", rp) - routingPolicyController.Added(rpObj) + routingPolicyController.Added(ctx, rpObj) if !cmp.Equal(handler.Obj.Spec, rpObj.Spec) { t.Errorf("Add should call the handler with the object") @@ -66,18 +68,18 @@ func TestRoutingPolicyAddUpdateDelete(t *testing.T) { updatedrp := model.RoutingPolicy{ Config: map[string]string{"cacheTTL": "86400", "dispatcherUrl": "e2e.greeting.router.mesh", "pathPrefix": "/hello,/hello/v2/"}, Plugin: "greeting", - Hosts: []string{"e2e.greeting.mesh"}, + Hosts: []string{"e2e.greeting.mesh"}, } updatedRpObj := makeK8sRoutingPolicyObj(rpName, "namespace1", updatedrp) - routingPolicyController.Updated(updatedRpObj, rpObj) + routingPolicyController.Updated(ctx, updatedRpObj, rpObj) if !cmp.Equal(handler.Obj.Spec, updatedRpObj.Spec) { t.Errorf("Update should call the handler with the updated object") } - routingPolicyController.Deleted(updatedRpObj) + routingPolicyController.Deleted(ctx, updatedRpObj) if handler.Obj != nil { t.Errorf("Delete should delete the routing policy") @@ -85,7 +87,6 @@ func TestRoutingPolicyAddUpdateDelete(t *testing.T) { } - func makeK8sRoutingPolicyObj(name string, namespace string, rp model.RoutingPolicy) *v1.RoutingPolicy { return &v1.RoutingPolicy{ Spec: rp, diff --git a/admiral/pkg/controller/admiral/service.go b/admiral/pkg/controller/admiral/service.go index d47f2082..d035e065 100644 --- a/admiral/pkg/controller/admiral/service.go +++ b/admiral/pkg/controller/admiral/service.go @@ -1,11 +1,13 @@ package admiral import ( + "context" "fmt" - "github.com/prometheus/common/log" "sort" "time" + "github.com/prometheus/common/log" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" @@ -19,11 +21,11 @@ import ( "k8s.io/client-go/tools/cache" ) -// Handler interface contains the methods that are required +// ServiceHandler interface contains the methods that are required type ServiceHandler interface { - Added(obj *k8sV1.Service) - Updated(obj *k8sV1.Service) - Deleted(obj *k8sV1.Service) + Added(ctx context.Context, obj *k8sV1.Service) + Updated(ctx context.Context, obj *k8sV1.Service) + Deleted(ctx context.Context, obj *k8sV1.Service) } type ServiceClusterEntry struct { @@ -80,7 +82,7 @@ func (s *serviceCache) Get(key string) []*k8sV1.Service { defer s.mutex.Unlock() serviceClusterEntry := s.cache[key] if serviceClusterEntry != nil { - return getOrderedServices (serviceClusterEntry.Service[key]) + return getOrderedServices(serviceClusterEntry.Service[key]) } else { return nil } @@ -88,7 +90,7 @@ func (s *serviceCache) Get(key string) []*k8sV1.Service { func getOrderedServices(serviceMap map[string]*k8sV1.Service) []*k8sV1.Service { orderedServices := make([]*k8sV1.Service, 0, len(serviceMap)) - for _, value := range serviceMap { + for _, value := range serviceMap { orderedServices = append(orderedServices, value) } if len(orderedServices) > 1 { @@ -164,13 +166,15 @@ func NewServiceController(stopCh <-chan struct{}, handler ServiceHandler, config return nil, fmt.Errorf("failed to create ingress service controller k8s client: %v", err) } + ctx := context.Background() + serviceController.informer = cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(opts meta_v1.ListOptions) (runtime.Object, error) { - return serviceController.K8sClient.CoreV1().Services(meta_v1.NamespaceAll).List(opts) + return serviceController.K8sClient.CoreV1().Services(meta_v1.NamespaceAll).List(ctx, opts) }, WatchFunc: func(opts meta_v1.ListOptions) (watch.Interface, error) { - return serviceController.K8sClient.CoreV1().Services(meta_v1.NamespaceAll).Watch(opts) + return serviceController.K8sClient.CoreV1().Services(meta_v1.NamespaceAll).Watch(ctx, opts) }, }, &k8sV1.Service{}, resyncPeriod, cache.Indexers{}, @@ -181,22 +185,23 @@ func NewServiceController(stopCh <-chan struct{}, handler ServiceHandler, config return &serviceController, nil } -func (s *ServiceController) Added(obj interface{}) { +func (s *ServiceController) Added(ctx context.Context, obj interface{}) { service := obj.(*k8sV1.Service) s.Cache.Put(service) - s.ServiceHandler.Added(service) + s.ServiceHandler.Added(ctx, service) } -func (s *ServiceController) Updated(obj interface{}, oldObj interface{}) { +func (s *ServiceController) Updated(ctx context.Context, obj interface{}, oldObj interface{}) { + service := obj.(*k8sV1.Service) s.Cache.Put(service) - s.ServiceHandler.Updated(service) + s.ServiceHandler.Updated(ctx, service) } -func (s *ServiceController) Deleted(obj interface{}) { +func (s *ServiceController) Deleted(ctx context.Context, obj interface{}) { service := obj.(*k8sV1.Service) s.Cache.Delete(service) - s.ServiceHandler.Deleted(service) + s.ServiceHandler.Deleted(ctx, service) } func (s *serviceCache) shouldIgnoreBasedOnLabels(service *k8sV1.Service) bool { diff --git a/admiral/pkg/controller/admiral/service_test.go b/admiral/pkg/controller/admiral/service_test.go index c24fd813..769f448d 100644 --- a/admiral/pkg/controller/admiral/service_test.go +++ b/admiral/pkg/controller/admiral/service_test.go @@ -130,11 +130,11 @@ func TestServiceCache_GetLoadBalancer(t *testing.T) { externalIPService.Spec.ExternalIPs = []string{"1.2.3.4"} externalIPService.Spec.Ports = []v1.ServicePort{ { - "http", - v1.ProtocolTCP, - common.DefaultMtlsPort, - intstr.FromInt(80), - 30800, + Name: "http", + Protocol: v1.ProtocolTCP, + Port: common.DefaultMtlsPort, + TargetPort: intstr.FromInt(80), + NodePort: 30800, }, } externalIPService.Labels = map[string]string{"app": "test-service-externalip"} diff --git a/admiral/pkg/controller/istio/destinationrule.go b/admiral/pkg/controller/istio/destinationrule.go index 0aa0b221..5f15422a 100644 --- a/admiral/pkg/controller/istio/destinationrule.go +++ b/admiral/pkg/controller/istio/destinationrule.go @@ -1,6 +1,7 @@ package istio import ( + "context" "fmt" "time" @@ -15,9 +16,9 @@ import ( // Handler interface contains the methods that are required type DestinationRuleHandler interface { - Added(obj *networking.DestinationRule) - Updated(obj *networking.DestinationRule) - Deleted(obj *networking.DestinationRule) + Added(ctx context.Context, obj *networking.DestinationRule) + Updated(ctx context.Context, obj *networking.DestinationRule) + Deleted(ctx context.Context, obj *networking.DestinationRule) } type DestinationRuleEntry struct { @@ -52,18 +53,18 @@ func NewDestinationRuleController(stopCh <-chan struct{}, handler DestinationRul return &drController, nil } -func (sec *DestinationRuleController) Added(ojb interface{}) { +func (sec *DestinationRuleController) Added(ctx context.Context, ojb interface{}) { dr := ojb.(*networking.DestinationRule) - sec.DestinationRuleHandler.Added(dr) + sec.DestinationRuleHandler.Added(ctx, dr) } -func (sec *DestinationRuleController) Updated(ojb interface{}, oldObj interface{}) { +func (sec *DestinationRuleController) Updated(ctx context.Context, ojb interface{}, oldObj interface{}) { dr := ojb.(*networking.DestinationRule) - sec.DestinationRuleHandler.Updated(dr) + sec.DestinationRuleHandler.Updated(ctx, dr) } -func (sec *DestinationRuleController) Deleted(ojb interface{}) { +func (sec *DestinationRuleController) Deleted(ctx context.Context, ojb interface{}) { dr := ojb.(*networking.DestinationRule) - sec.DestinationRuleHandler.Deleted(dr) + sec.DestinationRuleHandler.Deleted(ctx, dr) } diff --git a/admiral/pkg/controller/istio/destinationrule_test.go b/admiral/pkg/controller/istio/destinationrule_test.go index 8a79a41b..04cbb795 100644 --- a/admiral/pkg/controller/istio/destinationrule_test.go +++ b/admiral/pkg/controller/istio/destinationrule_test.go @@ -1,14 +1,17 @@ package istio import ( + "context" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/test" + "google.golang.org/protobuf/testing/protocmp" v1alpha32 "istio.io/api/networking/v1alpha3" "istio.io/client-go/pkg/apis/networking/v1alpha3" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" - "testing" - "time" ) func TestNewDestinationRuleController(t *testing.T) { @@ -31,20 +34,21 @@ func TestNewDestinationRuleController(t *testing.T) { dstRule := &v1alpha3.DestinationRule{Spec: v1alpha32.DestinationRule{}, ObjectMeta: v1.ObjectMeta{Name: "dr1", Namespace: "namespace1"}} - destinationRuleController.Added(dstRule) + ctx := context.Background() - if !cmp.Equal(dstRule.Spec, handler.Obj.Spec) { + destinationRuleController.Added(ctx, dstRule) + if !cmp.Equal(&dstRule.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the added obj") } updatedDstRule := &v1alpha3.DestinationRule{Spec: v1alpha32.DestinationRule{Host: "hello.global"}, ObjectMeta: v1.ObjectMeta{Name: "dr1", Namespace: "namespace1"}} - destinationRuleController.Updated(updatedDstRule, dstRule) + destinationRuleController.Updated(ctx, updatedDstRule, dstRule) - if !cmp.Equal(updatedDstRule.Spec, handler.Obj.Spec) { + if !cmp.Equal(&updatedDstRule.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the updated obj") } - destinationRuleController.Deleted(dstRule) + destinationRuleController.Deleted(ctx, dstRule) if handler.Obj != nil { t.Errorf("Handler should have no obj") diff --git a/admiral/pkg/controller/istio/serviceentry.go b/admiral/pkg/controller/istio/serviceentry.go index fd17dde0..c800e21a 100644 --- a/admiral/pkg/controller/istio/serviceentry.go +++ b/admiral/pkg/controller/istio/serviceentry.go @@ -1,6 +1,7 @@ package istio import ( + "context" "fmt" "time" @@ -52,17 +53,17 @@ func NewServiceEntryController(stopCh <-chan struct{}, handler ServiceEntryHandl return &seController, nil } -func (sec *ServiceEntryController) Added(ojb interface{}) { +func (sec *ServiceEntryController) Added(ctx context.Context, ojb interface{}) { se := ojb.(*networking.ServiceEntry) sec.ServiceEntryHandler.Added(se) } -func (sec *ServiceEntryController) Updated(ojb interface{}, oldObj interface{}) { +func (sec *ServiceEntryController) Updated(ctx context.Context, ojb interface{}, oldObj interface{}) { se := ojb.(*networking.ServiceEntry) sec.ServiceEntryHandler.Updated(se) } -func (sec *ServiceEntryController) Deleted(ojb interface{}) { +func (sec *ServiceEntryController) Deleted(ctx context.Context, ojb interface{}) { se := ojb.(*networking.ServiceEntry) sec.ServiceEntryHandler.Deleted(se) diff --git a/admiral/pkg/controller/istio/serviceentry_test.go b/admiral/pkg/controller/istio/serviceentry_test.go index f7567192..c7a86d73 100644 --- a/admiral/pkg/controller/istio/serviceentry_test.go +++ b/admiral/pkg/controller/istio/serviceentry_test.go @@ -1,14 +1,17 @@ package istio import ( + "context" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/test" + "google.golang.org/protobuf/testing/protocmp" "istio.io/api/networking/v1alpha3" v1alpha32 "istio.io/client-go/pkg/apis/networking/v1alpha3" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" - "testing" - "time" ) func TestNewServiceEntryController(t *testing.T) { @@ -31,20 +34,22 @@ func TestNewServiceEntryController(t *testing.T) { serviceEntry := &v1alpha32.ServiceEntry{Spec: v1alpha3.ServiceEntry{}, ObjectMeta: v1.ObjectMeta{Name: "se1", Namespace: "namespace1"}} - serviceEntryController.Added(serviceEntry) + ctx := context.Background() + + serviceEntryController.Added(ctx, serviceEntry) - if !cmp.Equal(serviceEntry.Spec, handler.Obj.Spec) { + if !cmp.Equal(&serviceEntry.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the added obj") } updatedServiceEntry := &v1alpha32.ServiceEntry{Spec: v1alpha3.ServiceEntry{Hosts: []string{"hello.global"}}, ObjectMeta: v1.ObjectMeta{Name: "se1", Namespace: "namespace1"}} - serviceEntryController.Updated(updatedServiceEntry, serviceEntry) + serviceEntryController.Updated(ctx, updatedServiceEntry, serviceEntry) - if !cmp.Equal(updatedServiceEntry.Spec, handler.Obj.Spec) { + if !cmp.Equal(&updatedServiceEntry.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the updated obj") } - serviceEntryController.Deleted(serviceEntry) + serviceEntryController.Deleted(ctx, serviceEntry) if handler.Obj != nil { t.Errorf("Handler should have no obj") diff --git a/admiral/pkg/controller/istio/sidecar.go b/admiral/pkg/controller/istio/sidecar.go index ee35997c..0947caa7 100644 --- a/admiral/pkg/controller/istio/sidecar.go +++ b/admiral/pkg/controller/istio/sidecar.go @@ -1,6 +1,7 @@ package istio import ( + "context" "fmt" "time" @@ -13,11 +14,11 @@ import ( "k8s.io/client-go/tools/cache" ) -// Handler interface contains the methods that are required +// SidecarHandler interface contains the methods that are required type SidecarHandler interface { - Added(obj *networking.Sidecar) - Updated(obj *networking.Sidecar) - Deleted(obj *networking.Sidecar) + Added(ctx context.Context, obj *networking.Sidecar) + Updated(ctx context.Context, obj *networking.Sidecar) + Deleted(ctx context.Context, obj *networking.Sidecar) } type SidecarEntry struct { @@ -52,18 +53,18 @@ func NewSidecarController(stopCh <-chan struct{}, handler SidecarHandler, config return &sidecarController, nil } -func (sec *SidecarController) Added(ojb interface{}) { +func (sec *SidecarController) Added(ctx context.Context, ojb interface{}) { sidecar := ojb.(*networking.Sidecar) - sec.SidecarHandler.Added(sidecar) + sec.SidecarHandler.Added(ctx, sidecar) } -func (sec *SidecarController) Updated(ojb interface{}, oldObj interface{}) { +func (sec *SidecarController) Updated(ctx context.Context, ojb interface{}, oldObj interface{}) { sidecar := ojb.(*networking.Sidecar) - sec.SidecarHandler.Updated(sidecar) + sec.SidecarHandler.Updated(ctx, sidecar) } -func (sec *SidecarController) Deleted(ojb interface{}) { +func (sec *SidecarController) Deleted(ctx context.Context, ojb interface{}) { sidecar := ojb.(*networking.Sidecar) - sec.SidecarHandler.Deleted(sidecar) + sec.SidecarHandler.Deleted(ctx, sidecar) } diff --git a/admiral/pkg/controller/istio/sidecar_test.go b/admiral/pkg/controller/istio/sidecar_test.go index 40ae8eb7..0ccccc44 100644 --- a/admiral/pkg/controller/istio/sidecar_test.go +++ b/admiral/pkg/controller/istio/sidecar_test.go @@ -1,14 +1,17 @@ package istio import ( + "context" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/test" + "google.golang.org/protobuf/testing/protocmp" v1alpha32 "istio.io/api/networking/v1alpha3" "istio.io/client-go/pkg/apis/networking/v1alpha3" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" - "testing" - "time" ) func TestNewSidecarController(t *testing.T) { @@ -31,20 +34,22 @@ func TestNewSidecarController(t *testing.T) { sc := &v1alpha3.Sidecar{Spec: v1alpha32.Sidecar{}, ObjectMeta: v1.ObjectMeta{Name: "sc1", Namespace: "namespace1"}} - sidecarController.Added(sc) + ctx := context.Background() + + sidecarController.Added(ctx, sc) - if !cmp.Equal(sc.Spec, handler.Obj.Spec) { + if !cmp.Equal(&sc.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the added obj") } updatedSc := &v1alpha3.Sidecar{Spec: v1alpha32.Sidecar{WorkloadSelector: &v1alpha32.WorkloadSelector{Labels: map[string]string{"this": "that"}}}, ObjectMeta: v1.ObjectMeta{Name: "sc1", Namespace: "namespace1"}} - sidecarController.Updated(updatedSc, sc) + sidecarController.Updated(ctx, updatedSc, sc) - if !cmp.Equal(updatedSc.Spec, handler.Obj.Spec) { + if !cmp.Equal(&updatedSc.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the updated obj") } - sidecarController.Deleted(sc) + sidecarController.Deleted(ctx, sc) if handler.Obj != nil { t.Errorf("Handler should have no obj") diff --git a/admiral/pkg/controller/istio/virtualservice.go b/admiral/pkg/controller/istio/virtualservice.go index 1c8a8650..e765b51a 100644 --- a/admiral/pkg/controller/istio/virtualservice.go +++ b/admiral/pkg/controller/istio/virtualservice.go @@ -1,6 +1,7 @@ package istio import ( + "context" "fmt" "time" @@ -13,11 +14,11 @@ import ( "k8s.io/client-go/tools/cache" ) -// Handler interface contains the methods that are required +// VirtualServiceHandler interface contains the methods that are required type VirtualServiceHandler interface { - Added(obj *networking.VirtualService) - Updated(obj *networking.VirtualService) - Deleted(obj *networking.VirtualService) + Added(ctx context.Context, obj *networking.VirtualService) + Updated(ctx context.Context, obj *networking.VirtualService) + Deleted(ctx context.Context, obj *networking.VirtualService) } type VirtualServiceController struct { @@ -47,18 +48,18 @@ func NewVirtualServiceController(stopCh <-chan struct{}, handler VirtualServiceH return &drController, nil } -func (sec *VirtualServiceController) Added(ojb interface{}) { +func (sec *VirtualServiceController) Added(ctx context.Context, ojb interface{}) { dr := ojb.(*networking.VirtualService) - sec.VirtualServiceHandler.Added(dr) + sec.VirtualServiceHandler.Added(ctx, dr) } -func (sec *VirtualServiceController) Updated(ojb interface{}, oldObj interface{}) { +func (sec *VirtualServiceController) Updated(ctx context.Context, ojb interface{}, oldObj interface{}) { dr := ojb.(*networking.VirtualService) - sec.VirtualServiceHandler.Updated(dr) + sec.VirtualServiceHandler.Updated(ctx, dr) } -func (sec *VirtualServiceController) Deleted(ojb interface{}) { +func (sec *VirtualServiceController) Deleted(ctx context.Context, ojb interface{}) { dr := ojb.(*networking.VirtualService) - sec.VirtualServiceHandler.Deleted(dr) + sec.VirtualServiceHandler.Deleted(ctx, dr) } diff --git a/admiral/pkg/controller/istio/virtualservice_test.go b/admiral/pkg/controller/istio/virtualservice_test.go index 3352ba31..45e96118 100644 --- a/admiral/pkg/controller/istio/virtualservice_test.go +++ b/admiral/pkg/controller/istio/virtualservice_test.go @@ -1,14 +1,17 @@ package istio import ( + "context" + "testing" + "time" + "github.com/google/go-cmp/cmp" "github.com/istio-ecosystem/admiral/admiral/pkg/test" + "google.golang.org/protobuf/testing/protocmp" v1alpha32 "istio.io/api/networking/v1alpha3" "istio.io/client-go/pkg/apis/networking/v1alpha3" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" - "testing" - "time" ) func TestNewVirtualServiceController(t *testing.T) { @@ -31,21 +34,23 @@ func TestNewVirtualServiceController(t *testing.T) { vs := &v1alpha3.VirtualService{Spec: v1alpha32.VirtualService{}, ObjectMeta: v1.ObjectMeta{Name: "vs1", Namespace: "namespace1"}} - virtualServiceController.Added(vs) + ctx := context.Background() + + virtualServiceController.Added(ctx, vs) - if !cmp.Equal(vs.Spec, handler.Obj.Spec) { + if !cmp.Equal(&vs.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the added obj") } updatedVs := &v1alpha3.VirtualService{Spec: v1alpha32.VirtualService{Hosts: []string{"hello.global"}}, ObjectMeta: v1.ObjectMeta{Name: "vs1", Namespace: "namespace1"}} - virtualServiceController.Updated(updatedVs, vs) + virtualServiceController.Updated(ctx, updatedVs, vs) - if !cmp.Equal(updatedVs.Spec, handler.Obj.Spec) { + if !cmp.Equal(&updatedVs.Spec, &handler.Obj.Spec, protocmp.Transform()) { t.Errorf("Handler should have the updated obj") } - virtualServiceController.Deleted(vs) + virtualServiceController.Deleted(ctx, vs) if handler.Obj != nil { t.Errorf("Handler should have no obj") diff --git a/admiral/pkg/controller/secret/secretcontroller.go b/admiral/pkg/controller/secret/secretcontroller.go index 7847210f..bf2766d6 100644 --- a/admiral/pkg/controller/secret/secretcontroller.go +++ b/admiral/pkg/controller/secret/secretcontroller.go @@ -18,23 +18,24 @@ import ( "context" "errors" "fmt" - "github.com/istio-ecosystem/admiral/admiral/apis/v1" + "time" + + v1 "github.com/istio-ecosystem/admiral/admiral/apis/v1" "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" - "github.com/istio-ecosystem/admiral/admiral/pkg/controller/secret/resolver" - log "github.com/sirupsen/logrus" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - "time" + "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/util/workqueue" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/secret/resolver" + log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/cache" - "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/util/workqueue" ) const ( @@ -99,15 +100,16 @@ func NewController( secretResolverType string, secretResolverConfig string) *Controller { + ctx := context.Background() secretsInformer := cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(opts meta_v1.ListOptions) (runtime.Object, error) { opts.LabelSelector = filterLabel + "=true" - return kubeclientset.CoreV1().Secrets(namespace).List(opts) + return kubeclientset.CoreV1().Secrets(namespace).List(ctx, opts) }, WatchFunc: func(opts meta_v1.ListOptions) (watch.Interface, error) { opts.LabelSelector = filterLabel + "=true" - return kubeclientset.CoreV1().Secrets(namespace).Watch(opts) + return kubeclientset.CoreV1().Secrets(namespace).Watch(ctx, opts) }, }, &corev1.Secret{}, 0, cache.Indexers{}, @@ -195,11 +197,10 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } // StartSecretController creates the secret controller. -func StartSecretController(k8s kubernetes.Interface, addCallback addSecretCallback,updateCallback updateSecretCallback, removeCallback removeSecretCallback, namespace string, ctx context.Context, secretResolverType string, secretResolverConfig string) (*Controller, error) { +func StartSecretController(ctx context.Context, k8s kubernetes.Interface, addCallback addSecretCallback, updateCallback updateSecretCallback, removeCallback removeSecretCallback, namespace string, secretResolverType string, secretResolverConfig string) (*Controller, error) { clusterStore := newClustersStore() - controller := NewController(k8s, namespace, clusterStore, addCallback, updateCallback, removeCallback, secretResolverType,secretResolverConfig) - + controller := NewController(k8s, namespace, clusterStore, addCallback, updateCallback, removeCallback, secretResolverType, secretResolverConfig) go controller.Run(ctx.Done()) diff --git a/admiral/pkg/controller/secret/secretcontroller_test.go b/admiral/pkg/controller/secret/secretcontroller_test.go index 51a59189..a51c113c 100644 --- a/admiral/pkg/controller/secret/secretcontroller_test.go +++ b/admiral/pkg/controller/secret/secretcontroller_test.go @@ -17,16 +17,17 @@ package secret import ( "context" "fmt" + "sync" + "testing" + "time" + "github.com/istio-ecosystem/admiral/admiral/pkg/controller/common" "github.com/prometheus/client_golang/prometheus" io_prometheus_client "github.com/prometheus/client_model/go" + coreV1 "k8s.io/api/core/v1" "k8s.io/client-go/rest" - "sync" - "testing" - "time" . "github.com/onsi/gomega" - "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" @@ -40,8 +41,8 @@ const secretNameSpace string = "istio-system" var testCreateControllerCalled bool var testDeleteControllerCalled bool -func makeSecret(secret, clusterID string, kubeconfig []byte) *v1.Secret { - return &v1.Secret{ +func makeSecret(secret, clusterID string, kubeconfig []byte) *coreV1.Secret { + return &coreV1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secret, Namespace: secretNameSpace, @@ -101,7 +102,7 @@ func testDeleteController(clusterID string) error { func createMultiClusterSecret(k8s *fake.Clientset) error { data := map[string][]byte{} - secret := v1.Secret{ + secret := coreV1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, Namespace: secretNameSpace, @@ -114,15 +115,17 @@ func createMultiClusterSecret(k8s *fake.Clientset) error { data["testRemoteCluster"] = []byte("Test") secret.Data = data - _, err := k8s.CoreV1().Secrets(secretNameSpace).Create(&secret) + ctx := context.Background() + _, err := k8s.CoreV1().Secrets(secretNameSpace).Create(ctx, &secret, metav1.CreateOptions{}) return err } func deleteMultiClusterSecret(k8s *fake.Clientset) error { var immediate int64 - return k8s.CoreV1().Secrets(secretNameSpace).Delete( - secretName, &metav1.DeleteOptions{GracePeriodSeconds: &immediate}) + ctx := context.Background() + return k8s.CoreV1().Secrets(secretNameSpace).Delete(ctx, + secretName, metav1.DeleteOptions{GracePeriodSeconds: &immediate}) } func mockLoadKubeConfig(kubeconfig []byte) (*clientcmdapi.Config, error) { @@ -211,9 +214,9 @@ func Test_SecretController(t *testing.T) { steps := []struct { // only set one of these per step. The others should be nil. - add *v1.Secret - update *v1.Secret - delete *v1.Secret + add *coreV1.Secret + update *coreV1.Secret + delete *coreV1.Secret // only set one of these per step. The others should be empty. wantAdded string @@ -234,9 +237,10 @@ func Test_SecretController(t *testing.T) { // The assertion ShouldNot(BeNil()) make sure that start secret controller return a not nil controller and nil error registry := prometheus.DefaultGatherer g.Expect( - StartSecretController(clientset, addCallback, updateCallback, deleteCallback, secretNameSpace, context.TODO(), "", "")). + StartSecretController(context.TODO(), clientset, addCallback, updateCallback, deleteCallback, secretNameSpace, "", "")). ShouldNot(BeNil()) + ctx := context.Background() for i, step := range steps { resetCallbackData() @@ -245,13 +249,13 @@ func Test_SecretController(t *testing.T) { switch { case step.add != nil: - _, err := clientset.CoreV1().Secrets(secretNameSpace).Create(step.add) + _, err := clientset.CoreV1().Secrets(secretNameSpace).Create(ctx, step.add, metav1.CreateOptions{}) g.Expect(err).Should(BeNil()) case step.update != nil: - _, err := clientset.CoreV1().Secrets(secretNameSpace).Update(step.update) + _, err := clientset.CoreV1().Secrets(secretNameSpace).Update(ctx, step.update, metav1.UpdateOptions{}) g.Expect(err).Should(BeNil()) case step.delete != nil: - g.Expect(clientset.CoreV1().Secrets(secretNameSpace).Delete(step.delete.Name, &metav1.DeleteOptions{})). + g.Expect(clientset.CoreV1().Secrets(secretNameSpace).Delete(ctx, step.delete.Name, metav1.DeleteOptions{})). Should(Succeed()) } diff --git a/admiral/pkg/test/mock.go b/admiral/pkg/test/mock.go index 1060ce54..a99227e2 100644 --- a/admiral/pkg/test/mock.go +++ b/admiral/pkg/test/mock.go @@ -1,8 +1,10 @@ package test import ( + "context" + argo "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" - "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" + admiralV1 "github.com/istio-ecosystem/admiral/admiral/pkg/apis/admiral/v1" v1alpha32 "istio.io/client-go/pkg/apis/networking/v1alpha3" k8sAppsV1 "k8s.io/api/apps/v1" k8sCoreV1 "k8s.io/api/core/v1" @@ -28,41 +30,41 @@ func (m *MockIstioConfigStore) Delete(typ, name, namespace string) error { type MockDeploymentHandler struct { } -func (m *MockDeploymentHandler) Added(obj *k8sAppsV1.Deployment) { +func (m *MockDeploymentHandler) Added(ctx context.Context, obj *k8sAppsV1.Deployment) { } -func (m *MockDeploymentHandler) Deleted(obj *k8sAppsV1.Deployment) { +func (m *MockDeploymentHandler) Deleted(ctx context.Context, obj *k8sAppsV1.Deployment) { } type MockRolloutHandler struct { } -func (m *MockRolloutHandler) Added(obj *argo.Rollout) { +func (m *MockRolloutHandler) Added(ctx context.Context, obj *argo.Rollout) { } -func (m *MockRolloutHandler) Deleted(obj *argo.Rollout) { +func (m *MockRolloutHandler) Deleted(ctx context.Context, obj *argo.Rollout) { } -func (m *MockRolloutHandler) Updated(obj *argo.Rollout) { +func (m *MockRolloutHandler) Updated(ctx context.Context, obj *argo.Rollout) { } type MockServiceHandler struct { } -func (m *MockServiceHandler) Added(obj *k8sCoreV1.Service) { +func (m *MockServiceHandler) Added(ctx context.Context, obj *k8sCoreV1.Service) { } -func (m *MockServiceHandler) Updated(obj *k8sCoreV1.Service) { +func (m *MockServiceHandler) Updated(ctx context.Context, obj *k8sCoreV1.Service) { } -func (m *MockServiceHandler) Deleted(obj *k8sCoreV1.Service) { +func (m *MockServiceHandler) Deleted(ctx context.Context, obj *k8sCoreV1.Service) { } @@ -92,31 +94,31 @@ func (m *MockNodeHandler) Deleted(obj *k8sCoreV1.Node) { type MockDependencyHandler struct { } -func (m *MockDependencyHandler) Added(obj *v1.Dependency) { +func (m *MockDependencyHandler) Added(ctx context.Context, obj *admiralV1.Dependency) { } -func (m *MockDependencyHandler) Updated(obj *v1.Dependency) { +func (m *MockDependencyHandler) Updated(ctx context.Context, obj *admiralV1.Dependency) { } -func (m *MockDependencyHandler) Deleted(obj *v1.Dependency) { +func (m *MockDependencyHandler) Deleted(ctx context.Context, obj *admiralV1.Dependency) { } type MockGlobalTrafficHandler struct { - Obj *v1.GlobalTrafficPolicy + Obj *admiralV1.GlobalTrafficPolicy } -func (m *MockGlobalTrafficHandler) Added(obj *v1.GlobalTrafficPolicy) { +func (m *MockGlobalTrafficHandler) Added(ctx context.Context, obj *admiralV1.GlobalTrafficPolicy) { m.Obj = obj } -func (m *MockGlobalTrafficHandler) Updated(obj *v1.GlobalTrafficPolicy) { +func (m *MockGlobalTrafficHandler) Updated(ctx context.Context, obj *admiralV1.GlobalTrafficPolicy) { m.Obj = obj } -func (m *MockGlobalTrafficHandler) Deleted(obj *v1.GlobalTrafficPolicy) { +func (m *MockGlobalTrafficHandler) Deleted(ctx context.Context, obj *admiralV1.GlobalTrafficPolicy) { m.Obj = nil } @@ -140,15 +142,15 @@ type MockVirtualServiceHandler struct { Obj *v1alpha32.VirtualService } -func (m *MockVirtualServiceHandler) Added(obj *v1alpha32.VirtualService) { +func (m *MockVirtualServiceHandler) Added(ctx context.Context, obj *v1alpha32.VirtualService) { m.Obj = obj } -func (m *MockVirtualServiceHandler) Updated(obj *v1alpha32.VirtualService) { +func (m *MockVirtualServiceHandler) Updated(ctx context.Context, obj *v1alpha32.VirtualService) { m.Obj = obj } -func (m *MockVirtualServiceHandler) Deleted(obj *v1alpha32.VirtualService) { +func (m *MockVirtualServiceHandler) Deleted(ctx context.Context, obj *v1alpha32.VirtualService) { m.Obj = nil } @@ -156,15 +158,15 @@ type MockDestinationRuleHandler struct { Obj *v1alpha32.DestinationRule } -func (m *MockDestinationRuleHandler) Added(obj *v1alpha32.DestinationRule) { +func (m *MockDestinationRuleHandler) Added(ctx context.Context, obj *v1alpha32.DestinationRule) { m.Obj = obj } -func (m *MockDestinationRuleHandler) Updated(obj *v1alpha32.DestinationRule) { +func (m *MockDestinationRuleHandler) Updated(ctx context.Context, obj *v1alpha32.DestinationRule) { m.Obj = obj } -func (m *MockDestinationRuleHandler) Deleted(obj *v1alpha32.DestinationRule) { +func (m *MockDestinationRuleHandler) Deleted(ctx context.Context, obj *v1alpha32.DestinationRule) { m.Obj = nil } @@ -172,30 +174,30 @@ type MockSidecarHandler struct { Obj *v1alpha32.Sidecar } -func (m *MockSidecarHandler) Added(obj *v1alpha32.Sidecar) { +func (m *MockSidecarHandler) Added(ctx context.Context, obj *v1alpha32.Sidecar) { m.Obj = obj } -func (m *MockSidecarHandler) Updated(obj *v1alpha32.Sidecar) { +func (m *MockSidecarHandler) Updated(ctx context.Context, obj *v1alpha32.Sidecar) { m.Obj = obj } -func (m *MockSidecarHandler) Deleted(obj *v1alpha32.Sidecar) { +func (m *MockSidecarHandler) Deleted(ctx context.Context, obj *v1alpha32.Sidecar) { m.Obj = nil } type MockRoutingPolicyHandler struct { - Obj *v1.RoutingPolicy + Obj *admiralV1.RoutingPolicy } -func (m *MockRoutingPolicyHandler) Added(obj *v1.RoutingPolicy) { +func (m *MockRoutingPolicyHandler) Added(ctx context.Context, obj *admiralV1.RoutingPolicy) { m.Obj = obj } -func (m *MockRoutingPolicyHandler) Deleted(obj *v1.RoutingPolicy) { +func (m *MockRoutingPolicyHandler) Deleted(ctx context.Context, obj *admiralV1.RoutingPolicy) { m.Obj = nil } -func (m *MockRoutingPolicyHandler) Updated(obj *v1.RoutingPolicy) { +func (m *MockRoutingPolicyHandler) Updated(ctx context.Context, obj *admiralV1.RoutingPolicy) { m.Obj = obj -} \ No newline at end of file +} diff --git a/admiral/pkg/test/resources/admins@fake-cluster.k8s.local b/admiral/pkg/test/resources/admins@fake-cluster.k8s.local index 33cfa93e..974d3717 100644 --- a/admiral/pkg/test/resources/admins@fake-cluster.k8s.local +++ b/admiral/pkg/test/resources/admins@fake-cluster.k8s.local @@ -1,7 +1,7 @@ apiVersion: v1 clusters: - cluster: - certificate-authority-data: TUlJQ1VUQ0NBZnVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFRRkFEQlhNUXN3Q1FZRFZRUUdFd0pEVGpFTApNQWtHQTFVRUNCTUNVRTR4Q3pBSkJnTlZCQWNUQWtOT01Rc3dDUVlEVlFRS0V3SlBUakVMTUFrR0ExVUVDeE1DClZVNHhGREFTQmdOVkJBTVRDMGhsY205dVp5QlpZVzVuTUI0WERUQTFNRGN4TlRJeE1UazBOMW9YRFRBMU1EZ3gKTkRJeE1UazBOMW93VnpFTE1Ba0dBMVVFQmhNQ1EwNHhDekFKQmdOVkJBZ1RBbEJPTVFzd0NRWURWUVFIRXdKRApUakVMTUFrR0ExVUVDaE1DVDA0eEN6QUpCZ05WQkFzVEFsVk9NUlF3RWdZRFZRUURFd3RJWlhKdmJtY2dXV0Z1Clp6QmNNQTBHQ1NxR1NJYjNEUUVCQVFVQUEwc0FNRWdDUVFDcDVobkc3b2dCaHRseW5wT1MyMWNCZXdLRS9CN2oKVjE0cWV5c2xucjI2eFpVc1NWa28zNlpuaGlhTy96Yk1Pb1JjS0s5dkVjZ010Y0xGdVFUV0RsM1JBZ01CQUFHagpnYkV3Z2E0d0hRWURWUjBPQkJZRUZGWEk3MGtyWGVRRHhaZ2JhQ1FvUjRqVURuY0VNSDhHQTFVZEl3UjRNSGFBCkZGWEk3MGtyWGVRRHhaZ2JhQ1FvUjRqVURuY0VvVnVrV1RCWE1Rc3dDUVlEVlFRR0V3SkRUakVMTUFrR0ExVUUKQ0JNQ1VFNHhDekFKQmdOVkJBY1RBa05PTVFzd0NRWURWUVFLRXdKUFRqRUxNQWtHQTFVRUN4TUNWVTR4RkRBUwpCZ05WQkFNVEMwaGxjbTl1WnlCWllXNW5nZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFCkJRQURRUUEvdWd6QnJqaks5amNXbkRWZkdIbGszaWNOUnEwb1Y3UmkzMnovK0hRWDY3YVJmZ1p1N0tXZEkrSnUKV203RENmclBOR1Z3RldVUU9tc1B1ZTlyWkJnTw== + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlFN3pDQ0ExZWdBd0lCQWdJUU5MbUh5bU9wUy9Ib3Y2bFdyT3hvU1RBTkJna3Foa2lHOXcwQkFRc0ZBRENCDQpqekVlTUJ3R0ExVUVDaE1WYld0alpYSjBJR1JsZG1Wc2IzQnRaVzUwSUVOQk1USXdNQVlEVlFRTERDbHpjMmhoDQpjbTFoTXpSQWFXNTBkV2wwWkdWd1lqRXlaV0VnS0ZOb2NtbHlZVzBnVTJoaGNtMWhLVEU1TURjR0ExVUVBd3d3DQpiV3RqWlhKMElITnphR0Z5YldFek5FQnBiblIxYVhSa1pYQmlNVEpsWVNBb1UyaHlhWEpoYlNCVGFHRnliV0VwDQpNQjRYRFRJeE1EZ3dNakl5TXpJek9Gb1hEVE14TURnd01qSXlNekl6T0Zvd2dZOHhIakFjQmdOVkJBb1RGVzFyDQpZMlZ5ZENCa1pYWmxiRzl3YldWdWRDQkRRVEV5TURBR0ExVUVDd3dwYzNOb1lYSnRZVE0wUUdsdWRIVnBkR1JsDQpjR0l4TW1WaElDaFRhSEpwY21GdElGTm9ZWEp0WVNreE9UQTNCZ05WQkFNTU1HMXJZMlZ5ZENCemMyaGhjbTFoDQpNelJBYVc1MGRXbDBaR1Z3WWpFeVpXRWdLRk5vY21seVlXMGdVMmhoY20xaEtUQ0NBYUl3RFFZSktvWklodmNODQpBUUVCQlFBRGdnR1BBRENDQVlvQ2dnR0JBTWM1eHBwOCtHSmxCbGVTYTc0L0VnR3J4a3VZd3M0Mmd6UzRWS2xwDQpiVTNRSXpDV2psOVd4L0hhRVVqLzA3R1dtMlhOQWVoSS91b1JIS0x0aERMWWdMelRoazBMTDFqZkZCaDV3bDRtDQplaDlCcE5EUnhXcDNQaWhScW13SGUxNFArbDR1YU1aSHNveG5WSncvQS9La05pZXhMVXZMOVZqUXpacko4Y1luDQovTjZWVjNuc1dGQjF5dVlCdHBJUHo2ODJQS291cHpqcTVRcWdOUmo1dzFHM2p0MUFabjViK004YmNKMlQvUG1hDQp4UkNVa3NxTWpwdjZhVVdpdkd1UW5yL0xaVWpxWWhSU2xLYlNoOGdjRjNmZ3VSOC9ZTjB1OVM0R1lEa2JwMXc5DQpRYitwYk5CeS9pSkdkSzJOS0JsOHRvQmdESWx2OFlmSmdEbDdCbk1uM1J2NG02T0w0VHVVVjIva25JKy9xMkZsDQpTWW8rL0F0QUVtRGV2ZEIxbUV3emRId1AvR0NsT2QrV1hjSEV2TENibC9MZ2FIeC8zZWUyNmEwb1hzVlp4N21PDQpXMGxrMU1JTXVlbTdjMTh6WXdjRDlzUXBVVG4xRTcrTGlzWHpVNC9SdVB6MHFpQUp5RzRVZ3lqY0JzdVZ6UTNqDQo2WUNaWlUxb2ZLVzQ1aWF1QmpaOUNKS2ZVUUlEQVFBQm8wVXdRekFPQmdOVkhROEJBZjhFQkFNQ0FnUXdFZ1lEDQpWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQWRCZ05WSFE0RUZnUVVacVdGS1BrY3d4cWFOejUvbDBhZzNYMWpGNzh3DQpEUVlKS29aSWh2Y05BUUVMQlFBRGdnR0JBSlYrRE5DanViZUdqejgyQ1FFMmNSbyszektDSm42T3pTaE85WnVCDQpFM3dxUFBJT1QvOTBtZm40dEJhT0R0NmovNi9mRTZad1YyWU93UVErR3plOGZORzJEMEZYVE16a3l3Q0VwcEkyDQpIWmtIZ0JPOE45VFhja0pIR1crYkFXc0lSRHc2V2pvbThQWTN1RDA1QWEzV2RYd2ROYUE1R2hTQ3ZVVEU0bVVYDQpESjdYVjVLZjlPdEhObllXOFZ3b3B0NlBhM2tpUHdQZE9BU0E1OVUvVVFhWTRwVE5TRnBTY1A1R1VEbnVKUTUwDQpXOEdmem1FNkV4Y0ROOXRMRnVYT0oyelFpTWpKMGVKQUxIckM2UUtrRXk0anpCTFY0RFN0SURBQ2dqbzdtU28zDQphWER0NnozbTVlSUp4TmIrMG51VTRnc1BRbnQwb2sxVW9VNVpES3ZRZ3FKcGZSMU9NYUlEWkVPREJ6dXpZYTE2DQp1V0pOQ3BEaU4rZGtBMXhQQ08wVUk4STRqcDBxek9rMjNzejlEVEwvNldNbldndkZRdWxJcVRWMDNHVE1MRnEyDQpFOXpLb0JqQzdURUJrczVwSlZmMkhwVkdrUitMVzVnZnBVT0ZFanFLYnBhMEorV1hHVVRSU3R1UVBiNjQzRVBTDQpZeEl6TGR4OW04RU1zeHpYTjNQUGpDVTYxdz09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQo= server: https://localhost:6441 name: apple contexts: diff --git a/admiral/pkg/test/types.go b/admiral/pkg/test/types.go index 035a64d6..d556ceac 100644 --- a/admiral/pkg/test/types.go +++ b/admiral/pkg/test/types.go @@ -1,6 +1,8 @@ package test import ( + "context" + k8sCoreV1 "k8s.io/api/core/v1" ) @@ -10,11 +12,11 @@ type FakeConfigMapController struct { ConfigmapToReturn *k8sCoreV1.ConfigMap } -func (c *FakeConfigMapController) GetConfigMap() (*k8sCoreV1.ConfigMap, error) { +func (c *FakeConfigMapController) GetConfigMap(ctx context.Context) (*k8sCoreV1.ConfigMap, error) { return c.ConfigmapToReturn, c.GetError } -func (c *FakeConfigMapController) PutConfigMap(newMap *k8sCoreV1.ConfigMap) error { +func (c *FakeConfigMapController) PutConfigMap(ctx context.Context, newMap *k8sCoreV1.ConfigMap) error { return c.PutError } func (c *FakeConfigMapController)GetIPPrefixForServiceEntries() (seIpPrefix string) { diff --git a/go.mod b/go.mod index d5318ef3..0558473f 100644 --- a/go.mod +++ b/go.mod @@ -1,128 +1,134 @@ module github.com/istio-ecosystem/admiral -go 1.12 +go 1.18 require ( - dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3 // indirect - dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0 // indirect - dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412 // indirect - dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c // indirect - git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999 // indirect - github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect - github.com/argoproj/argo-rollouts v0.9.3 - github.com/aws/aws-sdk-go v1.24.0 // indirect + github.com/argoproj/argo-rollouts v1.2.1 github.com/cenkalti/backoff v2.2.1+incompatible - github.com/emicklei/go-restful v2.11.2+incompatible // indirect - github.com/go-openapi/spec v0.19.6 // indirect - github.com/go-openapi/swag v0.19.7 // indirect - github.com/gogo/protobuf v1.3.1 - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b - github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc // indirect - github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 // indirect - github.com/golang/protobuf v1.3.2 - github.com/google/go-cmp v0.4.0 - github.com/googleapis/gax-go v2.0.0+incompatible // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/golang/protobuf v1.5.2 + github.com/google/go-cmp v0.5.7 github.com/gorilla/mux v1.8.0 - github.com/imdario/mergo v0.3.8 // indirect - github.com/mailru/easyjson v0.7.1 // indirect - github.com/microcosm-cc/bluemonday v1.0.1 // indirect - github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86 // indirect - github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab // indirect - github.com/onsi/ginkgo v1.10.2 // indirect - github.com/onsi/gomega v1.7.0 - github.com/openzipkin/zipkin-go v0.1.1 // indirect - github.com/prometheus/client_golang v1.5.0 + github.com/imdario/mergo v0.3.12 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/onsi/gomega v1.19.0 + github.com/prometheus/client_golang v1.12.2 github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.9.1 - github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4 // indirect - github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48 // indirect - github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470 // indirect - github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d // indirect - github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c // indirect - github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b // indirect - github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20 // indirect - github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9 // indirect - github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50 // indirect - github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc // indirect - github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371 // indirect - github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9 // indirect - github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191 // indirect - github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241 // indirect - github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122 // indirect - github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2 // indirect - github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82 // indirect - github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 // indirect - github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537 // indirect - github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133 // indirect - github.com/sirupsen/logrus v1.7.0 - github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d // indirect - github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e // indirect - github.com/spf13/cobra v0.0.5 - github.com/stretchr/testify v1.7.0 - github.com/yl2chen/cidranger v0.0.0-20180214081945-928b519e5268 // indirect - github.intuit.com/idps/idps-go-sdk/v3 v3.83.3 - golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a // indirect - golang.org/x/net v0.0.0-20200301022130-244492dfa37a // indirect - golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect - google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a // indirect - google.golang.org/grpc v1.25.1 // indirect - gopkg.in/yaml.v2 v2.2.8 - istio.io/api v0.0.0-20200226024546-cca495b82b03 - istio.io/client-go v0.0.0-20200226182959-cde3e69bd9dd - istio.io/gogo-genproto v0.0.0-20191024203824-d079cc8b1d55 // indirect - k8s.io/api v0.17.4 - k8s.io/apimachinery v0.17.4 - k8s.io/client-go v0.17.4 - k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe // indirect - k8s.io/kubernetes v1.17.3 // indirect + github.com/sirupsen/logrus v1.8.1 + github.com/spf13/cobra v1.5.0 + github.com/stretchr/testify v1.7.1 + golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect + google.golang.org/genproto v0.0.0-20220531134929-86cf59382f1b // indirect + gopkg.in/yaml.v2 v2.4.0 + istio.io/api v0.0.0-20220621155648-3e39d064ab6b + istio.io/client-go v1.14.0 + k8s.io/api v0.24.2 + k8s.io/apimachinery v0.24.2 + k8s.io/client-go v0.24.2 sigs.k8s.io/yaml v1.2.0 // indirect - sourcegraph.com/sourcegraph/go-diff v0.5.0 // indirect ) -replace k8s.io/api => k8s.io/api v0.17.3 - -replace k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.17.3 - -replace k8s.io/apimachinery => k8s.io/apimachinery v0.17.5-beta.0 - -replace k8s.io/apiserver => k8s.io/apiserver v0.17.3 - -replace k8s.io/cli-runtime => k8s.io/cli-runtime v0.17.3 - -replace k8s.io/client-go => k8s.io/client-go v0.17.3 - -replace k8s.io/cloud-provider => k8s.io/cloud-provider v0.17.3 - -replace k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.17.3 - -replace k8s.io/code-generator => k8s.io/code-generator v0.17.5-beta.0 - -replace k8s.io/component-base => k8s.io/component-base v0.17.3 - -replace k8s.io/cri-api => k8s.io/cri-api v0.17.18-rc.0 - -replace k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.17.3 - -replace k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.17.3 - -replace k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.17.3 - -replace k8s.io/kube-proxy => k8s.io/kube-proxy v0.17.3 - -replace k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.17.3 - -replace k8s.io/kubectl => k8s.io/kubectl v0.17.3 - -replace k8s.io/kubelet => k8s.io/kubelet v0.17.3 - -replace k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.17.3 - -replace k8s.io/metrics => k8s.io/metrics v0.17.3 - -replace k8s.io/node-api => k8s.io/node-api v0.17.3 - -replace k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.17.3 +require ( + github.com/aws/aws-sdk-go v1.44.105 + github.com/golang/glog v1.0.0 + github.com/prometheus/common v0.32.1 + github.intuit.com/idps/idps-go-sdk/v3 v3.9909.0 + google.golang.org/protobuf v1.28.1 +) -replace k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.17.3 +require ( + cloud.google.com/go/compute v1.6.1 // indirect + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect + github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.8.0 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/go-co-op/gocron v1.13.0 // indirect + github.com/go-logr/logr v1.2.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/google/uuid v1.1.2 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/intuit/funnel v1.0.0 // indirect + github.com/jacobsa/crypto v0.0.0-20190317225127-9f44e2d11115 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.3.0 // indirect + github.com/tevino/abool v1.2.0 // indirect + github.com/ugorji/go/codec v1.2.7 // indirect + github.intuit.com/idps/device-grant-flow/go/dgfsdk v0.0.0-20220428022612-cf054cda65f7 // indirect + github.intuit.com/idps/idps-go-commons/v3 v3.4.4 // indirect + github.intuit.com/idps/idps-go-swagger-clients v1.8.1 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f // indirect + golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect + google.golang.org/api v0.76.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/grpc v1.46.2 // indirect + gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.60.1 // indirect + k8s.io/kube-openapi v0.0.0-20220621154418-c39d0f63fac8 // indirect + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + sigs.k8s.io/json v0.0.0-20220525155127-227cbc7cc124 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect +) -replace k8s.io/sample-controller => k8s.io/sample-controller v0.17.3 +replace ( + github.com/fsnotify/fsnotify => github.com/fsnotify/fsnotify v1.5.1 + github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 + github.com/prometheus/common => github.com/prometheus/common v0.26.0 + k8s.io/api => k8s.io/api v0.24.2 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.24.2 + k8s.io/apimachinery => k8s.io/apimachinery v0.24.2 + k8s.io/apiserver => k8s.io/apiserver v0.24.2 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.24.2 + k8s.io/client-go => k8s.io/client-go v0.24.2 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.24.2 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.24.2 + k8s.io/code-generator => k8s.io/code-generator v0.24.2 + k8s.io/component-base => k8s.io/component-base v0.24.2 + k8s.io/component-helpers => k8s.io/component-helpers v0.24.2 + k8s.io/controller-manager => k8s.io/controller-manager v0.24.2 + k8s.io/cri-api => k8s.io/cri-api v0.24.2 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.24.2 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.24.2 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.24.2 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.24.2 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.24.2 + k8s.io/kubectl => k8s.io/kubectl v0.24.2 + k8s.io/kubelet => k8s.io/kubelet v0.24.2 + k8s.io/kubernetes => k8s.io/kubernetes v1.23.1 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.2 + k8s.io/metrics => k8s.io/metrics v0.24.2 + k8s.io/mount-utils => k8s.io/mount-utils v0.24.2 + k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.2 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.2 +) diff --git a/go.sum b/go.sum index 4bd1e501..af9ef0cb 100644 --- a/go.sum +++ b/go.sum @@ -1,968 +1,909 @@ -bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= -github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +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 v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +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= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +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/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= -github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Rican7/retry v0.1.0/go.mod h1:FgOROf8P5bebcC1DS0PdOQiqGUridaZvikzUmkFW6gg= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/aws/aws-sdk-go v1.16.26 h1:GWkl3rkRO/JGRTWoLLIqwf7AWC4/W/1hMOUZqmX0js4= -github.com/antonmedv/expr v1.4.2/go.mod h1:xesgliOuukGf21740qhh8PvFdN66yZ9lJJ/PzSFAmzI= -github.com/argoproj/argo-rollouts v0.7.2 h1:eUtsstL3DWNv+SxjnwJEBOHH2KOF5lu5G/zF5yKgC3A= -github.com/argoproj/argo-rollouts v0.7.2/go.mod h1:zjMEXhycwvFGimOzpeiSmt/Cv58I63nGgVuROKFIfB8= -github.com/argoproj/argo-rollouts v0.8.3 h1:tjudGKI0+igRLtuQ6QWuYnldY1ylxtA1A5bBL/9R17A= -github.com/argoproj/argo-rollouts v0.8.3/go.mod h1:+RujwsBG/yTbpW8PdduyS3QxpmeEbePcUeFUoTuY+c4= -github.com/argoproj/argo-rollouts v0.9.3 h1:FWYJxZ2YeqqBphY+TbjsEba89gpMeF9hCG8SrjTPv/8= -github.com/argoproj/argo-rollouts v0.9.3/go.mod h1:xa6dp4NVoFShXNnDzvCe3CONJINs+MWEk2ufnF28yrU= -github.com/argoproj/pkg v0.0.0-20200624215116-23e74cb168fe/go.mod h1:2EZ44RG/CcgtPTwrRR0apOc7oU6UIw8GjCUJWZ8X3bM= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/argoproj/argo-rollouts v1.2.1 h1:4hSgKEqpQsZreZBv+XcLsB+oBaRGMVW19nMScx5ikIQ= +github.com/argoproj/argo-rollouts v1.2.1/go.mod h1:ETmWr9Lysxr9SgbqalMMBdytBcDHUt9qulFoKJ9b9ZU= +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/aslakhellesoy/gox v1.0.100/go.mod h1:AJl542QsKKG96COVsv0N74HHzVQgDIQPceVUh1aeU2M= -github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= -github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.24.0 h1:TtQCY3HaFXeo1yg2JAdfSbpN/Nsd9V5SCfDksEf2nSE= -github.com/aws/aws-sdk-go v1.24.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bazelbuild/bazel-gazelle v0.18.2/go.mod h1:D0ehMSbS+vesFsLGiD6JXu3mVEzOlfUl8wNnq+x/9p0= -github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A= -github.com/bazelbuild/buildtools v0.0.0-20190731111112-f720930ceb60/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= -github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= -github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/aws/aws-sdk-go v1.44.2/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.44.105 h1:UUwoD1PRKIj3ltrDUYTDQj5fOTK3XsnqolLpRTMmSEM= +github.com/aws/aws-sdk-go v1.44.105/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/bouk/monkey v1.0.0/go.mod h1:PG/63f4XEUlVyW1ttIeOJmJhhe1+t9EC/je3eTjvFhE= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= -github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b/go.mod h1:TrMrLQfeENAPYPRsJuq3jsqdlRh3lvi6trTZJG8+tho= -github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +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/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= -github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= -github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/coredns/corefile-migration v1.0.4/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cucumber/gherkin-go/v11 v11.0.0/go.mod h1:CX33k2XU2qog4e+TFjOValoq6mIUq0DmVccZs238R9w= -github.com/cucumber/godog v0.10.0/go.mod h1:0Q+MOUg8Z9AhzLV+nNMbThQ2x1b17yYwGyahApTLjJA= -github.com/cucumber/messages-go/v10 v10.0.1/go.mod h1:kA5T38CBlBbYLU12TIrJ4fk4wSkVVOgyh7Enyy8WnSg= -github.com/cucumber/messages-go/v10 v10.0.3/go.mod h1:9jMZ2Y8ZxjLY6TG2+x344nt5rXstVVDYSdS5ySfI1WY= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libnetwork v0.8.0-dev.2.0.20190624125649-f0e46a78ea34/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +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/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.11.2+incompatible h1:Z4Z0K2AuOw+QtgwkkJnwpT165MBr12qS8rnBwjP/Pzs= -github.com/emicklei/go-restful v2.11.2+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= +github.com/emicklei/go-restful/v3 v3.8.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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +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.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +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/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= -github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= -github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-co-op/gocron v1.13.0 h1:BjkuNImPy5NuIPEifhWItFG7pYyr27cyjS6BN9w/D4c= +github.com/go-co-op/gocron v1.13.0/go.mod h1:GD5EIEly1YNW+LovFVx5dzbYVcIc8544K99D8UVRpGo= +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-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= +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/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g= -github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +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= -github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s= -github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc h1:55rEp52jU6bkyslZ1+C/7NGfpQsEc6pxGLAGDOctqbw= -github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +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 h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +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/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +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/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= 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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.18.0/go.mod h1:kaqo8l0OZKYPtjNmG4z4HrWLgcYNIJ9B9q3LWri9uLg= -github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= -github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +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/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/cadvisor v0.35.0/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= +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= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= 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= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +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/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +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/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +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/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.2.1/go.mod h1:OSvLJ662Jim8hMM+gWGyhktyWk2xPCnWMc7DWIqtkGA= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= 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/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= -github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= 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.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= -github.com/imdario/mergo v0.3.8/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/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/intuit/funnel v0.0.0-20190627033138-d466d4cf6fd2 h1:sQMuK7UnikxHWYDEIN6jti6/CT/hcRGDFZROP2UQUak= -github.com/intuit/funnel v0.0.0-20190627033138-d466d4cf6fd2/go.mod h1:USHdt9ZVoVuZGLiVZsHl8yNJgA3YcWJ4AjM2sgVSrXs= +github.com/intuit/funnel v1.0.0 h1:DL7tQjXpRXmTb6C/xU2Hn9hcHh7/VnHC0+vep4e3P7E= +github.com/intuit/funnel v1.0.0/go.mod h1:mDE1DfyEnFN29i8pcDDjNvVRKiZU+/N3YCuEl3CGQEU= github.com/jacobsa/crypto v0.0.0-20190317225127-9f44e2d11115 h1:YuDUUFNM21CAbyPOpOP8BicaTD/0klJEKt5p8yuw+uY= github.com/jacobsa/crypto v0.0.0-20190317225127-9f44e2d11115/go.mod h1:LadVJg0XuawGk+8L1rYnIED8451UyNxEMdTWCEt5kmU= +github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd h1:9GCSedGjMcLZCrusBZuo4tyKLpKUPenUUqi34AkuFmA= github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd/go.mod h1:TlmyIZDpGmwRoTWiakdr+HA1Tukze6C6XbRVidYq02M= +github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff h1:2xRHTvkpJ5zJmglXLRqHiZQNjUoOkhUyhTAhEQvPAWw= github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff/go.mod h1:gJWba/XXGl0UoOmBQKRWCJdHrr3nE0T65t6ioaj3mLI= +github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11 h1:BMb8s3ENQLt5ulwVIHVDWFHp8eIXmbfSExkvdn9qMXI= github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11/go.mod h1:+DBdDyfoO2McrOyDemRBq0q9CMEByef7sYl7JH5Q3BI= +github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb h1:uSWBjJdMf47kQlXMwWEfmc864bA1wAC+Kl3ApryuG9Y= github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb/go.mod h1:ivcmUvxXWjb27NsPEaiYK7AidlZXS7oQ5PowUS9z3I4= -github.com/jasonlvhit/gocron v0.0.0-20190829164038-7ef3bafdc25c h1:Pe7FHOh2zH0MReaY0ksqwECozI8O80IwpAXBmBxdq8s= -github.com/jasonlvhit/gocron v0.0.0-20190829164038-7ef3bafdc25c/go.mod h1:rwi/esz/h+4oWLhbWWK7f6dtmgLzxeZhnwGr7MCsTNk= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +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= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= -github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= -github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk= -github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao= -github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= -github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= -github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= -github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= -github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 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 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= 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/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +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/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= 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.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2 h1:uqH7bpe+ERSiDa34FDOF7RikN6RzXgduUF8yarlZp94= -github.com/onsi/ginkgo v1.10.2/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/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.3.1-0.20190929122143-5215b1806f52/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.5.0 h1:Ctq0iGpCmr3jeP77kbF2UxgvRwzWWz+4Bh9/vJTyg1A= -github.com/prometheus/client_golang v1.5.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= -github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= -github.com/rivo/tview v0.0.0-20190515161233-bd836ef13b4b/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= -github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/servicemeshinterface/smi-sdk-go v0.3.0/go.mod h1:/jM1BV6xy7OgcmHuZ5cyMO4IC4dG2+ska2KsL1/8MLE= -github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaceapegames/go-wavefront v1.6.2/go.mod h1:Q9wbY/SM99cOM4NvoJ2SN1bzcJUJOEzta5C7dhnT5IM= -github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= 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/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 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/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5 h1:Xim2mBRFdXzXmKRO8DJg/FJtn/8Fj9NOEpO6+WuMPmk= -github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5/go.mod h1:ppEjwdhyy7Y31EnHRDm1JkChoC7LXIJ7Ex0VYLWtZtQ= -github.com/vektra/mockery v1.1.2/go.mod h1:VcfZjKaFOPO+MpN4ZvwPjs4c48lkq1o3Ym8yHZJu0jU= -github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yl2chen/cidranger v0.0.0-20180214081945-928b519e5268/go.mod h1:mq0zhomp/G6rRTb0dvHWXRHr/2+Qgeq5hMXfJ670+i4= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tevino/abool v0.0.0-20170917061928-9b9efcf221b5/go.mod h1:f1SCnEOt6sc3fOJfPQDRDzHOtSXuTtnz0ImG9kPRDV0= +github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA= +github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.intuit.com/idps/idps-go-sdk/v3 v3.83.3 h1:Epzb57NrDZc1dPRNDjQV89ZTxVtiySoguDfyD7ZMgQg= -github.intuit.com/idps/idps-go-sdk/v3 v3.83.3/go.mod h1:yDkkp3b2EaDYnQr6FX9xIKNzmQf0TrH7864L2KQmQqo= -github.intuit.com/idps/idps-go-swagger-clients v1.2.7 h1:f0yZ0HqhnxVm9PWPYS9KY0zZ0ACUCdhE+u9i8g4n+98= -github.intuit.com/idps/idps-go-swagger-clients v1.2.7/go.mod h1:quZ+UMslC+P3PIdAWJH7ZDEhwl0shuR9Aon9znN7Jhs= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +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.intuit.com/idps/device-grant-flow/go/dgfsdk v0.0.0-20220428022612-cf054cda65f7 h1:nSypwHIJ7o0IzWYVfVzmogrF5HIz/HCiSeMo0Mo3ymU= +github.intuit.com/idps/device-grant-flow/go/dgfsdk v0.0.0-20220428022612-cf054cda65f7/go.mod h1:maAd/rJYgSC2c9PvkGZZD/NrkVyhZL9/jDU75iTzgKE= +github.intuit.com/idps/idps-go-commons/v3 v3.4.4 h1:DxyPs+Q6wi7doX/2Ers2KnTv5B+vRclKCNVeCgkt01Y= +github.intuit.com/idps/idps-go-commons/v3 v3.4.4/go.mod h1:NMUz/MLrhUE4/SdxPGGc5KMk3kC9B8UdUAuelSYgA/0= +github.intuit.com/idps/idps-go-sdk/v3 v3.9909.0 h1:NtujYowO6tlJTmSHS1OoVAJ1ftTMCYWnuQSvVML1agI= +github.intuit.com/idps/idps-go-sdk/v3 v3.9909.0/go.mod h1:IIy+JIbUnqhjVqB+g6XXK1/Wd1J1Mnd26W1DPELs4Fo= +github.intuit.com/idps/idps-go-swagger-clients v1.8.1 h1:f7unZbxkR4WQRxHOL5B97HfoAwnkHjfUW1xLvK6GcHg= +github.intuit.com/idps/idps-go-swagger-clients v1.8.1/go.mod h1:L0XVKcoVv71IoVZBIgmQfJ0ux0E0cguZsxTyos9v6kg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190927031335-2835ba2e683f/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= -golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +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-20191108234033-bd318be0434a h1:R/qVym5WAxsZWQqZCwDY/8sdVKV1m1WgU4/S5IRQAzc= -golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +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-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/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-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +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= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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/lint v0.0.0-20210508222113-6edffad5e616/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= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +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/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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/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-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190125091013-d26f9f9a57f3/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= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-20190813141303-74dc4d7220e7/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-20191004110552-13f9640d40b9/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= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +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-20210503060351-7fd8e65b6420/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.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/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/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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 h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +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-20180905080454-ebe1bf3edb33/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-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190122071731-054c452bb702/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/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-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd h1:3x5uuvBgE6oaXJjCOvpCC1IpgJogqQ+PqGGU3ZxAgII= -golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= +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-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/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-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/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-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 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-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181112210238-4b1f3b6b1646/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190122202912-9c309ee22fab/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200323144430-8dcfad9e016e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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-20201224043029-2b0845dc783e/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.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +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/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.76.0 h1:UkZl25bR1FHNqtK/EKs3vCdpZtUO6gea3YElTwc8pQg= +google.golang.org/api v0.76.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= 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= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190916214212-f660b8655731/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +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/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220531134929-86cf59382f1b h1:X+VXcq/YthmZqFvppQm4Wleg4o//OmY2uttDv1vDvRo= +google.golang.org/genproto v0.0.0-20220531134929-86cf59382f1b/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To= 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= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +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.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +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.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +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/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 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/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 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.3/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.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966 h1:B0J02caTR6tpSJozBJyiAzT6CtBzjclw4pgm9gg8Ys0= -gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +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= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -istio.io/api v0.0.0-20200226024546-cca495b82b03 h1:c0Lsnavz2gRslJxqtqiP7VOxr8EJHJJWgfSJabfnZ2s= -istio.io/api v0.0.0-20200226024546-cca495b82b03/go.mod h1:bcY3prusO/6vA6zGHz4PNG2v79clPyTw06Xx3fprJSQ= -istio.io/client-go v0.0.0-20200226182959-cde3e69bd9dd h1:U5eWo5yvlRsk4pr5s6ky63G1dJkAgugXzoiKzkMQxGc= -istio.io/client-go v0.0.0-20200226182959-cde3e69bd9dd/go.mod h1:wLFtAm266NbVvt1Y8ZwbZXCdp1kgnBuxZTAIaMwUkto= -istio.io/gogo-genproto v0.0.0-20190930162913-45029607206a/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs= -istio.io/gogo-genproto v0.0.0-20191024203824-d079cc8b1d55 h1:nvpx66mnuGvXYP4IfCWfUqB9YhiXBF3MvUDsclNnDzI= -istio.io/gogo-genproto v0.0.0-20191024203824-d079cc8b1d55/go.mod h1:OzpAts7jljZceG4Vqi5/zXy/pOg1b209T3jb7Nv5wIs= -k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= -k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc= -k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= -k8s.io/api v0.17.3 h1:XAm3PZp3wnEdzekNkcmj/9Y1zdmQYJ1I4GKSBBZ8aG0= -k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= -k8s.io/apiextensions-apiserver v0.17.3 h1:WDZWkPcbgvchEdDd7ysL21GGPx3UKZQLDZXEkevT6n4= -k8s.io/apiextensions-apiserver v0.17.3/go.mod h1:CJbCyMfkKftAd/X/V6OTHYhVn7zXnDdnkUjS1h0GTeY= -k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.17.3 h1:f+uZV6rm4/tHE7xXgLyToprg6xWairaClGVkm2t8omg= -k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apimachinery v0.17.5-beta.0 h1:fpRN0B+B9lyvz8JSgcNAYsP+MosoQlXAmhsta15Ez9g= -k8s.io/apimachinery v0.17.5-beta.0/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= -k8s.io/cli-runtime v0.17.3/go.mod h1:X7idckYphH4SZflgNpOOViSxetiMj6xI0viMAjM81TA= -k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc= -k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= -k8s.io/client-go v0.17.3 h1:deUna1Ksx05XeESH6XGCyONNFfiQmDdqeqUvicvP6nU= -k8s.io/client-go v0.17.3/go.mod h1:cLXlTMtWHkuK4tD360KpWz2gG2KtdWEr/OT02i3emRQ= -k8s.io/cloud-provider v0.17.3/go.mod h1:JBkKSQpbcjcYGDqH5PbifFrcgQ/7WOXRswnfLVbXpI8= -k8s.io/cluster-bootstrap v0.17.3/go.mod h1:ujIYnCKnxY/MecpgPx9WgiYCVCFvici6tVIfI2FiI1g= -k8s.io/code-generator v0.17.5-beta.0 h1:mVexNYmXZGP0m+ETIMuQOaTzmhRtldNQdxbE39KX59w= -k8s.io/code-generator v0.17.5-beta.0/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= -k8s.io/component-base v0.17.3/go.mod h1:GeQf4BrgelWm64PXkIXiPh/XS0hnO42d9gx9BtbZRp8= -k8s.io/cri-api v0.17.18-rc.0/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/csi-translation-lib v0.17.3/go.mod h1:FBya8XvGIqDm2/3evLQNxaFXqv/C2UcZa5JgJt6/qqY= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190822140433-26a664648505 h1:ZY6yclUKVbZ+SdWnkfY+Je5vrMpKOxmGeKRbsXVmqYM= -k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-aggregator v0.17.3/go.mod h1:1dMwMFQbmH76RKF0614L7dNenMl3dwnUJuOOyZ3GMXA= -k8s.io/kube-controller-manager v0.17.3/go.mod h1:22B/TsgVviuCVuNwUrqgyTi5D4AYjMFaK9c8h1oonkY= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe h1:GOfbcWvX5wW2vcfNch83xYp9SDZjRgAJk+t373yaHKk= -k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-proxy v0.17.3/go.mod h1:ds8R8bUYPWtQlspC47Sff7o5aQhWDsv6jpQJATDuqaQ= -k8s.io/kube-scheduler v0.17.3/go.mod h1:36HgrrPqzK+rOLTRtDG//b89KjrAZqFI4PXOpdH351M= -k8s.io/kubectl v0.17.3/go.mod h1:NUn4IBY7f7yCMwSop2HCXlw/MVYP4HJBiUmOR3n9w28= -k8s.io/kubelet v0.17.3/go.mod h1:Nh8owUHZcUXtnDAtmGnip36Nw+X6c4rbmDQlVyIhwMQ= -k8s.io/kubernetes v1.17.3 h1:zWCppkLfHM+hoLqfbsrQ0cJnYw+4vAvedI92oQnjo/Q= -k8s.io/kubernetes v1.17.3/go.mod h1:gt28rfzaskIzJ8d82TSJmGrJ0XZD0BBy8TcQvTuCI3w= -k8s.io/legacy-cloud-providers v0.17.3/go.mod h1:ujZML5v8efVQxiXXTG+nck7SjP8KhMRjUYNIsoSkYI0= -k8s.io/metrics v0.17.3/go.mod h1:HEJGy1fhHOjHggW9rMDBJBD3YuGroH3Y1pnIRw9FFaI= -k8s.io/repo-infra v0.0.1-alpha.1/go.mod h1:wO1t9WaB99V80ljbeENTnayuEEwNZt7gECYh/CEyOJ8= -k8s.io/sample-apiserver v0.17.3/go.mod h1:cn/rvFIttGNqy1v88B5ZlDAbyyqDOoF7JHSwPiqNCNQ= -k8s.io/system-validators v1.0.4/go.mod h1:HgSgTg4NAGNoYYjKsUyk52gdNi2PVDswQ9Iyn66R7NI= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= -sigs.k8s.io/controller-tools v0.2.5 h1:kH7HKWed9XO42OTxyhUtqyImiefdZV2Q9Jbrytvhf18= -sigs.k8s.io/controller-tools v0.2.5/go.mod h1:+t0Hz6tOhJQCdd7IYO0mNzimmiM9sqMU0021u6UCF2o= -sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +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= +istio.io/api v0.0.0-20220621155648-3e39d064ab6b h1:H/0SpurAugYS4nhEcYx6uEUv1EX2WqL8vejJrRCVQIA= +istio.io/api v0.0.0-20220621155648-3e39d064ab6b/go.mod h1:SJ6R+VKPZwpWnQsNlQL5cVGjAUNm/alk0D/6P5tV+tM= +istio.io/client-go v1.14.0 h1:KKXMnxXx3U2866OP8FBYlJhjKdI3yIUQnt8L6hSzDHE= +istio.io/client-go v1.14.0/go.mod h1:C7K0CKQlvY84yQKkZhxQbD1riqvnsgXJm3jF5GOmzNg= +k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= +k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= +k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= +k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/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 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20220621154418-c39d0f63fac8 h1:30P0UV8MQgg4f1khIUT09xHmpI5B5Wg0Vg6JNkUqsQ0= +k8s.io/kube-openapi v0.0.0-20220621154418-c39d0f63fac8/go.mod h1:PNbiP2hKArDh8cgJZTDL6Ss/z3wsbga8yjj/7VMB+I4= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +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/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/json v0.0.0-20220525155127-227cbc7cc124 h1:2sgAQQcY0dEW2SsQwTXhQV4vO6+rSslYx8K3XmM5hqQ= +sigs.k8s.io/json v0.0.0-20220525155127-227cbc7cc124/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 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= -vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= \ No newline at end of file diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 62b4c200..ec94ca26 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -7,7 +7,7 @@ set -o pipefail SCRIPT_ROOT=$(realpath $(dirname ${BASH_SOURCE})/..) #brew install coreutils (mac) or sudo apt-get install realpath (linux) if you don't have it # Grab code-generator version from go.sum. -CODEGEN_VERSION=$(grep 'k8s.io/code-generator' go.mod | awk '{print $5}' | head -1) +CODEGEN_VERSION=$(grep 'k8s.io/code-generator' go.mod | awk '{print $4}' | head -1) CODEGEN_PKG=$(echo `go env GOPATH`"/pkg/mod/k8s.io/code-generator@${CODEGEN_VERSION}") echo ">> Using ${CODEGEN_PKG}"