From ffe78360237f0ed684c0aebd8e7b49f8518814eb Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 15 Aug 2023 14:51:49 +0200 Subject: [PATCH 01/47] #15 check version constraints of dependencies Co-authored-by: Philipp Pixel --- pkg/api/v1/ces_component_types.go | 4 + pkg/helm/client.go | 76 +++++++++++++++-- pkg/helm/dependencyChecker.go | 60 ++++++++++++++ pkg/helm/dependencyChecker_test.go | 126 +++++++++++++++++++++++++++++ 4 files changed, 259 insertions(+), 7 deletions(-) create mode 100644 pkg/helm/dependencyChecker.go create mode 100644 pkg/helm/dependencyChecker_test.go diff --git a/pkg/api/v1/ces_component_types.go b/pkg/api/v1/ces_component_types.go index 5d098d5..a9a3c4e 100644 --- a/pkg/api/v1/ces_component_types.go +++ b/pkg/api/v1/ces_component_types.go @@ -61,6 +61,10 @@ type Component struct { Status ComponentStatus `json:"status,omitempty"` } +func (c *Component) String() string { + return fmt.Sprintf("%s/%s:%s", c.Spec.Namespace, c.Spec.Name, c.Spec.Version) +} + // GetHelmChartSpec returns the helm chart for the component cr without custom values. func (c *Component) GetHelmChartSpec(repositoryEndpoint string) *helmclient.ChartSpec { return &helmclient.ChartSpec{ diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 5efd14c..220ecc0 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -3,10 +3,14 @@ package helm import ( "context" "fmt" + "os" + k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" "github.com/cloudogu/k8s-component-operator/pkg/config" + helmclient "github.com/mittwald/go-helm-client" "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/release" ctrl "sigs.k8s.io/controller-runtime" ) @@ -24,8 +28,10 @@ type HelmClient interface { // Client wraps the HelmClient with config.HelmRepositoryData type Client struct { - helmClient HelmClient - helmRepoData *config.HelmRepositoryData + helmClient HelmClient + helmRepoData *config.HelmRepositoryData + actionConfig *action.Configuration + dependencyChecker dependencyChecker } // NewClient create a new instance of the helm client. @@ -48,23 +54,79 @@ func NewClient(namespace string, helmRepoSecret *config.HelmRepositoryData, debu return nil, fmt.Errorf("failed to create helm client: %w", err) } - return &Client{helmClient: helmClient, helmRepoData: helmRepoSecret}, nil + clientGetter := helmclient.NewRESTClientGetter(namespace, nil, opt.RestConfig) + actionConfig := new(action.Configuration) + err = actionConfig.Init( + clientGetter, + namespace, + os.Getenv("HELM_DRIVER"), + debugLog, + ) + if err != nil { + return nil, err + } + + return &Client{ + helmClient: helmClient, + helmRepoData: helmRepoSecret, + actionConfig: actionConfig, + dependencyChecker: &installedDependencyChecker{}, + }, nil } // InstallOrUpgrade takes a component and applies the corresponding helmChart. func (c *Client) InstallOrUpgrade(ctx context.Context, component *k8sv1.Component) error { - endpoint, err := c.helmRepoData.GetOciEndpoint() + endpoint, err := c.getOciEndpoint(component) + if err != nil { + return err + } + + chartSpec := component.GetHelmChartSpec(endpoint) + + componentChart, err := c.getChart(component, chartSpec) if err != nil { - return fmt.Errorf("error while getting oci endpoint for %s: %w", component.Spec.Name, err) + return fmt.Errorf("failed to get chart for component %s: %w", component, err) } - _, err = c.helmClient.InstallOrUpgradeChart(ctx, component.GetHelmChartSpec(endpoint), nil) + dependencies := componentChart.Metadata.Dependencies + deployedReleases, err := c.ListDeployedReleases() if err != nil { - return fmt.Errorf("error while installOrUpgrade chart %s: %w", component.Spec.Name, err) + return fmt.Errorf("failed to list deployed releases: %w", err) + } + + err = c.dependencyChecker.CheckSatisfied(dependencies, deployedReleases) + if err != nil { + return fmt.Errorf("some dependencies are missing: %w", err) + } + + _, err = c.helmClient.InstallOrUpgradeChart(ctx, chartSpec, nil) + if err != nil { + return fmt.Errorf("error while installOrUpgrade component %s: %w", component, err) } return nil } +func (c *Client) getOciEndpoint(component *k8sv1.Component) (string, error) { + endpoint, err := c.helmRepoData.GetOciEndpoint() + if err != nil { + return "", fmt.Errorf("error while getting oci endpoint for %s: %w", component.Spec.Name, err) + } + + return endpoint, nil +} + +func (c *Client) getChart(component *k8sv1.Component, spec *helmclient.ChartSpec) (*chart.Chart, error) { + // We need this install because it sets the registryClient in ChartPathOptions which is a private field. + install := action.NewInstall(c.actionConfig) + install.Version = component.Spec.Version + componentChart, _, err := c.helmClient.GetChart(spec.ChartName, &install.ChartPathOptions) + if err != nil { + return nil, fmt.Errorf("error while getting chart for %s:%s: %w", component.Spec.Name, component.Spec.Version, err) + } + + return componentChart, nil +} + // Uninstall removes the helmChart of the given component func (c *Client) Uninstall(component *k8sv1.Component) error { if err := c.helmClient.UninstallReleaseByName(component.Spec.Name); err != nil { diff --git a/pkg/helm/dependencyChecker.go b/pkg/helm/dependencyChecker.go new file mode 100644 index 0000000..6ae0110 --- /dev/null +++ b/pkg/helm/dependencyChecker.go @@ -0,0 +1,60 @@ +package helm + +import ( + "errors" + "fmt" + + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/release" + + "github.com/Masterminds/semver/v3" +) + +type dependencyChecker interface { + CheckSatisfied(dependencies []*chart.Dependency, deployedReleases []*release.Release) error +} + +type installedDependencyChecker struct { +} + +// CheckSatisfied validates that all dependencies are installed in the required version. +func (d *installedDependencyChecker) CheckSatisfied(dependencies []*chart.Dependency, deployedReleases []*release.Release) error { + var errs []error + for _, dependency := range dependencies { + isInstalled := false + for _, deployedRelease := range deployedReleases { + if dependency.Name == deployedRelease.Chart.Name() { + isInstalled = true + err := checkVersion(dependency, deployedRelease.Chart) + errs = append(errs, err) + + break + } + } + + if !isInstalled { + errs = append(errs, fmt.Errorf("dependency %s with version %s is not installed", dependency.Name, dependency.Version)) + } + } + + return errors.Join(errs...) +} + +func checkVersion(dependency *chart.Dependency, deployedChart *chart.Chart) error { + constraint, err := semver.NewConstraint(dependency.Version) + if err != nil { + return fmt.Errorf("failed to parse constraint for dependency %s with version requirement %s: %w", dependency.Name, dependency.Version, err) + } + + version, err := semver.NewVersion(deployedChart.Metadata.Version) + if err != nil { + return fmt.Errorf("failed to parse version of installed component %s with version %s: %w", deployedChart.Metadata.Name, deployedChart.Metadata.Version, err) + } + + isSatisfied := constraint.Check(version) + if !isSatisfied { + return fmt.Errorf("installed dependency %s with version %s does not satisfy version requirement %s", deployedChart.Metadata.Name, deployedChart.Metadata.Version, dependency.Version) + } + + return nil +} diff --git a/pkg/helm/dependencyChecker_test.go b/pkg/helm/dependencyChecker_test.go new file mode 100644 index 0000000..8f7332b --- /dev/null +++ b/pkg/helm/dependencyChecker_test.go @@ -0,0 +1,126 @@ +package helm + +import ( + "fmt" + "github.com/stretchr/testify/assert" + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/release" + "testing" +) + +func Test_installedDependencyChecker_CheckSatisfied(t *testing.T) { + type args struct { + dependencies []*chart.Dependency + deployedReleases []*release.Release + } + tests := []struct { + name string + args args + wantErr assert.ErrorAssertionFunc + }{ + { + name: "should succeed if dependencies and releases is nil", + args: args{ + dependencies: nil, + deployedReleases: nil, + }, + wantErr: assert.NoError, + }, + { + name: "should succeed if dependencies is nil", + args: args{ + dependencies: nil, + deployedReleases: []*release.Release{createRelease("k8s-etcd", "3.0.0")}, + }, + wantErr: assert.NoError, + }, + { + name: "should fail if no dependency is installed", + args: args{ + dependencies: []*chart.Dependency{createDependency("k8s-etcd", "~3.0.0"), createDependency("not_installed", ">1.2.3")}, + deployedReleases: []*release.Release{}, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + return assert.ErrorContains(t, err, "dependency k8s-etcd with version ~3.0.0 is not installed\ndependency not_installed with version >1.2.3 is not installed", i) + }, + }, + { + name: "should fail if one dependency is not installed", + args: args{ + dependencies: []*chart.Dependency{createDependency("k8s-etcd", "~3.0.0"), createDependency("not_installed", ">1.2.3")}, + deployedReleases: []*release.Release{createRelease("k8s-etcd", "3.0.0")}, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + return assert.ErrorContains(t, err, "dependency not_installed with version >1.2.3 is not installed", i) + }, + }, + { + name: "should succeed if all dependencies are installed", + args: args{ + dependencies: []*chart.Dependency{createDependency("k8s-etcd", "~3.0.0"), createDependency("k8s-dogu-operator", ">1.2.3")}, + deployedReleases: []*release.Release{createRelease("k8s-dogu-operator", "2.1.0"), createRelease("k8s-etcd", "3.0.0")}, + }, + wantErr: assert.NoError, + }, + { + name: "should fail to parse version requirement", + args: args{ + dependencies: []*chart.Dependency{createDependency("k8s-etcd", "~3.0.0"), createDependency("k8s-dogu-operator", "invalid")}, + deployedReleases: []*release.Release{createRelease("k8s-dogu-operator", "2.1.0"), createRelease("k8s-etcd", "3.0.0")}, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + return assert.ErrorContains(t, err, "failed to parse constraint for dependency k8s-dogu-operator with version requirement invalid", i) + }, + }, + { + name: "should fail to parse version", + args: args{ + dependencies: []*chart.Dependency{createDependency("k8s-etcd", "~3.0.0"), createDependency("k8s-dogu-operator", ">1.2.3")}, + deployedReleases: []*release.Release{createRelease("k8s-dogu-operator", "2.1.0"), createRelease("k8s-etcd", "invalid")}, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + return assert.ErrorContains(t, err, "failed to parse version of installed component k8s-etcd with version invalid", i) + }, + }, + { + name: "should fail if one version requirement is not satisfied", + args: args{ + dependencies: []*chart.Dependency{createDependency("k8s-etcd", "~3.0.0"), createDependency("k8s-dogu-operator", ">1.2.3")}, + deployedReleases: []*release.Release{createRelease("k8s-dogu-operator", "2.1.0"), createRelease("k8s-etcd", "2.0.0")}, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + return assert.ErrorContains(t, err, "installed dependency k8s-etcd with version 2.0.0 does not satisfy version requirement ~3.0.0", i) + }, + }, + { + name: "should fail if two version requirements are not satisfied", + args: args{ + dependencies: []*chart.Dependency{createDependency("k8s-etcd", "~3.0.0"), createDependency("k8s-dogu-operator", ">1.2.3")}, + deployedReleases: []*release.Release{createRelease("k8s-dogu-operator", "1.2.2"), createRelease("k8s-etcd", "2.0.0")}, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + return assert.ErrorContains(t, err, "installed dependency k8s-etcd with version 2.0.0 does not satisfy version requirement ~3.0.0\ninstalled dependency k8s-dogu-operator with version 1.2.2 does not satisfy version requirement >1.2.3", i) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + d := &installedDependencyChecker{} + tt.wantErr(t, d.CheckSatisfied(tt.args.dependencies, tt.args.deployedReleases), fmt.Sprintf("CheckSatisfied(%v, %v)", tt.args.dependencies, tt.args.deployedReleases)) + }) + } +} + +func createDependency(name, version string) *chart.Dependency { + return &chart.Dependency{ + Name: name, + Version: version, + } +} + +func createRelease(name, version string) *release.Release { + return &release.Release{Chart: &chart.Chart{Metadata: &chart.Metadata{ + Name: name, + Version: version, + }}} +} From 2d63b44ba33b5d2b4fb94f1580e6ac473d52e35d Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Tue, 15 Aug 2023 15:48:13 +0200 Subject: [PATCH 02/47] #15 add dependency satisfaction check to install/upgrade manager The satisfaction check is conducted _before_ any writing does happen in order to avoid unnecessary complications. The check is supposed to return a requeueable error because the missing dependencies may be installed concurrently so the satisfaction check may succeed in a later reconciliation loop. --- pkg/controllers/componentController.go | 2 +- pkg/controllers/componentInstallManager.go | 19 +++++-- .../componentInstallManager_test.go | 2 +- pkg/controllers/componentUpgradeManager.go | 19 +++++-- .../componentUpgradeManager_test.go | 2 +- pkg/controllers/component_manager.go | 51 +++--------------- pkg/controllers/interfaces.go | 54 +++++++++++++++++++ pkg/controllers/mock_HelmClient_test.go | 43 +++++++++++++++ pkg/helm/client.go | 26 +++++++-- pkg/helm/dependencyChecker.go | 4 +- 10 files changed, 162 insertions(+), 60 deletions(-) create mode 100644 pkg/controllers/interfaces.go diff --git a/pkg/controllers/componentController.go b/pkg/controllers/componentController.go index 59ed80d..0932ec1 100644 --- a/pkg/controllers/componentController.go +++ b/pkg/controllers/componentController.go @@ -69,7 +69,7 @@ func NewComponentReconciler(componentClient ecosystem.ComponentInterface, helmCl // move the current state of the cluster closer to the desired state. func (r *componentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx) - logger.Info("Reconcile this crd") + logger.Info("Reconcile this component", "component", req.Name) component, err := r.componentClient.Get(ctx, req.Name, v1.GetOptions{}) if err != nil { diff --git a/pkg/controllers/componentInstallManager.go b/pkg/controllers/componentInstallManager.go index f2ed42d..e181ab1 100644 --- a/pkg/controllers/componentInstallManager.go +++ b/pkg/controllers/componentInstallManager.go @@ -3,8 +3,12 @@ package controllers import ( "context" "fmt" + "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + + corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -12,13 +16,15 @@ import ( type componentInstallManager struct { componentClient ecosystem.ComponentInterface helmClient HelmClient + recorder record.EventRecorder } // NewComponentInstallManager creates a new instance of componentInstallManager. -func NewComponentInstallManager(componentClient ecosystem.ComponentInterface, helmClient HelmClient) *componentInstallManager { +func NewComponentInstallManager(componentClient ecosystem.ComponentInterface, helmClient HelmClient, recorder record.EventRecorder) *componentInstallManager { return &componentInstallManager{ componentClient: componentClient, helmClient: helmClient, + recorder: recorder, } } @@ -27,7 +33,14 @@ func NewComponentInstallManager(componentClient ecosystem.ComponentInterface, he func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv1.Component) error { logger := log.FromContext(ctx) - component, err := cim.componentClient.UpdateStatusInstalling(ctx, component) + err := cim.helmClient.SatisfiesDependencies(ctx, component) + if err != nil { + cim.recorder.Eventf(component, corev1.EventTypeWarning, InstallEventReason, "One or more dependencies are not satisfied: %s", err.Error()) + // TODO implement requeueable error with timing and state and return an error instance here instead + return err + } + + component, err = cim.componentClient.UpdateStatusInstalling(ctx, component) if err != nil { return fmt.Errorf("failed to set status installing: %w", err) } @@ -43,7 +56,7 @@ func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv logger.Info("Install helm chart...") - // create a new context that does not get cancelled immediately on SIGTERM + // create a new context that does not get canceled immediately on SIGTERM helmCtx := context.Background() if err := cim.helmClient.InstallOrUpgrade(helmCtx, component); err != nil { diff --git a/pkg/controllers/componentInstallManager_test.go b/pkg/controllers/componentInstallManager_test.go index 06c2904..c820341 100644 --- a/pkg/controllers/componentInstallManager_test.go +++ b/pkg/controllers/componentInstallManager_test.go @@ -9,7 +9,7 @@ import ( func TestNewComponentInstallManager(t *testing.T) { // when - manager := NewComponentInstallManager(nil, nil) + manager := NewComponentInstallManager(nil, nil, nil) // then require.NotNil(t, manager) diff --git a/pkg/controllers/componentUpgradeManager.go b/pkg/controllers/componentUpgradeManager.go index b54057e..daf08e0 100644 --- a/pkg/controllers/componentUpgradeManager.go +++ b/pkg/controllers/componentUpgradeManager.go @@ -3,7 +3,11 @@ package controllers import ( "context" "fmt" + k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + + corev1 "k8s.io/api/core/v1" + "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -11,13 +15,15 @@ import ( type componentUpgradeManager struct { componentClient ComponentClient helmClient HelmClient + recorder record.EventRecorder } // NewComponentUpgradeManager creates a new instance of componentUpgradeManager. -func NewComponentUpgradeManager(componentClient ComponentClient, helmClient HelmClient) *componentUpgradeManager { +func NewComponentUpgradeManager(componentClient ComponentClient, helmClient HelmClient, recorder record.EventRecorder) *componentUpgradeManager { return &componentUpgradeManager{ componentClient: componentClient, helmClient: helmClient, + recorder: recorder, } } @@ -26,14 +32,21 @@ func NewComponentUpgradeManager(componentClient ComponentClient, helmClient Helm func (cum *componentUpgradeManager) Upgrade(ctx context.Context, component *k8sv1.Component) error { logger := log.FromContext(ctx) - component, err := cum.componentClient.UpdateStatusUpgrading(ctx, component) + err := cum.helmClient.SatisfiesDependencies(ctx, component) + if err != nil { + cum.recorder.Eventf(component, corev1.EventTypeWarning, UpgradeEventReason, "One or more dependencies are not satisfied: %s", err.Error()) + // TODO implement requeueable error with timing and state and return an error instance here instead + return err + } + + component, err = cum.componentClient.UpdateStatusUpgrading(ctx, component) if err != nil { return fmt.Errorf("failed to update status-upgrading for component %s: %w", component.Spec.Name, err) } logger.Info("Upgrade helm chart...") - // create a new context that does not get cancelled immediately on SIGTERM + // create a new context that does not get canceled immediately on SIGTERM helmCtx := context.Background() if err := cum.helmClient.InstallOrUpgrade(helmCtx, component); err != nil { diff --git a/pkg/controllers/componentUpgradeManager_test.go b/pkg/controllers/componentUpgradeManager_test.go index 38e233d..035507a 100644 --- a/pkg/controllers/componentUpgradeManager_test.go +++ b/pkg/controllers/componentUpgradeManager_test.go @@ -13,7 +13,7 @@ func TestNewComponentUpgradeManager(t *testing.T) { mockComponentClient := NewMockComponentClient(t) mockHelmClient := NewMockHelmClient(t) - manager := NewComponentUpgradeManager(mockComponentClient, mockHelmClient) + manager := NewComponentUpgradeManager(mockComponentClient, mockHelmClient, nil) assert.NotNil(t, manager) assert.Equal(t, mockHelmClient, manager.helmClient) diff --git a/pkg/controllers/component_manager.go b/pkg/controllers/component_manager.go index 31095e5..9a93490 100644 --- a/pkg/controllers/component_manager.go +++ b/pkg/controllers/component_manager.go @@ -2,50 +2,13 @@ package controllers import ( "context" - "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" - k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" - "helm.sh/helm/v3/pkg/release" + corev1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/record" -) - -// InstallManager includes functionality to install components in the cluster. -type InstallManager interface { - // Install installs a component resource. - Install(ctx context.Context, component *k8sv1.Component) error -} - -// DeleteManager includes functionality to delete components in the cluster. -type DeleteManager interface { - // Delete deletes a component resource. - Delete(ctx context.Context, component *k8sv1.Component) error -} - -// UpgradeManager includes functionality to upgrade components in the cluster. -type UpgradeManager interface { - // Upgrade upgrades a component resource. - Upgrade(ctx context.Context, component *k8sv1.Component) error -} - -// HelmClient is an interface for managing components with helm. -type HelmClient interface { - // InstallOrUpgrade takes a component and applies the corresponding helmChart. - InstallOrUpgrade(ctx context.Context, component *k8sv1.Component) error - // Uninstall removes the helmChart of the given component - Uninstall(component *k8sv1.Component) error - // ListDeployedReleases returns all deployed helm releases - ListDeployedReleases() ([]*release.Release, error) -} - -// ComponentClient embeds the ecosystem.ComponentInterface interface for usage in this package. -type ComponentClient interface { - ecosystem.ComponentInterface -} -// EventRecorder embeds the record.EventRecorder interface for usage in this package. -type EventRecorder interface { - record.EventRecorder -} + "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" + k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" +) // componentManager is a central unit in the process of handling component custom resources. // The componentManager creates, updates and deletes components. @@ -59,14 +22,14 @@ type componentManager struct { // NewComponentManager creates a new instance of componentManager. func NewComponentManager(clientset ecosystem.ComponentInterface, helmClient HelmClient, recorder record.EventRecorder) *componentManager { return &componentManager{ - installManager: NewComponentInstallManager(clientset, helmClient), + installManager: NewComponentInstallManager(clientset, helmClient, recorder), deleteManager: NewComponentDeleteManager(clientset, helmClient), - upgradeManager: NewComponentUpgradeManager(clientset, helmClient), + upgradeManager: NewComponentUpgradeManager(clientset, helmClient, recorder), recorder: recorder, } } -// Install installs the given component resource. +// Install installs the given component resource. func (m *componentManager) Install(ctx context.Context, component *k8sv1.Component) error { m.recorder.Event(component, corev1.EventTypeNormal, InstallEventReason, "Starting installation...") return m.installManager.Install(ctx, component) diff --git a/pkg/controllers/interfaces.go b/pkg/controllers/interfaces.go new file mode 100644 index 0000000..e0b44ed --- /dev/null +++ b/pkg/controllers/interfaces.go @@ -0,0 +1,54 @@ +package controllers + +import ( + "context" + + "helm.sh/helm/v3/pkg/release" + + "k8s.io/client-go/tools/record" + + "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" + k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" +) + +// InstallManager includes functionality to install components in the cluster. +type InstallManager interface { + // Install installs a component resource. + Install(ctx context.Context, component *k8sv1.Component) error +} + +// DeleteManager includes functionality to delete components in the cluster. +type DeleteManager interface { + // Delete deletes a component resource. + Delete(ctx context.Context, component *k8sv1.Component) error +} + +// UpgradeManager includes functionality to upgrade components in the cluster. +type UpgradeManager interface { + // Upgrade upgrades a component resource. + Upgrade(ctx context.Context, component *k8sv1.Component) error +} + +// HelmClient is an interface for managing components with helm. +type HelmClient interface { + // InstallOrUpgrade takes a component and applies the corresponding helmChart. + InstallOrUpgrade(ctx context.Context, component *k8sv1.Component) error + // Uninstall removes the helmChart of the given component + Uninstall(component *k8sv1.Component) error + // ListDeployedReleases returns all deployed helm releases + ListDeployedReleases() ([]*release.Release, error) + // SatisfiesDependencies validates that all dependencies are installed in the required version. A nil error + // indicates that all dependencies (if any) meet the requirements, so that the client may conduct an installation or + // upgrade. + SatisfiesDependencies(ctx context.Context, component *k8sv1.Component) error +} + +// ComponentClient embeds the ecosystem.ComponentInterface interface for usage in this package. +type ComponentClient interface { + ecosystem.ComponentInterface +} + +// EventRecorder embeds the record.EventRecorder interface for usage in this package. +type EventRecorder interface { + record.EventRecorder +} diff --git a/pkg/controllers/mock_HelmClient_test.go b/pkg/controllers/mock_HelmClient_test.go index 74052bb..6684b66 100644 --- a/pkg/controllers/mock_HelmClient_test.go +++ b/pkg/controllers/mock_HelmClient_test.go @@ -120,6 +120,49 @@ func (_c *MockHelmClient_ListDeployedReleases_Call) RunAndReturn(run func() ([]* return _c } +// SatisfiesDependencies provides a mock function with given fields: ctx, component +func (_m *MockHelmClient) SatisfiesDependencies(ctx context.Context, component *v1.Component) error { + ret := _m.Called(ctx, component) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) error); ok { + r0 = rf(ctx, component) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockHelmClient_SatisfiesDependencies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SatisfiesDependencies' +type MockHelmClient_SatisfiesDependencies_Call struct { + *mock.Call +} + +// SatisfiesDependencies is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +func (_e *MockHelmClient_Expecter) SatisfiesDependencies(ctx interface{}, component interface{}) *MockHelmClient_SatisfiesDependencies_Call { + return &MockHelmClient_SatisfiesDependencies_Call{Call: _e.mock.On("SatisfiesDependencies", ctx, component)} +} + +func (_c *MockHelmClient_SatisfiesDependencies_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockHelmClient_SatisfiesDependencies_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component)) + }) + return _c +} + +func (_c *MockHelmClient_SatisfiesDependencies_Call) Return(_a0 error) *MockHelmClient_SatisfiesDependencies_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockHelmClient_SatisfiesDependencies_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *MockHelmClient_SatisfiesDependencies_Call { + _c.Call.Return(run) + return _c +} + // Uninstall provides a mock function with given fields: component func (_m *MockHelmClient) Uninstall(component *v1.Component) error { ret := _m.Called(component) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 220ecc0..a437603 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -13,6 +13,7 @@ import ( "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/release" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/log" ) const ( @@ -83,6 +84,25 @@ func (c *Client) InstallOrUpgrade(ctx context.Context, component *k8sv1.Componen chartSpec := component.GetHelmChartSpec(endpoint) + _, err = c.helmClient.InstallOrUpgradeChart(ctx, chartSpec, nil) + if err != nil { + return fmt.Errorf("error while installOrUpgrade component %s: %w", component, err) + } + return nil +} + +// SatisfiesDependencies checks if all dependencies are satisfied in terms of installation and ver +func (c *Client) SatisfiesDependencies(ctx context.Context, component *k8sv1.Component) error { + logger := log.FromContext(ctx) + logger.Info("Checking if components dependencies are satisfied", "component", component.Name) + + endpoint, err := c.getOciEndpoint(component) + if err != nil { + return err + } + + chartSpec := component.GetHelmChartSpec(endpoint) + componentChart, err := c.getChart(component, chartSpec) if err != nil { return fmt.Errorf("failed to get chart for component %s: %w", component, err) @@ -99,10 +119,6 @@ func (c *Client) InstallOrUpgrade(ctx context.Context, component *k8sv1.Componen return fmt.Errorf("some dependencies are missing: %w", err) } - _, err = c.helmClient.InstallOrUpgradeChart(ctx, chartSpec, nil) - if err != nil { - return fmt.Errorf("error while installOrUpgrade component %s: %w", component, err) - } return nil } @@ -116,7 +132,7 @@ func (c *Client) getOciEndpoint(component *k8sv1.Component) (string, error) { } func (c *Client) getChart(component *k8sv1.Component, spec *helmclient.ChartSpec) (*chart.Chart, error) { - // We need this install because it sets the registryClient in ChartPathOptions which is a private field. + // We need this installAction because it sets the registryClient in ChartPathOptions which is a private field. install := action.NewInstall(c.actionConfig) install.Version = component.Spec.Version componentChart, _, err := c.helmClient.GetChart(spec.ChartName, &install.ChartPathOptions) diff --git a/pkg/helm/dependencyChecker.go b/pkg/helm/dependencyChecker.go index 6ae0110..2071baa 100644 --- a/pkg/helm/dependencyChecker.go +++ b/pkg/helm/dependencyChecker.go @@ -11,11 +11,11 @@ import ( ) type dependencyChecker interface { + // CheckSatisfied validates that all dependencies are installed in the required version. CheckSatisfied(dependencies []*chart.Dependency, deployedReleases []*release.Release) error } -type installedDependencyChecker struct { -} +type installedDependencyChecker struct{} // CheckSatisfied validates that all dependencies are installed in the required version. func (d *installedDependencyChecker) CheckSatisfied(dependencies []*chart.Dependency, deployedReleases []*release.Release) error { From f7aece8719b72a853e5e89c6b570046f41b3ab33 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Wed, 16 Aug 2023 14:15:45 +0200 Subject: [PATCH 03/47] #15 prepare error requeueing Requeue handling is done analogous to the dogu operator but the implementation is a bit simpler as we don't need all the features. Since everything might be executed again on requeue, all operations must be idempotent. Co-authored-by: Philipp Pixel --- main.go | 2 +- pkg/api/ecosystem/ecosystemClientSet.go | 14 +- pkg/api/ecosystem/ecosystemClientSet_test.go | 4 +- pkg/controllers/componentController.go | 107 +- pkg/controllers/componentController_test.go | 279 +- pkg/controllers/componentDeleteManager.go | 6 +- .../componentDeleteManager_test.go | 20 +- pkg/controllers/componentInstallManager.go | 9 +- .../componentInstallManager_test.go | 92 +- pkg/controllers/componentUpgradeManager.go | 6 +- .../componentUpgradeManager_test.go | 24 +- pkg/controllers/component_manager.go | 11 +- pkg/controllers/component_manager_test.go | 12 +- pkg/controllers/interfaces.go | 44 +- pkg/controllers/mock_ComponentClient_test.go | 871 ------ .../mock_componentEcosystemInterface_test.go | 2374 +++++++++++++++++ .../mock_componentInterface_test.go | 871 ++++++ .../mock_componentV1Alpha1Interface_test.go | 80 + ...ger_test.go => mock_deleteManager_test.go} | 34 +- ...der_test.go => mock_eventRecorder_test.go} | 66 +- ...Client_test.go => mock_helmClient_test.go} | 82 +- ...er_test.go => mock_installManager_test.go} | 34 +- pkg/controllers/mock_requeuableError_test.go | 119 + pkg/controllers/mock_requeueHandler_test.go | 96 + ...er_test.go => mock_upgradeManager_test.go} | 34 +- pkg/controllers/requeueHandler.go | 63 + pkg/controllers/requeueHandler_test.go | 119 + pkg/helm/client_test.go | 7 +- 28 files changed, 4269 insertions(+), 1211 deletions(-) delete mode 100644 pkg/controllers/mock_ComponentClient_test.go create mode 100644 pkg/controllers/mock_componentEcosystemInterface_test.go create mode 100644 pkg/controllers/mock_componentInterface_test.go create mode 100644 pkg/controllers/mock_componentV1Alpha1Interface_test.go rename pkg/controllers/{mock_DeleteManager_test.go => mock_deleteManager_test.go} (51%) rename pkg/controllers/{mock_EventRecorder_test.go => mock_eventRecorder_test.go} (61%) rename pkg/controllers/{mock_HelmClient_test.go => mock_helmClient_test.go} (53%) rename pkg/controllers/{mock_InstallManager_test.go => mock_installManager_test.go} (51%) create mode 100644 pkg/controllers/mock_requeuableError_test.go create mode 100644 pkg/controllers/mock_requeueHandler_test.go rename pkg/controllers/{mock_UpgradeManager_test.go => mock_upgradeManager_test.go} (51%) create mode 100644 pkg/controllers/requeueHandler.go create mode 100644 pkg/controllers/requeueHandler_test.go diff --git a/main.go b/main.go index a903b86..056a8ad 100644 --- a/main.go +++ b/main.go @@ -150,7 +150,7 @@ func configureReconciler(k8sManager manager.Manager, operatorConfig *config.Oper return fmt.Errorf("failed to create helm client: %w", err) } - componentReconciler := controllers.NewComponentReconciler(componentClientSet.EcosystemV1Alpha1().Components(operatorConfig.Namespace), helmClient, eventRecorder) + componentReconciler := controllers.NewComponentReconciler(componentClientSet, helmClient, eventRecorder, operatorConfig.Namespace) err = componentReconciler.SetupWithManager(k8sManager) if err != nil { return fmt.Errorf("failed to setup reconciler with manager: %w", err) diff --git a/pkg/api/ecosystem/ecosystemClientSet.go b/pkg/api/ecosystem/ecosystemClientSet.go index e1167eb..27d2f51 100644 --- a/pkg/api/ecosystem/ecosystemClientSet.go +++ b/pkg/api/ecosystem/ecosystemClientSet.go @@ -2,6 +2,7 @@ package ecosystem import ( v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes" @@ -9,6 +10,15 @@ import ( "k8s.io/client-go/rest" ) +type ComponentEcosystemInterface interface { + kubernetes.Interface + ComponentV1Alpha1() ComponentV1Alpha1Interface +} + +type ComponentV1Alpha1Interface interface { + Components(namespace string) ComponentInterface +} + // EcosystemClientset wraps the regular clientset with the ecosystemV1Alpha1 client. type EcosystemClientset struct { *kubernetes.Clientset @@ -28,8 +38,8 @@ func NewComponentClientset(config *rest.Config, clientset *kubernetes.Clientset) }, nil } -// EcosystemV1Alpha1 returns the ecosystemV1Aplha1 client. -func (cswc *EcosystemClientset) EcosystemV1Alpha1() *V1Alpha1Client { +// ComponentV1Alpha1 returns the ecosystemV1Aplha1 client. +func (cswc *EcosystemClientset) ComponentV1Alpha1() ComponentV1Alpha1Interface { return cswc.ecosystemV1Alpha1 } diff --git a/pkg/api/ecosystem/ecosystemClientSet_test.go b/pkg/api/ecosystem/ecosystemClientSet_test.go index eb6d84f..3a71634 100644 --- a/pkg/api/ecosystem/ecosystemClientSet_test.go +++ b/pkg/api/ecosystem/ecosystemClientSet_test.go @@ -70,7 +70,7 @@ func TestNewComponentClientset(t *testing.T) { }) } -func TestEcosystemV1Alpha1(t *testing.T) { +func TestComponentV1Alpha1(t *testing.T) { t.Run("should return V1Alpha1Client", func(t *testing.T) { // given config := &rest.Config{} @@ -79,7 +79,7 @@ func TestEcosystemV1Alpha1(t *testing.T) { require.NoError(t, err) // when - componentClient := client.EcosystemV1Alpha1() + componentClient := client.ComponentV1Alpha1() // then require.NotNil(t, componentClient) diff --git a/pkg/controllers/componentController.go b/pkg/controllers/componentController.go index 0932ec1..d2b49c4 100644 --- a/pkg/controllers/componentController.go +++ b/pkg/controllers/componentController.go @@ -3,9 +3,11 @@ package controllers import ( "context" "fmt" + "strings" + "github.com/cloudogu/cesapp-lib/core" - "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + "helm.sh/helm/v3/pkg/release" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -14,7 +16,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - "strings" ) type operation string @@ -28,6 +29,8 @@ const ( UpgradeEventReason = "Upgrade" // DowngradeEventReason The name of the downgrade event DowngradeEventReason = "Downgrade" + // RequeueEventReason The name of the requeue event + RequeueEventReason = "Requeue" // Install represents the install-operation Install = operation("Install") // Upgrade represents the upgrade-operation @@ -42,26 +45,31 @@ const ( // ComponentManager abstracts the simple component operations in a k8s CES. type ComponentManager interface { - InstallManager - DeleteManager - UpgradeManager + installManager + deleteManager + upgradeManager } // componentReconciler watches every Component object in the cluster and handles them accordingly. type componentReconciler struct { - componentClient ecosystem.ComponentInterface + clientSet componentEcosystemInterface recorder record.EventRecorder componentManager ComponentManager - helmClient HelmClient + helmClient helmClient + requeueHandler requeueHandler + namespace string } // NewComponentReconciler creates a new component reconciler. -func NewComponentReconciler(componentClient ecosystem.ComponentInterface, helmClient HelmClient, recorder record.EventRecorder) *componentReconciler { +func NewComponentReconciler(clientSet componentEcosystemInterface, helmClient helmClient, recorder record.EventRecorder, namespace string) *componentReconciler { + componentRequeueHandler := NewComponentRequeueHandler(clientSet, recorder, namespace) return &componentReconciler{ - componentClient: componentClient, + clientSet: clientSet, recorder: recorder, - componentManager: NewComponentManager(componentClient, helmClient, recorder), + componentManager: NewComponentManager(clientSet.ComponentV1Alpha1().Components(namespace), helmClient, recorder), helmClient: helmClient, + requeueHandler: componentRequeueHandler, + namespace: namespace, } } @@ -70,7 +78,7 @@ func NewComponentReconciler(componentClient ecosystem.ComponentInterface, helmCl func (r *componentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx) logger.Info("Reconcile this component", "component", req.Name) - component, err := r.componentClient.Get(ctx, req.Name, v1.GetOptions{}) + component, err := r.clientSet.ComponentV1Alpha1().Components(req.Namespace).Get(ctx, req.Name, v1.GetOptions{}) if err != nil { logger.Info(fmt.Sprintf("failed to get component %+v: %s", req, err)) @@ -80,19 +88,19 @@ func (r *componentReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( operation, err := r.evaluateRequiredOperation(ctx, component) if err != nil { - return ctrl.Result{}, fmt.Errorf("failed to evaluate required operation: %w", err) + return requeueWithError(fmt.Errorf("failed to evaluate required operation: %w", err)) } logger.Info(fmt.Sprintf("Required operation is %s", operation)) switch operation { case Install: - return ctrl.Result{}, r.performInstallOperation(ctx, component) + return r.performInstallOperation(ctx, component) case Delete: - return ctrl.Result{}, r.performDeleteOperation(ctx, component) + return r.performDeleteOperation(ctx, component) case Upgrade: - return ctrl.Result{}, r.performUpgradeOperation(ctx, component) + return r.performUpgradeOperation(ctx, component) case Downgrade: - return ctrl.Result{}, r.performDowngradeOperation(component) + return r.performDowngradeOperation(component) case Ignore: return ctrl.Result{}, nil default: @@ -100,37 +108,78 @@ func (r *componentReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( } } -func (r *componentReconciler) performInstallOperation(ctx context.Context, component *k8sv1.Component) error { - return r.performOperation(ctx, component, InstallEventReason, r.componentManager.Install) +func (r *componentReconciler) performInstallOperation(ctx context.Context, component *k8sv1.Component) (ctrl.Result, error) { + return r.performOperation(ctx, component, InstallEventReason, k8sv1.ComponentStatusNotInstalled, r.componentManager.Install) } -func (r *componentReconciler) performUpgradeOperation(ctx context.Context, component *k8sv1.Component) error { - return r.performOperation(ctx, component, UpgradeEventReason, r.componentManager.Upgrade) +func (r *componentReconciler) performUpgradeOperation(ctx context.Context, component *k8sv1.Component) (ctrl.Result, error) { + return r.performOperation(ctx, component, UpgradeEventReason, k8sv1.ComponentStatusInstalled, r.componentManager.Upgrade) } -func (r *componentReconciler) performDeleteOperation(ctx context.Context, component *k8sv1.Component) error { - return r.performOperation(ctx, component, DeinstallationEventReason, r.componentManager.Delete) +func (r *componentReconciler) performDeleteOperation(ctx context.Context, component *k8sv1.Component) (ctrl.Result, error) { + return r.performOperation(ctx, component, DeinstallationEventReason, k8sv1.ComponentStatusInstalled, r.componentManager.Delete) } -func (r *componentReconciler) performDowngradeOperation(component *k8sv1.Component) error { +func (r *componentReconciler) performDowngradeOperation(component *k8sv1.Component) (ctrl.Result, error) { r.recorder.Event(component, corev1.EventTypeWarning, DowngradeEventReason, "component downgrades are not allowed") - return fmt.Errorf("downgrades are not allowed") + return ctrl.Result{}, fmt.Errorf("downgrades are not allowed") } -func (r *componentReconciler) performOperation(ctx context.Context, component *k8sv1.Component, eventReason string, operationFn func(context.Context, *k8sv1.Component) error) error { - err := operationFn(ctx, component) +// performOperation executes the given operationFn and requeues if necessary. +// When requeuing, the sourceComponentStatus is set as the components' status. +func (r *componentReconciler) performOperation( + ctx context.Context, + component *k8sv1.Component, + eventReason string, + requeueStatus string, + operationFn func(context.Context, *k8sv1.Component) error, +) (ctrl.Result, error) { + logger := log.FromContext(ctx) + + operationError := operationFn(ctx, component) + contextMessageOnError := fmt.Sprintf("%s failed with component %s", eventReason, component.Name) eventType := corev1.EventTypeNormal message := fmt.Sprintf("%s successful", eventReason) - if err != nil { + if operationError != nil { eventType = corev1.EventTypeWarning - printError := strings.ReplaceAll(err.Error(), "\n", "") + printError := strings.ReplaceAll(operationError.Error(), "\n", "") message = fmt.Sprintf("%s failed. Reason: %s", eventReason, printError) + logger.Error(operationError, message) } // on self-upgrade of the component-operator this event might not get send, because the operator is already shutting down r.recorder.Event(component, eventType, eventReason, message) - return err + result, handleErr := r.requeueHandler.Handle(ctx, contextMessageOnError, component, operationError, + func() { + component.Status.Status = requeueStatus + }) + if handleErr != nil { + r.recorder.Eventf(component, corev1.EventTypeWarning, RequeueEventReason, + "Failed to requeue the %s.", strings.ToLower(eventReason)) + return requeueWithError(fmt.Errorf("failed to handle requeue: %w", handleErr)) + } + + return requeueOrFinishOperation(result) +} + +// requeueWithError is a syntax sugar function to express that every non-nil error will result in a requeue +// operation. +// +// Use requeueOrFinishOperation() if the reconciler should requeue the operation because of the result instead of an +// error. +// Use finishOperation() if the reconciler should not requeue the operation. +func requeueWithError(err error) (ctrl.Result, error) { + return ctrl.Result{}, err +} + +// requeueOrFinishOperation is a syntax sugar function to express that the there is no error to handle but the result +// controls whether the current operation should be finished or requeued. +// +// Use requeueWithError() if the reconciler should requeue the operation because of a non-nil error. +// Use finishOperation() if the reconciler should not requeue the operation. +func requeueOrFinishOperation(result ctrl.Result) (ctrl.Result, error) { + return result, nil } func (r *componentReconciler) evaluateRequiredOperation(ctx context.Context, component *k8sv1.Component) (operation, error) { diff --git a/pkg/controllers/componentController_test.go b/pkg/controllers/componentController_test.go index aeff568..07b87a4 100644 --- a/pkg/controllers/componentController_test.go +++ b/pkg/controllers/componentController_test.go @@ -2,8 +2,15 @@ package controllers import ( "context" + "testing" + "time" + + k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/release" "k8s.io/apimachinery/pkg/api/errors" @@ -11,46 +18,62 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "testing" - "time" ) +const testNamespace = "testtestNamespace" + func TestNewComponentReconciler(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockHelmClient := NewMockHelmClient(t) - mockRecorder := NewMockEventRecorder(t) + componentInterfaceMock := newMockComponentInterface(t) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + mockHelmClient := newMockHelmClient(t) + mockRecorder := newMockEventRecorder(t) // when - manager := NewComponentReconciler(mockComponentClient, mockHelmClient, mockRecorder) + manager := NewComponentReconciler(clientSetMock, mockHelmClient, mockRecorder, testNamespace) // then require.NotNil(t, manager) } func Test_componentReconciler_Reconcile(t *testing.T) { - namespace := "ecosystem" helmNamespace := "k8s" t.Run("success install", func(t *testing.T) { // given - component := getComponent(namespace, helmNamespace, "dogu-op", "0.1.0") - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(component, nil) - mockRecorder := NewMockEventRecorder(t) + component := getComponent(testNamespace, helmNamespace, "dogu-op", "0.1.0") + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + mockRecorder := newMockEventRecorder(t) mockRecorder.EXPECT().Event(component, "Normal", "Installation", "Installation successful") + manager := NewMockComponentManager(t) - manager.EXPECT().Install(context.TODO(), component).Return(nil) - helmClient := NewMockHelmClient(t) + manager.EXPECT().Install(testCtx, component).Return(nil) + helmClient := newMockHelmClient(t) + + mockRequeueHandler := newMockRequeueHandler(t) + mockRequeueHandler.EXPECT().Handle(testCtx, "Installation failed with component dogu-op", component, nil, mock.Anything).Return(reconcile.Result{}, nil) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, recorder: mockRecorder, componentManager: manager, helmClient: helmClient, + requeueHandler: mockRequeueHandler, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - result, err := sut.Reconcile(context.TODO(), req) + result, err := sut.Reconcile(testCtx, req) // then require.NoError(t, err) @@ -59,25 +82,37 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("success delete", func(t *testing.T) { // given - component := getComponent(namespace, helmNamespace, "dogu-op", "0.1.0") + component := getComponent(testNamespace, helmNamespace, "dogu-op", "0.1.0") component.DeletionTimestamp = &v1.Time{Time: time.Now()} - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(component, nil) - mockRecorder := NewMockEventRecorder(t) + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + mockRecorder := newMockEventRecorder(t) mockRecorder.EXPECT().Event(component, "Normal", "Deinstallation", "Deinstallation successful") + manager := NewMockComponentManager(t) - manager.EXPECT().Delete(context.TODO(), component).Return(nil) - helmClient := NewMockHelmClient(t) + manager.EXPECT().Delete(testCtx, component).Return(nil) + helmClient := newMockHelmClient(t) + + mockRequeueHandler := newMockRequeueHandler(t) + mockRequeueHandler.EXPECT().Handle(testCtx, "Deinstallation failed with component dogu-op", component, nil, mock.Anything).Return(reconcile.Result{}, nil) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, recorder: mockRecorder, componentManager: manager, helmClient: helmClient, + requeueHandler: mockRequeueHandler, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - result, err := sut.Reconcile(context.TODO(), req) + result, err := sut.Reconcile(testCtx, req) // then require.NoError(t, err) @@ -86,27 +121,40 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("success upgrade", func(t *testing.T) { // given - component := getComponent(namespace, helmNamespace, "dogu-op", "0.1.0") + component := getComponent(testNamespace, helmNamespace, "dogu-op", "0.1.0") component.Status.Status = "installed" - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(component, nil) - mockRecorder := NewMockEventRecorder(t) + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + mockRecorder := newMockEventRecorder(t) mockRecorder.EXPECT().Event(component, "Normal", "Upgrade", "Upgrade successful") + manager := NewMockComponentManager(t) - manager.EXPECT().Upgrade(context.TODO(), component).Return(nil) - helmClient := NewMockHelmClient(t) - helmReleases := []*release.Release{{Name: "dogu-op", Namespace: namespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.0.1"}}}} + manager.EXPECT().Upgrade(testCtx, component).Return(nil) + + helmClient := newMockHelmClient(t) + helmReleases := []*release.Release{{Name: "dogu-op", Namespace: testNamespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.0.1"}}}} helmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) + + mockRequeueHandler := newMockRequeueHandler(t) + mockRequeueHandler.EXPECT().Handle(testCtx, "Upgrade failed with component dogu-op", component, nil, mock.Anything).Return(reconcile.Result{}, nil) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, recorder: mockRecorder, componentManager: manager, helmClient: helmClient, + requeueHandler: mockRequeueHandler, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - result, err := sut.Reconcile(context.TODO(), req) + result, err := sut.Reconcile(testCtx, req) // then require.NoError(t, err) @@ -115,26 +163,34 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("should fail on downgrade", func(t *testing.T) { // given - component := getComponent(namespace, helmNamespace, "dogu-op", "0.1.0") + component := getComponent(testNamespace, helmNamespace, "dogu-op", "0.1.0") component.Status.Status = "installed" - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(component, nil) - mockRecorder := NewMockEventRecorder(t) + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + mockRecorder := newMockEventRecorder(t) mockRecorder.EXPECT().Event(component, "Warning", "Downgrade", "component downgrades are not allowed") + manager := NewMockComponentManager(t) - helmClient := NewMockHelmClient(t) - helmReleases := []*release.Release{{Name: "dogu-op", Namespace: namespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.2.0"}}}} + helmClient := newMockHelmClient(t) + helmReleases := []*release.Release{{Name: "dogu-op", Namespace: testNamespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.2.0"}}}} helmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, recorder: mockRecorder, componentManager: manager, helmClient: helmClient, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - _, err := sut.Reconcile(context.TODO(), req) + _, err := sut.Reconcile(testCtx, req) // then require.Error(t, err) @@ -143,25 +199,32 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("should ignore equal installed component", func(t *testing.T) { // given - component := getComponent(namespace, helmNamespace, "dogu-op", "0.1.0") + component := getComponent(testNamespace, helmNamespace, "dogu-op", "0.1.0") component.Status.Status = "installed" - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(component, nil) - mockRecorder := NewMockEventRecorder(t) + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + mockRecorder := newMockEventRecorder(t) manager := NewMockComponentManager(t) - helmClient := NewMockHelmClient(t) - helmReleases := []*release.Release{{Name: "dogu-op", Namespace: namespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.1.0"}}}} + helmClient := newMockHelmClient(t) + helmReleases := []*release.Release{{Name: "dogu-op", Namespace: testNamespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.1.0"}}}} helmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, recorder: mockRecorder, componentManager: manager, helmClient: helmClient, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - result, err := sut.Reconcile(context.TODO(), req) + result, err := sut.Reconcile(testCtx, req) // then require.NoError(t, err) @@ -170,15 +233,20 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("should fail on component get error", func(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(nil, assert.AnError) + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(nil, assert.AnError) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - _, err := sut.Reconcile(context.TODO(), req) + _, err := sut.Reconcile(testCtx, req) // then require.Error(t, err) @@ -187,15 +255,21 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("should return nil if the component is not found", func(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(nil, errors.NewNotFound(schema.GroupResource{}, "")) + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(nil, errors.NewNotFound(schema.GroupResource{}, "")) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - _, err := sut.Reconcile(context.TODO(), req) + _, err := sut.Reconcile(testCtx, req) // then require.NoError(t, err) @@ -203,21 +277,28 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("should fail on getting operation with invalid versions", func(t *testing.T) { // given - component := getComponent(namespace, helmNamespace, "dogu-op", "0.1.0") + component := getComponent(testNamespace, helmNamespace, "dogu-op", "0.1.0") component.Status.Status = "installed" - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(component, nil) - helmClient := NewMockHelmClient(t) - helmReleases := []*release.Release{{Name: "dogu-op", Namespace: namespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "invalidsemver"}}}} + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + helmClient := newMockHelmClient(t) + helmReleases := []*release.Release{{Name: "dogu-op", Namespace: testNamespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "invalidsemver"}}}} helmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) + sut := componentReconciler{ - componentClient: mockComponentClient, - helmClient: helmClient, + clientSet: clientSetMock, + helmClient: helmClient, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - _, err := sut.Reconcile(context.TODO(), req) + _, err := sut.Reconcile(testCtx, req) // then require.Error(t, err) @@ -226,25 +307,41 @@ func Test_componentReconciler_Reconcile(t *testing.T) { t.Run("should fail on error in operation", func(t *testing.T) { // given - component := getComponent(namespace, helmNamespace, "dogu-op", "0.1.0") + component := getComponent(testNamespace, helmNamespace, "dogu-op", "0.1.0") component.DeletionTimestamp = &v1.Time{Time: time.Now()} - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().Get(context.TODO(), "dogu-op", v1.GetOptions{}).Return(component, nil) - mockRecorder := NewMockEventRecorder(t) + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().Get(testCtx, "dogu-op", v1.GetOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + mockRecorder := newMockEventRecorder(t) mockRecorder.EXPECT().Event(component, "Warning", "Deinstallation", "Deinstallation failed. Reason: assert.AnError general error for testing") + mockRecorder.EXPECT().Eventf(component, "Warning", "Requeue", "Failed to requeue the %s.", "deinstallation").Return() + manager := NewMockComponentManager(t) - manager.EXPECT().Delete(context.TODO(), component).Return(assert.AnError) - helmClient := NewMockHelmClient(t) + manager.EXPECT().Delete(testCtx, component).Return(assert.AnError) + helmClient := newMockHelmClient(t) + + mockRequeueHandler := newMockRequeueHandler(t) + mockRequeueHandler.EXPECT().Handle(testCtx, "Deinstallation failed with component dogu-op", component, assert.AnError, mock.Anything). + RunAndReturn(func(_ context.Context, _ string, _ *k8sv1.Component, err error, _ func()) (reconcile.Result, error) { + return reconcile.Result{}, err + }) + sut := componentReconciler{ - componentClient: mockComponentClient, + clientSet: clientSetMock, recorder: mockRecorder, componentManager: manager, helmClient: helmClient, + requeueHandler: mockRequeueHandler, } - req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: "dogu-op"}} + req := reconcile.Request{NamespacedName: types.NamespacedName{Namespace: testNamespace, Name: "dogu-op"}} // when - _, err := sut.Reconcile(context.TODO(), req) + _, err := sut.Reconcile(testCtx, req) // then require.Error(t, err) @@ -256,7 +353,7 @@ func Test_componentReconciler_getChangeOperation(t *testing.T) { t.Run("should fail on error getting helm releases", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.1.0") - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) mockHelmClient.EXPECT().ListDeployedReleases().Return(nil, assert.AnError) sut := componentReconciler{ @@ -275,7 +372,7 @@ func Test_componentReconciler_getChangeOperation(t *testing.T) { t.Run("should fail on error parsing component version", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "notvalidsemver") - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) helmReleases := []*release.Release{{Name: "dogu-op", Namespace: "ecosystem", Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.0.1"}}}} mockHelmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) @@ -294,7 +391,7 @@ func Test_componentReconciler_getChangeOperation(t *testing.T) { t.Run("should return downgrade-operation on downgrade", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.0.0") - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) helmReleases := []*release.Release{{Name: "dogu-op", Namespace: "ecosystem", Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.0.1"}}}} mockHelmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) @@ -313,7 +410,7 @@ func Test_componentReconciler_getChangeOperation(t *testing.T) { t.Run("should return upgrade-operation on upgrade", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.0.2") - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) helmReleases := []*release.Release{{Name: "dogu-op", Namespace: "ecosystem", Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.0.1"}}}} mockHelmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) @@ -332,7 +429,7 @@ func Test_componentReconciler_getChangeOperation(t *testing.T) { t.Run("should return ignore-operation on same version", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.0.1") - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) helmReleases := []*release.Release{{Name: "dogu-op", Namespace: "ecosystem", Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.0.1"}}}} mockHelmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) @@ -351,7 +448,7 @@ func Test_componentReconciler_getChangeOperation(t *testing.T) { t.Run("should return ignore-operation when no release is found", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.0.1") - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) var helmReleases []*release.Release mockHelmClient.EXPECT().ListDeployedReleases().Return(helmReleases, nil) @@ -376,7 +473,7 @@ func Test_componentReconciler_evaluateRequiredOperation(t *testing.T) { sut := componentReconciler{} // when - requiredOperation, err := sut.evaluateRequiredOperation(context.TODO(), component) + requiredOperation, err := sut.evaluateRequiredOperation(testCtx, component) // then require.NoError(t, err) @@ -390,7 +487,7 @@ func Test_componentReconciler_evaluateRequiredOperation(t *testing.T) { sut := componentReconciler{} // when - requiredOperation, err := sut.evaluateRequiredOperation(context.TODO(), component) + requiredOperation, err := sut.evaluateRequiredOperation(testCtx, component) // then require.NoError(t, err) @@ -404,7 +501,7 @@ func Test_componentReconciler_evaluateRequiredOperation(t *testing.T) { sut := componentReconciler{} // when - requiredOperation, err := sut.evaluateRequiredOperation(context.TODO(), component) + requiredOperation, err := sut.evaluateRequiredOperation(testCtx, component) // then require.NoError(t, err) @@ -418,7 +515,7 @@ func Test_componentReconciler_evaluateRequiredOperation(t *testing.T) { sut := componentReconciler{} // when - requiredOperation, err := sut.evaluateRequiredOperation(context.TODO(), component) + requiredOperation, err := sut.evaluateRequiredOperation(testCtx, component) // then require.NoError(t, err) diff --git a/pkg/controllers/componentDeleteManager.go b/pkg/controllers/componentDeleteManager.go index 70e01f4..2dab0de 100644 --- a/pkg/controllers/componentDeleteManager.go +++ b/pkg/controllers/componentDeleteManager.go @@ -9,12 +9,12 @@ import ( // componentDeleteManager is a central unit in the process of handling the deletion process of a custom component resource. type componentDeleteManager struct { - componentClient ComponentClient - helmClient HelmClient + componentClient componentInterface + helmClient helmClient } // NewComponentDeleteManager creates a new instance of componentDeleteManager. -func NewComponentDeleteManager(componentClient ComponentClient, helmClient HelmClient) *componentDeleteManager { +func NewComponentDeleteManager(componentClient componentInterface, helmClient helmClient) *componentDeleteManager { return &componentDeleteManager{ componentClient: componentClient, helmClient: helmClient, diff --git a/pkg/controllers/componentDeleteManager_test.go b/pkg/controllers/componentDeleteManager_test.go index f5625f2..f1c7a57 100644 --- a/pkg/controllers/componentDeleteManager_test.go +++ b/pkg/controllers/componentDeleteManager_test.go @@ -11,8 +11,8 @@ import ( func TestNewComponentDeleteManager(t *testing.T) { t.Run("should create new componentDeleteManager", func(t *testing.T) { - mockComponentClient := NewMockComponentClient(t) - mockHelmClient := NewMockHelmClient(t) + mockComponentClient := newMockComponentInterface(t) + mockHelmClient := newMockHelmClient(t) manager := NewComponentDeleteManager(mockComponentClient, mockHelmClient) @@ -35,11 +35,11 @@ func Test_componentDeleteManager_Delete(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusDeleting(ctx, component).Return(component, nil) mockComponentClient.EXPECT().RemoveFinalizer(ctx, component, k8sv1.FinalizerName).Return(component, nil) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) mockHelmClient.EXPECT().Uninstall(component).Return(nil) mockHelmClient.EXPECT().ListDeployedReleases().Return([]*release.Release{{ Name: componentName, @@ -65,10 +65,10 @@ func Test_componentDeleteManager_Delete(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusDeleting(ctx, component).Return(component, assert.AnError) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) manager := &componentDeleteManager{ componentClient: mockComponentClient, @@ -92,10 +92,10 @@ func Test_componentDeleteManager_Delete(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusDeleting(ctx, component).Return(component, nil) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) mockHelmClient.EXPECT().Uninstall(component).Return(assert.AnError) mockHelmClient.EXPECT().ListDeployedReleases().Return([]*release.Release{{ Name: componentName, @@ -123,11 +123,11 @@ func Test_componentDeleteManager_Delete(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusDeleting(ctx, component).Return(component, nil) mockComponentClient.EXPECT().RemoveFinalizer(ctx, component, k8sv1.FinalizerName).Return(component, assert.AnError) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) mockHelmClient.EXPECT().Uninstall(component).Return(nil) mockHelmClient.EXPECT().ListDeployedReleases().Return([]*release.Release{{ Name: componentName, diff --git a/pkg/controllers/componentInstallManager.go b/pkg/controllers/componentInstallManager.go index e181ab1..bc788b0 100644 --- a/pkg/controllers/componentInstallManager.go +++ b/pkg/controllers/componentInstallManager.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" corev1 "k8s.io/api/core/v1" @@ -14,13 +13,13 @@ import ( // componentInstallManager is a central unit in the process of handling the installation process of a custom dogu resource. type componentInstallManager struct { - componentClient ecosystem.ComponentInterface - helmClient HelmClient + componentClient componentInterface + helmClient helmClient recorder record.EventRecorder } // NewComponentInstallManager creates a new instance of componentInstallManager. -func NewComponentInstallManager(componentClient ecosystem.ComponentInterface, helmClient HelmClient, recorder record.EventRecorder) *componentInstallManager { +func NewComponentInstallManager(componentClient componentInterface, helmClient helmClient, recorder record.EventRecorder) *componentInstallManager { return &componentInstallManager{ componentClient: componentClient, helmClient: helmClient, @@ -37,7 +36,7 @@ func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv if err != nil { cim.recorder.Eventf(component, corev1.EventTypeWarning, InstallEventReason, "One or more dependencies are not satisfied: %s", err.Error()) // TODO implement requeueable error with timing and state and return an error instance here instead - return err + return fmt.Errorf("one or more dependencies are not satisfied: %w", err) } component, err = cim.componentClient.UpdateStatusInstalling(ctx, component) diff --git a/pkg/controllers/componentInstallManager_test.go b/pkg/controllers/componentInstallManager_test.go index c820341..c7aa96d 100644 --- a/pkg/controllers/componentInstallManager_test.go +++ b/pkg/controllers/componentInstallManager_test.go @@ -1,10 +1,10 @@ package controllers import ( - "context" + "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "testing" ) func TestNewComponentInstallManager(t *testing.T) { @@ -21,13 +21,14 @@ func Test_componentInstallManager_Install(t *testing.T) { t.Run("success", func(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().UpdateStatusInstalling(context.TODO(), component).Return(component, nil) - mockComponentClient.EXPECT().UpdateStatusInstalled(context.TODO(), component).Return(component, nil) - mockComponentClient.EXPECT().AddFinalizer(context.TODO(), component, "component-finalizer").Return(component, nil) + mockComponentClient := newMockComponentInterface(t) + mockComponentClient.EXPECT().UpdateStatusInstalling(testCtx, component).Return(component, nil) + mockComponentClient.EXPECT().UpdateStatusInstalled(testCtx, component).Return(component, nil) + mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(component, nil) - mockHelmClient := NewMockHelmClient(t) - mockHelmClient.EXPECT().InstallOrUpgrade(context.TODO(), component).Return(nil) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().InstallOrUpgrade(testCtx, component).Return(nil) sut := componentInstallManager{ componentClient: mockComponentClient, @@ -35,18 +36,44 @@ func Test_componentInstallManager_Install(t *testing.T) { } // when - err := sut.Install(context.TODO(), component) + err := sut.Install(testCtx, component) // then require.NoError(t, err) }) + t.Run("dependency check failed", func(t *testing.T) { + // given + mockComponentClient := newMockComponentInterface(t) + + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(assert.AnError) + + mockRecorder := newMockEventRecorder(t) + mockRecorder.EXPECT().Eventf(component, "Warning", "Installation", "One or more dependencies are not satisfied: %s", assert.AnError.Error()).Return() + + sut := componentInstallManager{ + componentClient: mockComponentClient, + helmClient: mockHelmClient, + recorder: mockRecorder, + } + + // when + err := sut.Install(testCtx, component) + + // then + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + assert.ErrorContains(t, err, "one or more dependencies are not satisfied") + }) + t.Run("failed to update installing status", func(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().UpdateStatusInstalling(context.TODO(), component).Return(nil, assert.AnError) + mockComponentClient := newMockComponentInterface(t) + mockComponentClient.EXPECT().UpdateStatusInstalling(testCtx, component).Return(nil, assert.AnError) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) sut := componentInstallManager{ componentClient: mockComponentClient, @@ -54,7 +81,7 @@ func Test_componentInstallManager_Install(t *testing.T) { } // when - err := sut.Install(context.TODO(), component) + err := sut.Install(testCtx, component) // then require.Error(t, err) @@ -64,11 +91,12 @@ func Test_componentInstallManager_Install(t *testing.T) { t.Run("failed to add finalizer", func(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().UpdateStatusInstalling(context.TODO(), component).Return(component, nil) - mockComponentClient.EXPECT().AddFinalizer(context.TODO(), component, "component-finalizer").Return(nil, assert.AnError) + mockComponentClient := newMockComponentInterface(t) + mockComponentClient.EXPECT().UpdateStatusInstalling(testCtx, component).Return(component, nil) + mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(nil, assert.AnError) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) sut := componentInstallManager{ componentClient: mockComponentClient, @@ -76,7 +104,7 @@ func Test_componentInstallManager_Install(t *testing.T) { } // when - err := sut.Install(context.TODO(), component) + err := sut.Install(testCtx, component) // then require.Error(t, err) @@ -86,12 +114,13 @@ func Test_componentInstallManager_Install(t *testing.T) { t.Run("failed to install the chart", func(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().UpdateStatusInstalling(context.TODO(), component).Return(component, nil) - mockComponentClient.EXPECT().AddFinalizer(context.TODO(), component, "component-finalizer").Return(component, nil) + mockComponentClient := newMockComponentInterface(t) + mockComponentClient.EXPECT().UpdateStatusInstalling(testCtx, component).Return(component, nil) + mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(component, nil) - mockHelmClient := NewMockHelmClient(t) - mockHelmClient.EXPECT().InstallOrUpgrade(context.TODO(), component).Return(assert.AnError) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().InstallOrUpgrade(testCtx, component).Return(assert.AnError) sut := componentInstallManager{ componentClient: mockComponentClient, @@ -99,7 +128,7 @@ func Test_componentInstallManager_Install(t *testing.T) { } // when - err := sut.Install(context.TODO(), component) + err := sut.Install(testCtx, component) // then require.Error(t, err) @@ -109,13 +138,14 @@ func Test_componentInstallManager_Install(t *testing.T) { t.Run("failed set status installed", func(t *testing.T) { // given - mockComponentClient := NewMockComponentClient(t) - mockComponentClient.EXPECT().UpdateStatusInstalling(context.TODO(), component).Return(component, nil) - mockComponentClient.EXPECT().UpdateStatusInstalled(context.TODO(), component).Return(component, assert.AnError) - mockComponentClient.EXPECT().AddFinalizer(context.TODO(), component, "component-finalizer").Return(component, nil) + mockComponentClient := newMockComponentInterface(t) + mockComponentClient.EXPECT().UpdateStatusInstalling(testCtx, component).Return(component, nil) + mockComponentClient.EXPECT().UpdateStatusInstalled(testCtx, component).Return(component, assert.AnError) + mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(component, nil) - mockHelmClient := NewMockHelmClient(t) - mockHelmClient.EXPECT().InstallOrUpgrade(context.TODO(), component).Return(nil) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().InstallOrUpgrade(testCtx, component).Return(nil) sut := componentInstallManager{ componentClient: mockComponentClient, @@ -123,7 +153,7 @@ func Test_componentInstallManager_Install(t *testing.T) { } // when - err := sut.Install(context.TODO(), component) + err := sut.Install(testCtx, component) // then require.Error(t, err) diff --git a/pkg/controllers/componentUpgradeManager.go b/pkg/controllers/componentUpgradeManager.go index daf08e0..7320f62 100644 --- a/pkg/controllers/componentUpgradeManager.go +++ b/pkg/controllers/componentUpgradeManager.go @@ -13,13 +13,13 @@ import ( // componentUpgradeManager is a central unit in the process of handling the upgrade process of a custom component resource. type componentUpgradeManager struct { - componentClient ComponentClient - helmClient HelmClient + componentClient componentInterface + helmClient helmClient recorder record.EventRecorder } // NewComponentUpgradeManager creates a new instance of componentUpgradeManager. -func NewComponentUpgradeManager(componentClient ComponentClient, helmClient HelmClient, recorder record.EventRecorder) *componentUpgradeManager { +func NewComponentUpgradeManager(componentClient componentInterface, helmClient helmClient, recorder record.EventRecorder) *componentUpgradeManager { return &componentUpgradeManager{ componentClient: componentClient, helmClient: helmClient, diff --git a/pkg/controllers/componentUpgradeManager_test.go b/pkg/controllers/componentUpgradeManager_test.go index 035507a..d135506 100644 --- a/pkg/controllers/componentUpgradeManager_test.go +++ b/pkg/controllers/componentUpgradeManager_test.go @@ -10,8 +10,8 @@ import ( func TestNewComponentUpgradeManager(t *testing.T) { t.Run("should create new componentUpgradeManager", func(t *testing.T) { - mockComponentClient := NewMockComponentClient(t) - mockHelmClient := NewMockHelmClient(t) + mockComponentClient := newMockComponentInterface(t) + mockHelmClient := newMockHelmClient(t) manager := NewComponentUpgradeManager(mockComponentClient, mockHelmClient, nil) @@ -33,11 +33,12 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusUpgrading(ctx, component).Return(component, nil) mockComponentClient.EXPECT().UpdateStatusInstalled(ctx, component).Return(component, nil) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(ctx, component).Return(nil) manager := &componentUpgradeManager{ @@ -60,10 +61,11 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusUpgrading(ctx, component).Return(component, assert.AnError) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) manager := &componentUpgradeManager{ componentClient: mockComponentClient, @@ -86,10 +88,11 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusUpgrading(ctx, component).Return(component, nil) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(ctx, component).Return(assert.AnError) manager := &componentUpgradeManager{ @@ -113,11 +116,12 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { Status: k8sv1.ComponentStatus{Status: "installed"}, } - mockComponentClient := NewMockComponentClient(t) + mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusUpgrading(ctx, component).Return(component, nil) mockComponentClient.EXPECT().UpdateStatusInstalled(ctx, component).Return(component, assert.AnError) - mockHelmClient := NewMockHelmClient(t) + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(ctx, component).Return(nil) manager := &componentUpgradeManager{ diff --git a/pkg/controllers/component_manager.go b/pkg/controllers/component_manager.go index 9a93490..8f036aa 100644 --- a/pkg/controllers/component_manager.go +++ b/pkg/controllers/component_manager.go @@ -6,21 +6,20 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/record" - "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" ) // componentManager is a central unit in the process of handling component custom resources. // The componentManager creates, updates and deletes components. type componentManager struct { - installManager InstallManager - deleteManager DeleteManager - upgradeManager UpgradeManager - recorder EventRecorder + installManager installManager + deleteManager deleteManager + upgradeManager upgradeManager + recorder eventRecorder } // NewComponentManager creates a new instance of componentManager. -func NewComponentManager(clientset ecosystem.ComponentInterface, helmClient HelmClient, recorder record.EventRecorder) *componentManager { +func NewComponentManager(clientset componentInterface, helmClient helmClient, recorder record.EventRecorder) *componentManager { return &componentManager{ installManager: NewComponentInstallManager(clientset, helmClient, recorder), deleteManager: NewComponentDeleteManager(clientset, helmClient), diff --git a/pkg/controllers/component_manager_test.go b/pkg/controllers/component_manager_test.go index 5c007b4..d5659f2 100644 --- a/pkg/controllers/component_manager_test.go +++ b/pkg/controllers/component_manager_test.go @@ -22,9 +22,9 @@ func Test_componentManager_Install(t *testing.T) { t.Run("success", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.1.0") - installManagerMock := NewMockInstallManager(t) + installManagerMock := newMockInstallManager(t) installManagerMock.EXPECT().Install(context.TODO(), component).Return(nil) - eventRecorderMock := NewMockEventRecorder(t) + eventRecorderMock := newMockEventRecorder(t) eventRecorderMock.EXPECT().Event(component, "Normal", "Installation", "Starting installation...") sut := &componentManager{ @@ -44,9 +44,9 @@ func Test_componentManager_Upgrade(t *testing.T) { t.Run("success", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.1.0") - upgradeManagerMock := NewMockUpgradeManager(t) + upgradeManagerMock := newMockUpgradeManager(t) upgradeManagerMock.EXPECT().Upgrade(context.TODO(), component).Return(nil) - eventRecorderMock := NewMockEventRecorder(t) + eventRecorderMock := newMockEventRecorder(t) eventRecorderMock.EXPECT().Event(component, "Normal", "Upgrade", "Starting upgrade...") sut := &componentManager{ @@ -65,9 +65,9 @@ func Test_componentManager_Delete(t *testing.T) { t.Run("success", func(t *testing.T) { // given component := getComponent("ecosystem", "k8s", "dogu-op", "0.1.0") - deleteManagerMock := NewMockDeleteManager(t) + deleteManagerMock := newMockDeleteManager(t) deleteManagerMock.EXPECT().Delete(context.TODO(), component).Return(nil) - eventRecorderMock := NewMockEventRecorder(t) + eventRecorderMock := newMockEventRecorder(t) eventRecorderMock.EXPECT().Event(component, "Normal", "Deinstallation", "Starting deinstallation...") sut := &componentManager{ diff --git a/pkg/controllers/interfaces.go b/pkg/controllers/interfaces.go index e0b44ed..94804f4 100644 --- a/pkg/controllers/interfaces.go +++ b/pkg/controllers/interfaces.go @@ -2,35 +2,36 @@ package controllers import ( "context" + "time" "helm.sh/helm/v3/pkg/release" - "k8s.io/client-go/tools/record" + ctrl "sigs.k8s.io/controller-runtime" "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" ) -// InstallManager includes functionality to install components in the cluster. -type InstallManager interface { +// installManager includes functionality to install components in the cluster. +type installManager interface { // Install installs a component resource. Install(ctx context.Context, component *k8sv1.Component) error } -// DeleteManager includes functionality to delete components in the cluster. -type DeleteManager interface { +// deleteManager includes functionality to delete components in the cluster. +type deleteManager interface { // Delete deletes a component resource. Delete(ctx context.Context, component *k8sv1.Component) error } -// UpgradeManager includes functionality to upgrade components in the cluster. -type UpgradeManager interface { +// upgradeManager includes functionality to upgrade components in the cluster. +type upgradeManager interface { // Upgrade upgrades a component resource. Upgrade(ctx context.Context, component *k8sv1.Component) error } -// HelmClient is an interface for managing components with helm. -type HelmClient interface { +// helmClient is an interface for managing components with helm. +type helmClient interface { // InstallOrUpgrade takes a component and applies the corresponding helmChart. InstallOrUpgrade(ctx context.Context, component *k8sv1.Component) error // Uninstall removes the helmChart of the given component @@ -43,12 +44,27 @@ type HelmClient interface { SatisfiesDependencies(ctx context.Context, component *k8sv1.Component) error } -// ComponentClient embeds the ecosystem.ComponentInterface interface for usage in this package. -type ComponentClient interface { +// eventRecorder embeds the record.EventRecorder interface for usage in this package. +type eventRecorder interface { + record.EventRecorder +} + +type requeueHandler interface { + Handle(ctx context.Context, contextMessage string, componentResource *k8sv1.Component, originalErr error, onRequeue func()) (ctrl.Result, error) +} + +type componentEcosystemInterface interface { + ecosystem.ComponentEcosystemInterface +} + +type componentInterface interface { ecosystem.ComponentInterface } -// EventRecorder embeds the record.EventRecorder interface for usage in this package. -type EventRecorder interface { - record.EventRecorder +// requeuableError indicates that the current error requires the operator to requeue the dogu. +type requeuableError interface { + error + // GetRequeueTime return the time to wait before the next reconciliation. The constant ExponentialRequeueTime indicates + // that the requeue time increased exponentially. + GetRequeueTime() time.Duration } diff --git a/pkg/controllers/mock_ComponentClient_test.go b/pkg/controllers/mock_ComponentClient_test.go deleted file mode 100644 index 4690a71..0000000 --- a/pkg/controllers/mock_ComponentClient_test.go +++ /dev/null @@ -1,871 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package controllers - -import ( - context "context" - - mock "github.com/stretchr/testify/mock" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - types "k8s.io/apimachinery/pkg/types" - - v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" - - watch "k8s.io/apimachinery/pkg/watch" -) - -// MockComponentClient is an autogenerated mock type for the ComponentClient type -type MockComponentClient struct { - mock.Mock -} - -type MockComponentClient_Expecter struct { - mock *mock.Mock -} - -func (_m *MockComponentClient) EXPECT() *MockComponentClient_Expecter { - return &MockComponentClient_Expecter{mock: &_m.Mock} -} - -// AddFinalizer provides a mock function with given fields: ctx, component, finalizer -func (_m *MockComponentClient) AddFinalizer(ctx context.Context, component *v1.Component, finalizer string) (*v1.Component, error) { - ret := _m.Called(ctx, component, finalizer) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) (*v1.Component, error)); ok { - return rf(ctx, component, finalizer) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) *v1.Component); ok { - r0 = rf(ctx, component, finalizer) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, string) error); ok { - r1 = rf(ctx, component, finalizer) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_AddFinalizer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddFinalizer' -type MockComponentClient_AddFinalizer_Call struct { - *mock.Call -} - -// AddFinalizer is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -// - finalizer string -func (_e *MockComponentClient_Expecter) AddFinalizer(ctx interface{}, component interface{}, finalizer interface{}) *MockComponentClient_AddFinalizer_Call { - return &MockComponentClient_AddFinalizer_Call{Call: _e.mock.On("AddFinalizer", ctx, component, finalizer)} -} - -func (_c *MockComponentClient_AddFinalizer_Call) Run(run func(ctx context.Context, component *v1.Component, finalizer string)) *MockComponentClient_AddFinalizer_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component), args[2].(string)) - }) - return _c -} - -func (_c *MockComponentClient_AddFinalizer_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_AddFinalizer_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_AddFinalizer_Call) RunAndReturn(run func(context.Context, *v1.Component, string) (*v1.Component, error)) *MockComponentClient_AddFinalizer_Call { - _c.Call.Return(run) - return _c -} - -// Create provides a mock function with given fields: ctx, component, opts -func (_m *MockComponentClient) Create(ctx context.Context, component *v1.Component, opts metav1.CreateOptions) (*v1.Component, error) { - ret := _m.Called(ctx, component, opts) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.CreateOptions) (*v1.Component, error)); ok { - return rf(ctx, component, opts) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.CreateOptions) *v1.Component); ok { - r0 = rf(ctx, component, opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, metav1.CreateOptions) error); ok { - r1 = rf(ctx, component, opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_Create_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Create' -type MockComponentClient_Create_Call struct { - *mock.Call -} - -// Create is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -// - opts metav1.CreateOptions -func (_e *MockComponentClient_Expecter) Create(ctx interface{}, component interface{}, opts interface{}) *MockComponentClient_Create_Call { - return &MockComponentClient_Create_Call{Call: _e.mock.On("Create", ctx, component, opts)} -} - -func (_c *MockComponentClient_Create_Call) Run(run func(ctx context.Context, component *v1.Component, opts metav1.CreateOptions)) *MockComponentClient_Create_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component), args[2].(metav1.CreateOptions)) - }) - return _c -} - -func (_c *MockComponentClient_Create_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_Create_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_Create_Call) RunAndReturn(run func(context.Context, *v1.Component, metav1.CreateOptions) (*v1.Component, error)) *MockComponentClient_Create_Call { - _c.Call.Return(run) - return _c -} - -// Delete provides a mock function with given fields: ctx, name, opts -func (_m *MockComponentClient) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { - ret := _m.Called(ctx, name, opts) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, metav1.DeleteOptions) error); ok { - r0 = rf(ctx, name, opts) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockComponentClient_Delete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Delete' -type MockComponentClient_Delete_Call struct { - *mock.Call -} - -// Delete is a helper method to define mock.On call -// - ctx context.Context -// - name string -// - opts metav1.DeleteOptions -func (_e *MockComponentClient_Expecter) Delete(ctx interface{}, name interface{}, opts interface{}) *MockComponentClient_Delete_Call { - return &MockComponentClient_Delete_Call{Call: _e.mock.On("Delete", ctx, name, opts)} -} - -func (_c *MockComponentClient_Delete_Call) Run(run func(ctx context.Context, name string, opts metav1.DeleteOptions)) *MockComponentClient_Delete_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string), args[2].(metav1.DeleteOptions)) - }) - return _c -} - -func (_c *MockComponentClient_Delete_Call) Return(_a0 error) *MockComponentClient_Delete_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockComponentClient_Delete_Call) RunAndReturn(run func(context.Context, string, metav1.DeleteOptions) error) *MockComponentClient_Delete_Call { - _c.Call.Return(run) - return _c -} - -// DeleteCollection provides a mock function with given fields: ctx, opts, listOpts -func (_m *MockComponentClient) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { - ret := _m.Called(ctx, opts, listOpts) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, metav1.DeleteOptions, metav1.ListOptions) error); ok { - r0 = rf(ctx, opts, listOpts) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockComponentClient_DeleteCollection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteCollection' -type MockComponentClient_DeleteCollection_Call struct { - *mock.Call -} - -// DeleteCollection is a helper method to define mock.On call -// - ctx context.Context -// - opts metav1.DeleteOptions -// - listOpts metav1.ListOptions -func (_e *MockComponentClient_Expecter) DeleteCollection(ctx interface{}, opts interface{}, listOpts interface{}) *MockComponentClient_DeleteCollection_Call { - return &MockComponentClient_DeleteCollection_Call{Call: _e.mock.On("DeleteCollection", ctx, opts, listOpts)} -} - -func (_c *MockComponentClient_DeleteCollection_Call) Run(run func(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions)) *MockComponentClient_DeleteCollection_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(metav1.DeleteOptions), args[2].(metav1.ListOptions)) - }) - return _c -} - -func (_c *MockComponentClient_DeleteCollection_Call) Return(_a0 error) *MockComponentClient_DeleteCollection_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockComponentClient_DeleteCollection_Call) RunAndReturn(run func(context.Context, metav1.DeleteOptions, metav1.ListOptions) error) *MockComponentClient_DeleteCollection_Call { - _c.Call.Return(run) - return _c -} - -// Get provides a mock function with given fields: ctx, name, opts -func (_m *MockComponentClient) Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Component, error) { - ret := _m.Called(ctx, name, opts) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, string, metav1.GetOptions) (*v1.Component, error)); ok { - return rf(ctx, name, opts) - } - if rf, ok := ret.Get(0).(func(context.Context, string, metav1.GetOptions) *v1.Component); ok { - r0 = rf(ctx, name, opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, string, metav1.GetOptions) error); ok { - r1 = rf(ctx, name, opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' -type MockComponentClient_Get_Call struct { - *mock.Call -} - -// Get is a helper method to define mock.On call -// - ctx context.Context -// - name string -// - opts metav1.GetOptions -func (_e *MockComponentClient_Expecter) Get(ctx interface{}, name interface{}, opts interface{}) *MockComponentClient_Get_Call { - return &MockComponentClient_Get_Call{Call: _e.mock.On("Get", ctx, name, opts)} -} - -func (_c *MockComponentClient_Get_Call) Run(run func(ctx context.Context, name string, opts metav1.GetOptions)) *MockComponentClient_Get_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string), args[2].(metav1.GetOptions)) - }) - return _c -} - -func (_c *MockComponentClient_Get_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_Get_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_Get_Call) RunAndReturn(run func(context.Context, string, metav1.GetOptions) (*v1.Component, error)) *MockComponentClient_Get_Call { - _c.Call.Return(run) - return _c -} - -// List provides a mock function with given fields: ctx, opts -func (_m *MockComponentClient) List(ctx context.Context, opts metav1.ListOptions) (*v1.ComponentList, error) { - ret := _m.Called(ctx, opts) - - var r0 *v1.ComponentList - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) (*v1.ComponentList, error)); ok { - return rf(ctx, opts) - } - if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) *v1.ComponentList); ok { - r0 = rf(ctx, opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.ComponentList) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, metav1.ListOptions) error); ok { - r1 = rf(ctx, opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_List_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'List' -type MockComponentClient_List_Call struct { - *mock.Call -} - -// List is a helper method to define mock.On call -// - ctx context.Context -// - opts metav1.ListOptions -func (_e *MockComponentClient_Expecter) List(ctx interface{}, opts interface{}) *MockComponentClient_List_Call { - return &MockComponentClient_List_Call{Call: _e.mock.On("List", ctx, opts)} -} - -func (_c *MockComponentClient_List_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *MockComponentClient_List_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(metav1.ListOptions)) - }) - return _c -} - -func (_c *MockComponentClient_List_Call) Return(_a0 *v1.ComponentList, _a1 error) *MockComponentClient_List_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_List_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (*v1.ComponentList, error)) *MockComponentClient_List_Call { - _c.Call.Return(run) - return _c -} - -// Patch provides a mock function with given fields: ctx, name, pt, data, opts, subresources -func (_m *MockComponentClient) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*v1.Component, error) { - _va := make([]interface{}, len(subresources)) - for _i := range subresources { - _va[_i] = subresources[_i] - } - var _ca []interface{} - _ca = append(_ca, ctx, name, pt, data, opts) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) (*v1.Component, error)); ok { - return rf(ctx, name, pt, data, opts, subresources...) - } - if rf, ok := ret.Get(0).(func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) *v1.Component); ok { - r0 = rf(ctx, name, pt, data, opts, subresources...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) error); ok { - r1 = rf(ctx, name, pt, data, opts, subresources...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_Patch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Patch' -type MockComponentClient_Patch_Call struct { - *mock.Call -} - -// Patch is a helper method to define mock.On call -// - ctx context.Context -// - name string -// - pt types.PatchType -// - data []byte -// - opts metav1.PatchOptions -// - subresources ...string -func (_e *MockComponentClient_Expecter) Patch(ctx interface{}, name interface{}, pt interface{}, data interface{}, opts interface{}, subresources ...interface{}) *MockComponentClient_Patch_Call { - return &MockComponentClient_Patch_Call{Call: _e.mock.On("Patch", - append([]interface{}{ctx, name, pt, data, opts}, subresources...)...)} -} - -func (_c *MockComponentClient_Patch_Call) Run(run func(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string)) *MockComponentClient_Patch_Call { - _c.Call.Run(func(args mock.Arguments) { - variadicArgs := make([]string, len(args)-5) - for i, a := range args[5:] { - if a != nil { - variadicArgs[i] = a.(string) - } - } - run(args[0].(context.Context), args[1].(string), args[2].(types.PatchType), args[3].([]byte), args[4].(metav1.PatchOptions), variadicArgs...) - }) - return _c -} - -func (_c *MockComponentClient_Patch_Call) Return(result *v1.Component, err error) *MockComponentClient_Patch_Call { - _c.Call.Return(result, err) - return _c -} - -func (_c *MockComponentClient_Patch_Call) RunAndReturn(run func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) (*v1.Component, error)) *MockComponentClient_Patch_Call { - _c.Call.Return(run) - return _c -} - -// RemoveFinalizer provides a mock function with given fields: ctx, component, finalizer -func (_m *MockComponentClient) RemoveFinalizer(ctx context.Context, component *v1.Component, finalizer string) (*v1.Component, error) { - ret := _m.Called(ctx, component, finalizer) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) (*v1.Component, error)); ok { - return rf(ctx, component, finalizer) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) *v1.Component); ok { - r0 = rf(ctx, component, finalizer) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, string) error); ok { - r1 = rf(ctx, component, finalizer) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_RemoveFinalizer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RemoveFinalizer' -type MockComponentClient_RemoveFinalizer_Call struct { - *mock.Call -} - -// RemoveFinalizer is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -// - finalizer string -func (_e *MockComponentClient_Expecter) RemoveFinalizer(ctx interface{}, component interface{}, finalizer interface{}) *MockComponentClient_RemoveFinalizer_Call { - return &MockComponentClient_RemoveFinalizer_Call{Call: _e.mock.On("RemoveFinalizer", ctx, component, finalizer)} -} - -func (_c *MockComponentClient_RemoveFinalizer_Call) Run(run func(ctx context.Context, component *v1.Component, finalizer string)) *MockComponentClient_RemoveFinalizer_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component), args[2].(string)) - }) - return _c -} - -func (_c *MockComponentClient_RemoveFinalizer_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_RemoveFinalizer_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_RemoveFinalizer_Call) RunAndReturn(run func(context.Context, *v1.Component, string) (*v1.Component, error)) *MockComponentClient_RemoveFinalizer_Call { - _c.Call.Return(run) - return _c -} - -// Update provides a mock function with given fields: ctx, component, opts -func (_m *MockComponentClient) Update(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions) (*v1.Component, error) { - ret := _m.Called(ctx, component, opts) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)); ok { - return rf(ctx, component, opts) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) *v1.Component); ok { - r0 = rf(ctx, component, opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, metav1.UpdateOptions) error); ok { - r1 = rf(ctx, component, opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_Update_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Update' -type MockComponentClient_Update_Call struct { - *mock.Call -} - -// Update is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -// - opts metav1.UpdateOptions -func (_e *MockComponentClient_Expecter) Update(ctx interface{}, component interface{}, opts interface{}) *MockComponentClient_Update_Call { - return &MockComponentClient_Update_Call{Call: _e.mock.On("Update", ctx, component, opts)} -} - -func (_c *MockComponentClient_Update_Call) Run(run func(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions)) *MockComponentClient_Update_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component), args[2].(metav1.UpdateOptions)) - }) - return _c -} - -func (_c *MockComponentClient_Update_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_Update_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_Update_Call) RunAndReturn(run func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)) *MockComponentClient_Update_Call { - _c.Call.Return(run) - return _c -} - -// UpdateStatus provides a mock function with given fields: ctx, component, opts -func (_m *MockComponentClient) UpdateStatus(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions) (*v1.Component, error) { - ret := _m.Called(ctx, component, opts) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)); ok { - return rf(ctx, component, opts) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) *v1.Component); ok { - r0 = rf(ctx, component, opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, metav1.UpdateOptions) error); ok { - r1 = rf(ctx, component, opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_UpdateStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatus' -type MockComponentClient_UpdateStatus_Call struct { - *mock.Call -} - -// UpdateStatus is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -// - opts metav1.UpdateOptions -func (_e *MockComponentClient_Expecter) UpdateStatus(ctx interface{}, component interface{}, opts interface{}) *MockComponentClient_UpdateStatus_Call { - return &MockComponentClient_UpdateStatus_Call{Call: _e.mock.On("UpdateStatus", ctx, component, opts)} -} - -func (_c *MockComponentClient_UpdateStatus_Call) Run(run func(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions)) *MockComponentClient_UpdateStatus_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component), args[2].(metav1.UpdateOptions)) - }) - return _c -} - -func (_c *MockComponentClient_UpdateStatus_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_UpdateStatus_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_UpdateStatus_Call) RunAndReturn(run func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)) *MockComponentClient_UpdateStatus_Call { - _c.Call.Return(run) - return _c -} - -// UpdateStatusDeleting provides a mock function with given fields: ctx, component -func (_m *MockComponentClient) UpdateStatusDeleting(ctx context.Context, component *v1.Component) (*v1.Component, error) { - ret := _m.Called(ctx, component) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { - return rf(ctx, component) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { - r0 = rf(ctx, component) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { - r1 = rf(ctx, component) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_UpdateStatusDeleting_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusDeleting' -type MockComponentClient_UpdateStatusDeleting_Call struct { - *mock.Call -} - -// UpdateStatusDeleting is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -func (_e *MockComponentClient_Expecter) UpdateStatusDeleting(ctx interface{}, component interface{}) *MockComponentClient_UpdateStatusDeleting_Call { - return &MockComponentClient_UpdateStatusDeleting_Call{Call: _e.mock.On("UpdateStatusDeleting", ctx, component)} -} - -func (_c *MockComponentClient_UpdateStatusDeleting_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockComponentClient_UpdateStatusDeleting_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component)) - }) - return _c -} - -func (_c *MockComponentClient_UpdateStatusDeleting_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_UpdateStatusDeleting_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_UpdateStatusDeleting_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *MockComponentClient_UpdateStatusDeleting_Call { - _c.Call.Return(run) - return _c -} - -// UpdateStatusInstalled provides a mock function with given fields: ctx, component -func (_m *MockComponentClient) UpdateStatusInstalled(ctx context.Context, component *v1.Component) (*v1.Component, error) { - ret := _m.Called(ctx, component) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { - return rf(ctx, component) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { - r0 = rf(ctx, component) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { - r1 = rf(ctx, component) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_UpdateStatusInstalled_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusInstalled' -type MockComponentClient_UpdateStatusInstalled_Call struct { - *mock.Call -} - -// UpdateStatusInstalled is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -func (_e *MockComponentClient_Expecter) UpdateStatusInstalled(ctx interface{}, component interface{}) *MockComponentClient_UpdateStatusInstalled_Call { - return &MockComponentClient_UpdateStatusInstalled_Call{Call: _e.mock.On("UpdateStatusInstalled", ctx, component)} -} - -func (_c *MockComponentClient_UpdateStatusInstalled_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockComponentClient_UpdateStatusInstalled_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component)) - }) - return _c -} - -func (_c *MockComponentClient_UpdateStatusInstalled_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_UpdateStatusInstalled_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_UpdateStatusInstalled_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *MockComponentClient_UpdateStatusInstalled_Call { - _c.Call.Return(run) - return _c -} - -// UpdateStatusInstalling provides a mock function with given fields: ctx, component -func (_m *MockComponentClient) UpdateStatusInstalling(ctx context.Context, component *v1.Component) (*v1.Component, error) { - ret := _m.Called(ctx, component) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { - return rf(ctx, component) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { - r0 = rf(ctx, component) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { - r1 = rf(ctx, component) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_UpdateStatusInstalling_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusInstalling' -type MockComponentClient_UpdateStatusInstalling_Call struct { - *mock.Call -} - -// UpdateStatusInstalling is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -func (_e *MockComponentClient_Expecter) UpdateStatusInstalling(ctx interface{}, component interface{}) *MockComponentClient_UpdateStatusInstalling_Call { - return &MockComponentClient_UpdateStatusInstalling_Call{Call: _e.mock.On("UpdateStatusInstalling", ctx, component)} -} - -func (_c *MockComponentClient_UpdateStatusInstalling_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockComponentClient_UpdateStatusInstalling_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component)) - }) - return _c -} - -func (_c *MockComponentClient_UpdateStatusInstalling_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_UpdateStatusInstalling_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_UpdateStatusInstalling_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *MockComponentClient_UpdateStatusInstalling_Call { - _c.Call.Return(run) - return _c -} - -// UpdateStatusUpgrading provides a mock function with given fields: ctx, component -func (_m *MockComponentClient) UpdateStatusUpgrading(ctx context.Context, component *v1.Component) (*v1.Component, error) { - ret := _m.Called(ctx, component) - - var r0 *v1.Component - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { - return rf(ctx, component) - } - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { - r0 = rf(ctx, component) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*v1.Component) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { - r1 = rf(ctx, component) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_UpdateStatusUpgrading_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusUpgrading' -type MockComponentClient_UpdateStatusUpgrading_Call struct { - *mock.Call -} - -// UpdateStatusUpgrading is a helper method to define mock.On call -// - ctx context.Context -// - component *v1.Component -func (_e *MockComponentClient_Expecter) UpdateStatusUpgrading(ctx interface{}, component interface{}) *MockComponentClient_UpdateStatusUpgrading_Call { - return &MockComponentClient_UpdateStatusUpgrading_Call{Call: _e.mock.On("UpdateStatusUpgrading", ctx, component)} -} - -func (_c *MockComponentClient_UpdateStatusUpgrading_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockComponentClient_UpdateStatusUpgrading_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component)) - }) - return _c -} - -func (_c *MockComponentClient_UpdateStatusUpgrading_Call) Return(_a0 *v1.Component, _a1 error) *MockComponentClient_UpdateStatusUpgrading_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_UpdateStatusUpgrading_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *MockComponentClient_UpdateStatusUpgrading_Call { - _c.Call.Return(run) - return _c -} - -// Watch provides a mock function with given fields: ctx, opts -func (_m *MockComponentClient) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { - ret := _m.Called(ctx, opts) - - var r0 watch.Interface - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) (watch.Interface, error)); ok { - return rf(ctx, opts) - } - if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) watch.Interface); ok { - r0 = rf(ctx, opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(watch.Interface) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, metav1.ListOptions) error); ok { - r1 = rf(ctx, opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockComponentClient_Watch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Watch' -type MockComponentClient_Watch_Call struct { - *mock.Call -} - -// Watch is a helper method to define mock.On call -// - ctx context.Context -// - opts metav1.ListOptions -func (_e *MockComponentClient_Expecter) Watch(ctx interface{}, opts interface{}) *MockComponentClient_Watch_Call { - return &MockComponentClient_Watch_Call{Call: _e.mock.On("Watch", ctx, opts)} -} - -func (_c *MockComponentClient_Watch_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *MockComponentClient_Watch_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(metav1.ListOptions)) - }) - return _c -} - -func (_c *MockComponentClient_Watch_Call) Return(_a0 watch.Interface, _a1 error) *MockComponentClient_Watch_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockComponentClient_Watch_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (watch.Interface, error)) *MockComponentClient_Watch_Call { - _c.Call.Return(run) - return _c -} - -type mockConstructorTestingTNewMockComponentClient interface { - mock.TestingT - Cleanup(func()) -} - -// NewMockComponentClient creates a new instance of MockComponentClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockComponentClient(t mockConstructorTestingTNewMockComponentClient) *MockComponentClient { - mock := &MockComponentClient{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/pkg/controllers/mock_componentEcosystemInterface_test.go b/pkg/controllers/mock_componentEcosystemInterface_test.go new file mode 100644 index 0000000..a30373c --- /dev/null +++ b/pkg/controllers/mock_componentEcosystemInterface_test.go @@ -0,0 +1,2374 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package controllers + +import ( + apiserverinternalv1alpha1 "k8s.io/client-go/kubernetes/typed/apiserverinternal/v1alpha1" + appsv1 "k8s.io/client-go/kubernetes/typed/apps/v1" + + appsv1beta1 "k8s.io/client-go/kubernetes/typed/apps/v1beta1" + + authenticationv1 "k8s.io/client-go/kubernetes/typed/authentication/v1" + + authenticationv1alpha1 "k8s.io/client-go/kubernetes/typed/authentication/v1alpha1" + + authenticationv1beta1 "k8s.io/client-go/kubernetes/typed/authentication/v1beta1" + + authorizationv1 "k8s.io/client-go/kubernetes/typed/authorization/v1" + + authorizationv1beta1 "k8s.io/client-go/kubernetes/typed/authorization/v1beta1" + + autoscalingv1 "k8s.io/client-go/kubernetes/typed/autoscaling/v1" + + batchv1 "k8s.io/client-go/kubernetes/typed/batch/v1" + + batchv1beta1 "k8s.io/client-go/kubernetes/typed/batch/v1beta1" + + certificatesv1 "k8s.io/client-go/kubernetes/typed/certificates/v1" + + certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" + + coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1" + + coordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1" + + corev1 "k8s.io/client-go/kubernetes/typed/core/v1" + + discovery "k8s.io/client-go/discovery" + + discoveryv1 "k8s.io/client-go/kubernetes/typed/discovery/v1" + + discoveryv1beta1 "k8s.io/client-go/kubernetes/typed/discovery/v1beta1" + + ecosystem "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" + + eventsv1 "k8s.io/client-go/kubernetes/typed/events/v1" + + eventsv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1" + + extensionsv1beta1 "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" + + flowcontrolv1alpha1 "k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1" + + flowcontrolv1beta1 "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta1" + + flowcontrolv1beta2 "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta2" + + mock "github.com/stretchr/testify/mock" + + networkingv1 "k8s.io/client-go/kubernetes/typed/networking/v1" + + networkingv1alpha1 "k8s.io/client-go/kubernetes/typed/networking/v1alpha1" + + networkingv1beta1 "k8s.io/client-go/kubernetes/typed/networking/v1beta1" + + nodev1 "k8s.io/client-go/kubernetes/typed/node/v1" + + nodev1alpha1 "k8s.io/client-go/kubernetes/typed/node/v1alpha1" + + nodev1beta1 "k8s.io/client-go/kubernetes/typed/node/v1beta1" + + policyv1 "k8s.io/client-go/kubernetes/typed/policy/v1" + + policyv1beta1 "k8s.io/client-go/kubernetes/typed/policy/v1beta1" + + rbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" + + rbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1" + + rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1" + + resourcev1alpha1 "k8s.io/client-go/kubernetes/typed/resource/v1alpha1" + + schedulingv1 "k8s.io/client-go/kubernetes/typed/scheduling/v1" + + schedulingv1alpha1 "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1" + + schedulingv1beta1 "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1" + + storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1" + + storagev1alpha1 "k8s.io/client-go/kubernetes/typed/storage/v1alpha1" + + storagev1beta1 "k8s.io/client-go/kubernetes/typed/storage/v1beta1" + + v1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1" + + v1alpha1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1" + + v1beta1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1" + + v1beta2 "k8s.io/client-go/kubernetes/typed/apps/v1beta2" + + v1beta3 "k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3" + + v2 "k8s.io/client-go/kubernetes/typed/autoscaling/v2" + + v2beta1 "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1" + + v2beta2 "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2" +) + +// mockComponentEcosystemInterface is an autogenerated mock type for the componentEcosystemInterface type +type mockComponentEcosystemInterface struct { + mock.Mock +} + +type mockComponentEcosystemInterface_Expecter struct { + mock *mock.Mock +} + +func (_m *mockComponentEcosystemInterface) EXPECT() *mockComponentEcosystemInterface_Expecter { + return &mockComponentEcosystemInterface_Expecter{mock: &_m.Mock} +} + +// AdmissionregistrationV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AdmissionregistrationV1() v1.AdmissionregistrationV1Interface { + ret := _m.Called() + + var r0 v1.AdmissionregistrationV1Interface + if rf, ok := ret.Get(0).(func() v1.AdmissionregistrationV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v1.AdmissionregistrationV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AdmissionregistrationV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AdmissionregistrationV1' +type mockComponentEcosystemInterface_AdmissionregistrationV1_Call struct { + *mock.Call +} + +// AdmissionregistrationV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AdmissionregistrationV1() *mockComponentEcosystemInterface_AdmissionregistrationV1_Call { + return &mockComponentEcosystemInterface_AdmissionregistrationV1_Call{Call: _e.mock.On("AdmissionregistrationV1")} +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1_Call) Run(run func()) *mockComponentEcosystemInterface_AdmissionregistrationV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1_Call) Return(_a0 v1.AdmissionregistrationV1Interface) *mockComponentEcosystemInterface_AdmissionregistrationV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1_Call) RunAndReturn(run func() v1.AdmissionregistrationV1Interface) *mockComponentEcosystemInterface_AdmissionregistrationV1_Call { + _c.Call.Return(run) + return _c +} + +// AdmissionregistrationV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AdmissionregistrationV1alpha1() v1alpha1.AdmissionregistrationV1alpha1Interface { + ret := _m.Called() + + var r0 v1alpha1.AdmissionregistrationV1alpha1Interface + if rf, ok := ret.Get(0).(func() v1alpha1.AdmissionregistrationV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v1alpha1.AdmissionregistrationV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AdmissionregistrationV1alpha1' +type mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call struct { + *mock.Call +} + +// AdmissionregistrationV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AdmissionregistrationV1alpha1() *mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call { + return &mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call{Call: _e.mock.On("AdmissionregistrationV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call) Return(_a0 v1alpha1.AdmissionregistrationV1alpha1Interface) *mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call) RunAndReturn(run func() v1alpha1.AdmissionregistrationV1alpha1Interface) *mockComponentEcosystemInterface_AdmissionregistrationV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// AdmissionregistrationV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AdmissionregistrationV1beta1() v1beta1.AdmissionregistrationV1beta1Interface { + ret := _m.Called() + + var r0 v1beta1.AdmissionregistrationV1beta1Interface + if rf, ok := ret.Get(0).(func() v1beta1.AdmissionregistrationV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v1beta1.AdmissionregistrationV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AdmissionregistrationV1beta1' +type mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call struct { + *mock.Call +} + +// AdmissionregistrationV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AdmissionregistrationV1beta1() *mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call { + return &mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call{Call: _e.mock.On("AdmissionregistrationV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call) Return(_a0 v1beta1.AdmissionregistrationV1beta1Interface) *mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call) RunAndReturn(run func() v1beta1.AdmissionregistrationV1beta1Interface) *mockComponentEcosystemInterface_AdmissionregistrationV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// AppsV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AppsV1() appsv1.AppsV1Interface { + ret := _m.Called() + + var r0 appsv1.AppsV1Interface + if rf, ok := ret.Get(0).(func() appsv1.AppsV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(appsv1.AppsV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AppsV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppsV1' +type mockComponentEcosystemInterface_AppsV1_Call struct { + *mock.Call +} + +// AppsV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AppsV1() *mockComponentEcosystemInterface_AppsV1_Call { + return &mockComponentEcosystemInterface_AppsV1_Call{Call: _e.mock.On("AppsV1")} +} + +func (_c *mockComponentEcosystemInterface_AppsV1_Call) Run(run func()) *mockComponentEcosystemInterface_AppsV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AppsV1_Call) Return(_a0 appsv1.AppsV1Interface) *mockComponentEcosystemInterface_AppsV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AppsV1_Call) RunAndReturn(run func() appsv1.AppsV1Interface) *mockComponentEcosystemInterface_AppsV1_Call { + _c.Call.Return(run) + return _c +} + +// AppsV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AppsV1beta1() appsv1beta1.AppsV1beta1Interface { + ret := _m.Called() + + var r0 appsv1beta1.AppsV1beta1Interface + if rf, ok := ret.Get(0).(func() appsv1beta1.AppsV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(appsv1beta1.AppsV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AppsV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppsV1beta1' +type mockComponentEcosystemInterface_AppsV1beta1_Call struct { + *mock.Call +} + +// AppsV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AppsV1beta1() *mockComponentEcosystemInterface_AppsV1beta1_Call { + return &mockComponentEcosystemInterface_AppsV1beta1_Call{Call: _e.mock.On("AppsV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_AppsV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_AppsV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AppsV1beta1_Call) Return(_a0 appsv1beta1.AppsV1beta1Interface) *mockComponentEcosystemInterface_AppsV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AppsV1beta1_Call) RunAndReturn(run func() appsv1beta1.AppsV1beta1Interface) *mockComponentEcosystemInterface_AppsV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// AppsV1beta2 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AppsV1beta2() v1beta2.AppsV1beta2Interface { + ret := _m.Called() + + var r0 v1beta2.AppsV1beta2Interface + if rf, ok := ret.Get(0).(func() v1beta2.AppsV1beta2Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v1beta2.AppsV1beta2Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AppsV1beta2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppsV1beta2' +type mockComponentEcosystemInterface_AppsV1beta2_Call struct { + *mock.Call +} + +// AppsV1beta2 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AppsV1beta2() *mockComponentEcosystemInterface_AppsV1beta2_Call { + return &mockComponentEcosystemInterface_AppsV1beta2_Call{Call: _e.mock.On("AppsV1beta2")} +} + +func (_c *mockComponentEcosystemInterface_AppsV1beta2_Call) Run(run func()) *mockComponentEcosystemInterface_AppsV1beta2_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AppsV1beta2_Call) Return(_a0 v1beta2.AppsV1beta2Interface) *mockComponentEcosystemInterface_AppsV1beta2_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AppsV1beta2_Call) RunAndReturn(run func() v1beta2.AppsV1beta2Interface) *mockComponentEcosystemInterface_AppsV1beta2_Call { + _c.Call.Return(run) + return _c +} + +// AuthenticationV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AuthenticationV1() authenticationv1.AuthenticationV1Interface { + ret := _m.Called() + + var r0 authenticationv1.AuthenticationV1Interface + if rf, ok := ret.Get(0).(func() authenticationv1.AuthenticationV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(authenticationv1.AuthenticationV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AuthenticationV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AuthenticationV1' +type mockComponentEcosystemInterface_AuthenticationV1_Call struct { + *mock.Call +} + +// AuthenticationV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AuthenticationV1() *mockComponentEcosystemInterface_AuthenticationV1_Call { + return &mockComponentEcosystemInterface_AuthenticationV1_Call{Call: _e.mock.On("AuthenticationV1")} +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1_Call) Run(run func()) *mockComponentEcosystemInterface_AuthenticationV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1_Call) Return(_a0 authenticationv1.AuthenticationV1Interface) *mockComponentEcosystemInterface_AuthenticationV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1_Call) RunAndReturn(run func() authenticationv1.AuthenticationV1Interface) *mockComponentEcosystemInterface_AuthenticationV1_Call { + _c.Call.Return(run) + return _c +} + +// AuthenticationV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AuthenticationV1alpha1() authenticationv1alpha1.AuthenticationV1alpha1Interface { + ret := _m.Called() + + var r0 authenticationv1alpha1.AuthenticationV1alpha1Interface + if rf, ok := ret.Get(0).(func() authenticationv1alpha1.AuthenticationV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(authenticationv1alpha1.AuthenticationV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AuthenticationV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AuthenticationV1alpha1' +type mockComponentEcosystemInterface_AuthenticationV1alpha1_Call struct { + *mock.Call +} + +// AuthenticationV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AuthenticationV1alpha1() *mockComponentEcosystemInterface_AuthenticationV1alpha1_Call { + return &mockComponentEcosystemInterface_AuthenticationV1alpha1_Call{Call: _e.mock.On("AuthenticationV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_AuthenticationV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1alpha1_Call) Return(_a0 authenticationv1alpha1.AuthenticationV1alpha1Interface) *mockComponentEcosystemInterface_AuthenticationV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1alpha1_Call) RunAndReturn(run func() authenticationv1alpha1.AuthenticationV1alpha1Interface) *mockComponentEcosystemInterface_AuthenticationV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// AuthenticationV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AuthenticationV1beta1() authenticationv1beta1.AuthenticationV1beta1Interface { + ret := _m.Called() + + var r0 authenticationv1beta1.AuthenticationV1beta1Interface + if rf, ok := ret.Get(0).(func() authenticationv1beta1.AuthenticationV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(authenticationv1beta1.AuthenticationV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AuthenticationV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AuthenticationV1beta1' +type mockComponentEcosystemInterface_AuthenticationV1beta1_Call struct { + *mock.Call +} + +// AuthenticationV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AuthenticationV1beta1() *mockComponentEcosystemInterface_AuthenticationV1beta1_Call { + return &mockComponentEcosystemInterface_AuthenticationV1beta1_Call{Call: _e.mock.On("AuthenticationV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_AuthenticationV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1beta1_Call) Return(_a0 authenticationv1beta1.AuthenticationV1beta1Interface) *mockComponentEcosystemInterface_AuthenticationV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthenticationV1beta1_Call) RunAndReturn(run func() authenticationv1beta1.AuthenticationV1beta1Interface) *mockComponentEcosystemInterface_AuthenticationV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// AuthorizationV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AuthorizationV1() authorizationv1.AuthorizationV1Interface { + ret := _m.Called() + + var r0 authorizationv1.AuthorizationV1Interface + if rf, ok := ret.Get(0).(func() authorizationv1.AuthorizationV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(authorizationv1.AuthorizationV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AuthorizationV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AuthorizationV1' +type mockComponentEcosystemInterface_AuthorizationV1_Call struct { + *mock.Call +} + +// AuthorizationV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AuthorizationV1() *mockComponentEcosystemInterface_AuthorizationV1_Call { + return &mockComponentEcosystemInterface_AuthorizationV1_Call{Call: _e.mock.On("AuthorizationV1")} +} + +func (_c *mockComponentEcosystemInterface_AuthorizationV1_Call) Run(run func()) *mockComponentEcosystemInterface_AuthorizationV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthorizationV1_Call) Return(_a0 authorizationv1.AuthorizationV1Interface) *mockComponentEcosystemInterface_AuthorizationV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthorizationV1_Call) RunAndReturn(run func() authorizationv1.AuthorizationV1Interface) *mockComponentEcosystemInterface_AuthorizationV1_Call { + _c.Call.Return(run) + return _c +} + +// AuthorizationV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AuthorizationV1beta1() authorizationv1beta1.AuthorizationV1beta1Interface { + ret := _m.Called() + + var r0 authorizationv1beta1.AuthorizationV1beta1Interface + if rf, ok := ret.Get(0).(func() authorizationv1beta1.AuthorizationV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(authorizationv1beta1.AuthorizationV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AuthorizationV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AuthorizationV1beta1' +type mockComponentEcosystemInterface_AuthorizationV1beta1_Call struct { + *mock.Call +} + +// AuthorizationV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AuthorizationV1beta1() *mockComponentEcosystemInterface_AuthorizationV1beta1_Call { + return &mockComponentEcosystemInterface_AuthorizationV1beta1_Call{Call: _e.mock.On("AuthorizationV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_AuthorizationV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_AuthorizationV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthorizationV1beta1_Call) Return(_a0 authorizationv1beta1.AuthorizationV1beta1Interface) *mockComponentEcosystemInterface_AuthorizationV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AuthorizationV1beta1_Call) RunAndReturn(run func() authorizationv1beta1.AuthorizationV1beta1Interface) *mockComponentEcosystemInterface_AuthorizationV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// AutoscalingV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AutoscalingV1() autoscalingv1.AutoscalingV1Interface { + ret := _m.Called() + + var r0 autoscalingv1.AutoscalingV1Interface + if rf, ok := ret.Get(0).(func() autoscalingv1.AutoscalingV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(autoscalingv1.AutoscalingV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AutoscalingV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AutoscalingV1' +type mockComponentEcosystemInterface_AutoscalingV1_Call struct { + *mock.Call +} + +// AutoscalingV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AutoscalingV1() *mockComponentEcosystemInterface_AutoscalingV1_Call { + return &mockComponentEcosystemInterface_AutoscalingV1_Call{Call: _e.mock.On("AutoscalingV1")} +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV1_Call) Run(run func()) *mockComponentEcosystemInterface_AutoscalingV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV1_Call) Return(_a0 autoscalingv1.AutoscalingV1Interface) *mockComponentEcosystemInterface_AutoscalingV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV1_Call) RunAndReturn(run func() autoscalingv1.AutoscalingV1Interface) *mockComponentEcosystemInterface_AutoscalingV1_Call { + _c.Call.Return(run) + return _c +} + +// AutoscalingV2 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AutoscalingV2() v2.AutoscalingV2Interface { + ret := _m.Called() + + var r0 v2.AutoscalingV2Interface + if rf, ok := ret.Get(0).(func() v2.AutoscalingV2Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v2.AutoscalingV2Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AutoscalingV2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AutoscalingV2' +type mockComponentEcosystemInterface_AutoscalingV2_Call struct { + *mock.Call +} + +// AutoscalingV2 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AutoscalingV2() *mockComponentEcosystemInterface_AutoscalingV2_Call { + return &mockComponentEcosystemInterface_AutoscalingV2_Call{Call: _e.mock.On("AutoscalingV2")} +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2_Call) Run(run func()) *mockComponentEcosystemInterface_AutoscalingV2_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2_Call) Return(_a0 v2.AutoscalingV2Interface) *mockComponentEcosystemInterface_AutoscalingV2_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2_Call) RunAndReturn(run func() v2.AutoscalingV2Interface) *mockComponentEcosystemInterface_AutoscalingV2_Call { + _c.Call.Return(run) + return _c +} + +// AutoscalingV2beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AutoscalingV2beta1() v2beta1.AutoscalingV2beta1Interface { + ret := _m.Called() + + var r0 v2beta1.AutoscalingV2beta1Interface + if rf, ok := ret.Get(0).(func() v2beta1.AutoscalingV2beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v2beta1.AutoscalingV2beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AutoscalingV2beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AutoscalingV2beta1' +type mockComponentEcosystemInterface_AutoscalingV2beta1_Call struct { + *mock.Call +} + +// AutoscalingV2beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AutoscalingV2beta1() *mockComponentEcosystemInterface_AutoscalingV2beta1_Call { + return &mockComponentEcosystemInterface_AutoscalingV2beta1_Call{Call: _e.mock.On("AutoscalingV2beta1")} +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2beta1_Call) Run(run func()) *mockComponentEcosystemInterface_AutoscalingV2beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2beta1_Call) Return(_a0 v2beta1.AutoscalingV2beta1Interface) *mockComponentEcosystemInterface_AutoscalingV2beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2beta1_Call) RunAndReturn(run func() v2beta1.AutoscalingV2beta1Interface) *mockComponentEcosystemInterface_AutoscalingV2beta1_Call { + _c.Call.Return(run) + return _c +} + +// AutoscalingV2beta2 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) AutoscalingV2beta2() v2beta2.AutoscalingV2beta2Interface { + ret := _m.Called() + + var r0 v2beta2.AutoscalingV2beta2Interface + if rf, ok := ret.Get(0).(func() v2beta2.AutoscalingV2beta2Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v2beta2.AutoscalingV2beta2Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_AutoscalingV2beta2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AutoscalingV2beta2' +type mockComponentEcosystemInterface_AutoscalingV2beta2_Call struct { + *mock.Call +} + +// AutoscalingV2beta2 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) AutoscalingV2beta2() *mockComponentEcosystemInterface_AutoscalingV2beta2_Call { + return &mockComponentEcosystemInterface_AutoscalingV2beta2_Call{Call: _e.mock.On("AutoscalingV2beta2")} +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2beta2_Call) Run(run func()) *mockComponentEcosystemInterface_AutoscalingV2beta2_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2beta2_Call) Return(_a0 v2beta2.AutoscalingV2beta2Interface) *mockComponentEcosystemInterface_AutoscalingV2beta2_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_AutoscalingV2beta2_Call) RunAndReturn(run func() v2beta2.AutoscalingV2beta2Interface) *mockComponentEcosystemInterface_AutoscalingV2beta2_Call { + _c.Call.Return(run) + return _c +} + +// BatchV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) BatchV1() batchv1.BatchV1Interface { + ret := _m.Called() + + var r0 batchv1.BatchV1Interface + if rf, ok := ret.Get(0).(func() batchv1.BatchV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(batchv1.BatchV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_BatchV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BatchV1' +type mockComponentEcosystemInterface_BatchV1_Call struct { + *mock.Call +} + +// BatchV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) BatchV1() *mockComponentEcosystemInterface_BatchV1_Call { + return &mockComponentEcosystemInterface_BatchV1_Call{Call: _e.mock.On("BatchV1")} +} + +func (_c *mockComponentEcosystemInterface_BatchV1_Call) Run(run func()) *mockComponentEcosystemInterface_BatchV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_BatchV1_Call) Return(_a0 batchv1.BatchV1Interface) *mockComponentEcosystemInterface_BatchV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_BatchV1_Call) RunAndReturn(run func() batchv1.BatchV1Interface) *mockComponentEcosystemInterface_BatchV1_Call { + _c.Call.Return(run) + return _c +} + +// BatchV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) BatchV1beta1() batchv1beta1.BatchV1beta1Interface { + ret := _m.Called() + + var r0 batchv1beta1.BatchV1beta1Interface + if rf, ok := ret.Get(0).(func() batchv1beta1.BatchV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(batchv1beta1.BatchV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_BatchV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BatchV1beta1' +type mockComponentEcosystemInterface_BatchV1beta1_Call struct { + *mock.Call +} + +// BatchV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) BatchV1beta1() *mockComponentEcosystemInterface_BatchV1beta1_Call { + return &mockComponentEcosystemInterface_BatchV1beta1_Call{Call: _e.mock.On("BatchV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_BatchV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_BatchV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_BatchV1beta1_Call) Return(_a0 batchv1beta1.BatchV1beta1Interface) *mockComponentEcosystemInterface_BatchV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_BatchV1beta1_Call) RunAndReturn(run func() batchv1beta1.BatchV1beta1Interface) *mockComponentEcosystemInterface_BatchV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// CertificatesV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) CertificatesV1() certificatesv1.CertificatesV1Interface { + ret := _m.Called() + + var r0 certificatesv1.CertificatesV1Interface + if rf, ok := ret.Get(0).(func() certificatesv1.CertificatesV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(certificatesv1.CertificatesV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_CertificatesV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CertificatesV1' +type mockComponentEcosystemInterface_CertificatesV1_Call struct { + *mock.Call +} + +// CertificatesV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) CertificatesV1() *mockComponentEcosystemInterface_CertificatesV1_Call { + return &mockComponentEcosystemInterface_CertificatesV1_Call{Call: _e.mock.On("CertificatesV1")} +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1_Call) Run(run func()) *mockComponentEcosystemInterface_CertificatesV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1_Call) Return(_a0 certificatesv1.CertificatesV1Interface) *mockComponentEcosystemInterface_CertificatesV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1_Call) RunAndReturn(run func() certificatesv1.CertificatesV1Interface) *mockComponentEcosystemInterface_CertificatesV1_Call { + _c.Call.Return(run) + return _c +} + +// CertificatesV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) CertificatesV1beta1() certificatesv1beta1.CertificatesV1beta1Interface { + ret := _m.Called() + + var r0 certificatesv1beta1.CertificatesV1beta1Interface + if rf, ok := ret.Get(0).(func() certificatesv1beta1.CertificatesV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(certificatesv1beta1.CertificatesV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_CertificatesV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CertificatesV1beta1' +type mockComponentEcosystemInterface_CertificatesV1beta1_Call struct { + *mock.Call +} + +// CertificatesV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) CertificatesV1beta1() *mockComponentEcosystemInterface_CertificatesV1beta1_Call { + return &mockComponentEcosystemInterface_CertificatesV1beta1_Call{Call: _e.mock.On("CertificatesV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_CertificatesV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1beta1_Call) Return(_a0 certificatesv1beta1.CertificatesV1beta1Interface) *mockComponentEcosystemInterface_CertificatesV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1beta1_Call) RunAndReturn(run func() certificatesv1beta1.CertificatesV1beta1Interface) *mockComponentEcosystemInterface_CertificatesV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// ComponentV1Alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) ComponentV1Alpha1() ecosystem.ComponentV1Alpha1Interface { + ret := _m.Called() + + var r0 ecosystem.ComponentV1Alpha1Interface + if rf, ok := ret.Get(0).(func() ecosystem.ComponentV1Alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ecosystem.ComponentV1Alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_ComponentV1Alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ComponentV1Alpha1' +type mockComponentEcosystemInterface_ComponentV1Alpha1_Call struct { + *mock.Call +} + +// ComponentV1Alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) ComponentV1Alpha1() *mockComponentEcosystemInterface_ComponentV1Alpha1_Call { + return &mockComponentEcosystemInterface_ComponentV1Alpha1_Call{Call: _e.mock.On("ComponentV1Alpha1")} +} + +func (_c *mockComponentEcosystemInterface_ComponentV1Alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_ComponentV1Alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_ComponentV1Alpha1_Call) Return(_a0 ecosystem.ComponentV1Alpha1Interface) *mockComponentEcosystemInterface_ComponentV1Alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_ComponentV1Alpha1_Call) RunAndReturn(run func() ecosystem.ComponentV1Alpha1Interface) *mockComponentEcosystemInterface_ComponentV1Alpha1_Call { + _c.Call.Return(run) + return _c +} + +// CoordinationV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) CoordinationV1() coordinationv1.CoordinationV1Interface { + ret := _m.Called() + + var r0 coordinationv1.CoordinationV1Interface + if rf, ok := ret.Get(0).(func() coordinationv1.CoordinationV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coordinationv1.CoordinationV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_CoordinationV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CoordinationV1' +type mockComponentEcosystemInterface_CoordinationV1_Call struct { + *mock.Call +} + +// CoordinationV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) CoordinationV1() *mockComponentEcosystemInterface_CoordinationV1_Call { + return &mockComponentEcosystemInterface_CoordinationV1_Call{Call: _e.mock.On("CoordinationV1")} +} + +func (_c *mockComponentEcosystemInterface_CoordinationV1_Call) Run(run func()) *mockComponentEcosystemInterface_CoordinationV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_CoordinationV1_Call) Return(_a0 coordinationv1.CoordinationV1Interface) *mockComponentEcosystemInterface_CoordinationV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_CoordinationV1_Call) RunAndReturn(run func() coordinationv1.CoordinationV1Interface) *mockComponentEcosystemInterface_CoordinationV1_Call { + _c.Call.Return(run) + return _c +} + +// CoordinationV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface { + ret := _m.Called() + + var r0 coordinationv1beta1.CoordinationV1beta1Interface + if rf, ok := ret.Get(0).(func() coordinationv1beta1.CoordinationV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coordinationv1beta1.CoordinationV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_CoordinationV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CoordinationV1beta1' +type mockComponentEcosystemInterface_CoordinationV1beta1_Call struct { + *mock.Call +} + +// CoordinationV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) CoordinationV1beta1() *mockComponentEcosystemInterface_CoordinationV1beta1_Call { + return &mockComponentEcosystemInterface_CoordinationV1beta1_Call{Call: _e.mock.On("CoordinationV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_CoordinationV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_CoordinationV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_CoordinationV1beta1_Call) Return(_a0 coordinationv1beta1.CoordinationV1beta1Interface) *mockComponentEcosystemInterface_CoordinationV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_CoordinationV1beta1_Call) RunAndReturn(run func() coordinationv1beta1.CoordinationV1beta1Interface) *mockComponentEcosystemInterface_CoordinationV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// CoreV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) CoreV1() corev1.CoreV1Interface { + ret := _m.Called() + + var r0 corev1.CoreV1Interface + if rf, ok := ret.Get(0).(func() corev1.CoreV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(corev1.CoreV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_CoreV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CoreV1' +type mockComponentEcosystemInterface_CoreV1_Call struct { + *mock.Call +} + +// CoreV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) CoreV1() *mockComponentEcosystemInterface_CoreV1_Call { + return &mockComponentEcosystemInterface_CoreV1_Call{Call: _e.mock.On("CoreV1")} +} + +func (_c *mockComponentEcosystemInterface_CoreV1_Call) Run(run func()) *mockComponentEcosystemInterface_CoreV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_CoreV1_Call) Return(_a0 corev1.CoreV1Interface) *mockComponentEcosystemInterface_CoreV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_CoreV1_Call) RunAndReturn(run func() corev1.CoreV1Interface) *mockComponentEcosystemInterface_CoreV1_Call { + _c.Call.Return(run) + return _c +} + +// Discovery provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) Discovery() discovery.DiscoveryInterface { + ret := _m.Called() + + var r0 discovery.DiscoveryInterface + if rf, ok := ret.Get(0).(func() discovery.DiscoveryInterface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(discovery.DiscoveryInterface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_Discovery_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Discovery' +type mockComponentEcosystemInterface_Discovery_Call struct { + *mock.Call +} + +// Discovery is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) Discovery() *mockComponentEcosystemInterface_Discovery_Call { + return &mockComponentEcosystemInterface_Discovery_Call{Call: _e.mock.On("Discovery")} +} + +func (_c *mockComponentEcosystemInterface_Discovery_Call) Run(run func()) *mockComponentEcosystemInterface_Discovery_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_Discovery_Call) Return(_a0 discovery.DiscoveryInterface) *mockComponentEcosystemInterface_Discovery_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_Discovery_Call) RunAndReturn(run func() discovery.DiscoveryInterface) *mockComponentEcosystemInterface_Discovery_Call { + _c.Call.Return(run) + return _c +} + +// DiscoveryV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) DiscoveryV1() discoveryv1.DiscoveryV1Interface { + ret := _m.Called() + + var r0 discoveryv1.DiscoveryV1Interface + if rf, ok := ret.Get(0).(func() discoveryv1.DiscoveryV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(discoveryv1.DiscoveryV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_DiscoveryV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DiscoveryV1' +type mockComponentEcosystemInterface_DiscoveryV1_Call struct { + *mock.Call +} + +// DiscoveryV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) DiscoveryV1() *mockComponentEcosystemInterface_DiscoveryV1_Call { + return &mockComponentEcosystemInterface_DiscoveryV1_Call{Call: _e.mock.On("DiscoveryV1")} +} + +func (_c *mockComponentEcosystemInterface_DiscoveryV1_Call) Run(run func()) *mockComponentEcosystemInterface_DiscoveryV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_DiscoveryV1_Call) Return(_a0 discoveryv1.DiscoveryV1Interface) *mockComponentEcosystemInterface_DiscoveryV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_DiscoveryV1_Call) RunAndReturn(run func() discoveryv1.DiscoveryV1Interface) *mockComponentEcosystemInterface_DiscoveryV1_Call { + _c.Call.Return(run) + return _c +} + +// DiscoveryV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) DiscoveryV1beta1() discoveryv1beta1.DiscoveryV1beta1Interface { + ret := _m.Called() + + var r0 discoveryv1beta1.DiscoveryV1beta1Interface + if rf, ok := ret.Get(0).(func() discoveryv1beta1.DiscoveryV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(discoveryv1beta1.DiscoveryV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_DiscoveryV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DiscoveryV1beta1' +type mockComponentEcosystemInterface_DiscoveryV1beta1_Call struct { + *mock.Call +} + +// DiscoveryV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) DiscoveryV1beta1() *mockComponentEcosystemInterface_DiscoveryV1beta1_Call { + return &mockComponentEcosystemInterface_DiscoveryV1beta1_Call{Call: _e.mock.On("DiscoveryV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_DiscoveryV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_DiscoveryV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_DiscoveryV1beta1_Call) Return(_a0 discoveryv1beta1.DiscoveryV1beta1Interface) *mockComponentEcosystemInterface_DiscoveryV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_DiscoveryV1beta1_Call) RunAndReturn(run func() discoveryv1beta1.DiscoveryV1beta1Interface) *mockComponentEcosystemInterface_DiscoveryV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// EventsV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) EventsV1() eventsv1.EventsV1Interface { + ret := _m.Called() + + var r0 eventsv1.EventsV1Interface + if rf, ok := ret.Get(0).(func() eventsv1.EventsV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(eventsv1.EventsV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_EventsV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EventsV1' +type mockComponentEcosystemInterface_EventsV1_Call struct { + *mock.Call +} + +// EventsV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) EventsV1() *mockComponentEcosystemInterface_EventsV1_Call { + return &mockComponentEcosystemInterface_EventsV1_Call{Call: _e.mock.On("EventsV1")} +} + +func (_c *mockComponentEcosystemInterface_EventsV1_Call) Run(run func()) *mockComponentEcosystemInterface_EventsV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_EventsV1_Call) Return(_a0 eventsv1.EventsV1Interface) *mockComponentEcosystemInterface_EventsV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_EventsV1_Call) RunAndReturn(run func() eventsv1.EventsV1Interface) *mockComponentEcosystemInterface_EventsV1_Call { + _c.Call.Return(run) + return _c +} + +// EventsV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) EventsV1beta1() eventsv1beta1.EventsV1beta1Interface { + ret := _m.Called() + + var r0 eventsv1beta1.EventsV1beta1Interface + if rf, ok := ret.Get(0).(func() eventsv1beta1.EventsV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(eventsv1beta1.EventsV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_EventsV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EventsV1beta1' +type mockComponentEcosystemInterface_EventsV1beta1_Call struct { + *mock.Call +} + +// EventsV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) EventsV1beta1() *mockComponentEcosystemInterface_EventsV1beta1_Call { + return &mockComponentEcosystemInterface_EventsV1beta1_Call{Call: _e.mock.On("EventsV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_EventsV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_EventsV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_EventsV1beta1_Call) Return(_a0 eventsv1beta1.EventsV1beta1Interface) *mockComponentEcosystemInterface_EventsV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_EventsV1beta1_Call) RunAndReturn(run func() eventsv1beta1.EventsV1beta1Interface) *mockComponentEcosystemInterface_EventsV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// ExtensionsV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) ExtensionsV1beta1() extensionsv1beta1.ExtensionsV1beta1Interface { + ret := _m.Called() + + var r0 extensionsv1beta1.ExtensionsV1beta1Interface + if rf, ok := ret.Get(0).(func() extensionsv1beta1.ExtensionsV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(extensionsv1beta1.ExtensionsV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_ExtensionsV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ExtensionsV1beta1' +type mockComponentEcosystemInterface_ExtensionsV1beta1_Call struct { + *mock.Call +} + +// ExtensionsV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) ExtensionsV1beta1() *mockComponentEcosystemInterface_ExtensionsV1beta1_Call { + return &mockComponentEcosystemInterface_ExtensionsV1beta1_Call{Call: _e.mock.On("ExtensionsV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_ExtensionsV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_ExtensionsV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_ExtensionsV1beta1_Call) Return(_a0 extensionsv1beta1.ExtensionsV1beta1Interface) *mockComponentEcosystemInterface_ExtensionsV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_ExtensionsV1beta1_Call) RunAndReturn(run func() extensionsv1beta1.ExtensionsV1beta1Interface) *mockComponentEcosystemInterface_ExtensionsV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// FlowcontrolV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) FlowcontrolV1alpha1() flowcontrolv1alpha1.FlowcontrolV1alpha1Interface { + ret := _m.Called() + + var r0 flowcontrolv1alpha1.FlowcontrolV1alpha1Interface + if rf, ok := ret.Get(0).(func() flowcontrolv1alpha1.FlowcontrolV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(flowcontrolv1alpha1.FlowcontrolV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FlowcontrolV1alpha1' +type mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call struct { + *mock.Call +} + +// FlowcontrolV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) FlowcontrolV1alpha1() *mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call { + return &mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call{Call: _e.mock.On("FlowcontrolV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call) Return(_a0 flowcontrolv1alpha1.FlowcontrolV1alpha1Interface) *mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call) RunAndReturn(run func() flowcontrolv1alpha1.FlowcontrolV1alpha1Interface) *mockComponentEcosystemInterface_FlowcontrolV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// FlowcontrolV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) FlowcontrolV1beta1() flowcontrolv1beta1.FlowcontrolV1beta1Interface { + ret := _m.Called() + + var r0 flowcontrolv1beta1.FlowcontrolV1beta1Interface + if rf, ok := ret.Get(0).(func() flowcontrolv1beta1.FlowcontrolV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(flowcontrolv1beta1.FlowcontrolV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_FlowcontrolV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FlowcontrolV1beta1' +type mockComponentEcosystemInterface_FlowcontrolV1beta1_Call struct { + *mock.Call +} + +// FlowcontrolV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) FlowcontrolV1beta1() *mockComponentEcosystemInterface_FlowcontrolV1beta1_Call { + return &mockComponentEcosystemInterface_FlowcontrolV1beta1_Call{Call: _e.mock.On("FlowcontrolV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_FlowcontrolV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta1_Call) Return(_a0 flowcontrolv1beta1.FlowcontrolV1beta1Interface) *mockComponentEcosystemInterface_FlowcontrolV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta1_Call) RunAndReturn(run func() flowcontrolv1beta1.FlowcontrolV1beta1Interface) *mockComponentEcosystemInterface_FlowcontrolV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// FlowcontrolV1beta2 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) FlowcontrolV1beta2() flowcontrolv1beta2.FlowcontrolV1beta2Interface { + ret := _m.Called() + + var r0 flowcontrolv1beta2.FlowcontrolV1beta2Interface + if rf, ok := ret.Get(0).(func() flowcontrolv1beta2.FlowcontrolV1beta2Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(flowcontrolv1beta2.FlowcontrolV1beta2Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_FlowcontrolV1beta2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FlowcontrolV1beta2' +type mockComponentEcosystemInterface_FlowcontrolV1beta2_Call struct { + *mock.Call +} + +// FlowcontrolV1beta2 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) FlowcontrolV1beta2() *mockComponentEcosystemInterface_FlowcontrolV1beta2_Call { + return &mockComponentEcosystemInterface_FlowcontrolV1beta2_Call{Call: _e.mock.On("FlowcontrolV1beta2")} +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta2_Call) Run(run func()) *mockComponentEcosystemInterface_FlowcontrolV1beta2_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta2_Call) Return(_a0 flowcontrolv1beta2.FlowcontrolV1beta2Interface) *mockComponentEcosystemInterface_FlowcontrolV1beta2_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta2_Call) RunAndReturn(run func() flowcontrolv1beta2.FlowcontrolV1beta2Interface) *mockComponentEcosystemInterface_FlowcontrolV1beta2_Call { + _c.Call.Return(run) + return _c +} + +// FlowcontrolV1beta3 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) FlowcontrolV1beta3() v1beta3.FlowcontrolV1beta3Interface { + ret := _m.Called() + + var r0 v1beta3.FlowcontrolV1beta3Interface + if rf, ok := ret.Get(0).(func() v1beta3.FlowcontrolV1beta3Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(v1beta3.FlowcontrolV1beta3Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_FlowcontrolV1beta3_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FlowcontrolV1beta3' +type mockComponentEcosystemInterface_FlowcontrolV1beta3_Call struct { + *mock.Call +} + +// FlowcontrolV1beta3 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) FlowcontrolV1beta3() *mockComponentEcosystemInterface_FlowcontrolV1beta3_Call { + return &mockComponentEcosystemInterface_FlowcontrolV1beta3_Call{Call: _e.mock.On("FlowcontrolV1beta3")} +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta3_Call) Run(run func()) *mockComponentEcosystemInterface_FlowcontrolV1beta3_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta3_Call) Return(_a0 v1beta3.FlowcontrolV1beta3Interface) *mockComponentEcosystemInterface_FlowcontrolV1beta3_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_FlowcontrolV1beta3_Call) RunAndReturn(run func() v1beta3.FlowcontrolV1beta3Interface) *mockComponentEcosystemInterface_FlowcontrolV1beta3_Call { + _c.Call.Return(run) + return _c +} + +// InternalV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) InternalV1alpha1() apiserverinternalv1alpha1.InternalV1alpha1Interface { + ret := _m.Called() + + var r0 apiserverinternalv1alpha1.InternalV1alpha1Interface + if rf, ok := ret.Get(0).(func() apiserverinternalv1alpha1.InternalV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(apiserverinternalv1alpha1.InternalV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_InternalV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InternalV1alpha1' +type mockComponentEcosystemInterface_InternalV1alpha1_Call struct { + *mock.Call +} + +// InternalV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) InternalV1alpha1() *mockComponentEcosystemInterface_InternalV1alpha1_Call { + return &mockComponentEcosystemInterface_InternalV1alpha1_Call{Call: _e.mock.On("InternalV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_InternalV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_InternalV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_InternalV1alpha1_Call) Return(_a0 apiserverinternalv1alpha1.InternalV1alpha1Interface) *mockComponentEcosystemInterface_InternalV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_InternalV1alpha1_Call) RunAndReturn(run func() apiserverinternalv1alpha1.InternalV1alpha1Interface) *mockComponentEcosystemInterface_InternalV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// NetworkingV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) NetworkingV1() networkingv1.NetworkingV1Interface { + ret := _m.Called() + + var r0 networkingv1.NetworkingV1Interface + if rf, ok := ret.Get(0).(func() networkingv1.NetworkingV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(networkingv1.NetworkingV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_NetworkingV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NetworkingV1' +type mockComponentEcosystemInterface_NetworkingV1_Call struct { + *mock.Call +} + +// NetworkingV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) NetworkingV1() *mockComponentEcosystemInterface_NetworkingV1_Call { + return &mockComponentEcosystemInterface_NetworkingV1_Call{Call: _e.mock.On("NetworkingV1")} +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1_Call) Run(run func()) *mockComponentEcosystemInterface_NetworkingV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1_Call) Return(_a0 networkingv1.NetworkingV1Interface) *mockComponentEcosystemInterface_NetworkingV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1_Call) RunAndReturn(run func() networkingv1.NetworkingV1Interface) *mockComponentEcosystemInterface_NetworkingV1_Call { + _c.Call.Return(run) + return _c +} + +// NetworkingV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) NetworkingV1alpha1() networkingv1alpha1.NetworkingV1alpha1Interface { + ret := _m.Called() + + var r0 networkingv1alpha1.NetworkingV1alpha1Interface + if rf, ok := ret.Get(0).(func() networkingv1alpha1.NetworkingV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(networkingv1alpha1.NetworkingV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_NetworkingV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NetworkingV1alpha1' +type mockComponentEcosystemInterface_NetworkingV1alpha1_Call struct { + *mock.Call +} + +// NetworkingV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) NetworkingV1alpha1() *mockComponentEcosystemInterface_NetworkingV1alpha1_Call { + return &mockComponentEcosystemInterface_NetworkingV1alpha1_Call{Call: _e.mock.On("NetworkingV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_NetworkingV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1alpha1_Call) Return(_a0 networkingv1alpha1.NetworkingV1alpha1Interface) *mockComponentEcosystemInterface_NetworkingV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1alpha1_Call) RunAndReturn(run func() networkingv1alpha1.NetworkingV1alpha1Interface) *mockComponentEcosystemInterface_NetworkingV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// NetworkingV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) NetworkingV1beta1() networkingv1beta1.NetworkingV1beta1Interface { + ret := _m.Called() + + var r0 networkingv1beta1.NetworkingV1beta1Interface + if rf, ok := ret.Get(0).(func() networkingv1beta1.NetworkingV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(networkingv1beta1.NetworkingV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_NetworkingV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NetworkingV1beta1' +type mockComponentEcosystemInterface_NetworkingV1beta1_Call struct { + *mock.Call +} + +// NetworkingV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) NetworkingV1beta1() *mockComponentEcosystemInterface_NetworkingV1beta1_Call { + return &mockComponentEcosystemInterface_NetworkingV1beta1_Call{Call: _e.mock.On("NetworkingV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_NetworkingV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1beta1_Call) Return(_a0 networkingv1beta1.NetworkingV1beta1Interface) *mockComponentEcosystemInterface_NetworkingV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_NetworkingV1beta1_Call) RunAndReturn(run func() networkingv1beta1.NetworkingV1beta1Interface) *mockComponentEcosystemInterface_NetworkingV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// NodeV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) NodeV1() nodev1.NodeV1Interface { + ret := _m.Called() + + var r0 nodev1.NodeV1Interface + if rf, ok := ret.Get(0).(func() nodev1.NodeV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(nodev1.NodeV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_NodeV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NodeV1' +type mockComponentEcosystemInterface_NodeV1_Call struct { + *mock.Call +} + +// NodeV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) NodeV1() *mockComponentEcosystemInterface_NodeV1_Call { + return &mockComponentEcosystemInterface_NodeV1_Call{Call: _e.mock.On("NodeV1")} +} + +func (_c *mockComponentEcosystemInterface_NodeV1_Call) Run(run func()) *mockComponentEcosystemInterface_NodeV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_NodeV1_Call) Return(_a0 nodev1.NodeV1Interface) *mockComponentEcosystemInterface_NodeV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_NodeV1_Call) RunAndReturn(run func() nodev1.NodeV1Interface) *mockComponentEcosystemInterface_NodeV1_Call { + _c.Call.Return(run) + return _c +} + +// NodeV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) NodeV1alpha1() nodev1alpha1.NodeV1alpha1Interface { + ret := _m.Called() + + var r0 nodev1alpha1.NodeV1alpha1Interface + if rf, ok := ret.Get(0).(func() nodev1alpha1.NodeV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(nodev1alpha1.NodeV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_NodeV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NodeV1alpha1' +type mockComponentEcosystemInterface_NodeV1alpha1_Call struct { + *mock.Call +} + +// NodeV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) NodeV1alpha1() *mockComponentEcosystemInterface_NodeV1alpha1_Call { + return &mockComponentEcosystemInterface_NodeV1alpha1_Call{Call: _e.mock.On("NodeV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_NodeV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_NodeV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_NodeV1alpha1_Call) Return(_a0 nodev1alpha1.NodeV1alpha1Interface) *mockComponentEcosystemInterface_NodeV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_NodeV1alpha1_Call) RunAndReturn(run func() nodev1alpha1.NodeV1alpha1Interface) *mockComponentEcosystemInterface_NodeV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// NodeV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) NodeV1beta1() nodev1beta1.NodeV1beta1Interface { + ret := _m.Called() + + var r0 nodev1beta1.NodeV1beta1Interface + if rf, ok := ret.Get(0).(func() nodev1beta1.NodeV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(nodev1beta1.NodeV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_NodeV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NodeV1beta1' +type mockComponentEcosystemInterface_NodeV1beta1_Call struct { + *mock.Call +} + +// NodeV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) NodeV1beta1() *mockComponentEcosystemInterface_NodeV1beta1_Call { + return &mockComponentEcosystemInterface_NodeV1beta1_Call{Call: _e.mock.On("NodeV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_NodeV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_NodeV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_NodeV1beta1_Call) Return(_a0 nodev1beta1.NodeV1beta1Interface) *mockComponentEcosystemInterface_NodeV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_NodeV1beta1_Call) RunAndReturn(run func() nodev1beta1.NodeV1beta1Interface) *mockComponentEcosystemInterface_NodeV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// PolicyV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) PolicyV1() policyv1.PolicyV1Interface { + ret := _m.Called() + + var r0 policyv1.PolicyV1Interface + if rf, ok := ret.Get(0).(func() policyv1.PolicyV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(policyv1.PolicyV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_PolicyV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PolicyV1' +type mockComponentEcosystemInterface_PolicyV1_Call struct { + *mock.Call +} + +// PolicyV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) PolicyV1() *mockComponentEcosystemInterface_PolicyV1_Call { + return &mockComponentEcosystemInterface_PolicyV1_Call{Call: _e.mock.On("PolicyV1")} +} + +func (_c *mockComponentEcosystemInterface_PolicyV1_Call) Run(run func()) *mockComponentEcosystemInterface_PolicyV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_PolicyV1_Call) Return(_a0 policyv1.PolicyV1Interface) *mockComponentEcosystemInterface_PolicyV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_PolicyV1_Call) RunAndReturn(run func() policyv1.PolicyV1Interface) *mockComponentEcosystemInterface_PolicyV1_Call { + _c.Call.Return(run) + return _c +} + +// PolicyV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) PolicyV1beta1() policyv1beta1.PolicyV1beta1Interface { + ret := _m.Called() + + var r0 policyv1beta1.PolicyV1beta1Interface + if rf, ok := ret.Get(0).(func() policyv1beta1.PolicyV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(policyv1beta1.PolicyV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_PolicyV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PolicyV1beta1' +type mockComponentEcosystemInterface_PolicyV1beta1_Call struct { + *mock.Call +} + +// PolicyV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) PolicyV1beta1() *mockComponentEcosystemInterface_PolicyV1beta1_Call { + return &mockComponentEcosystemInterface_PolicyV1beta1_Call{Call: _e.mock.On("PolicyV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_PolicyV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_PolicyV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_PolicyV1beta1_Call) Return(_a0 policyv1beta1.PolicyV1beta1Interface) *mockComponentEcosystemInterface_PolicyV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_PolicyV1beta1_Call) RunAndReturn(run func() policyv1beta1.PolicyV1beta1Interface) *mockComponentEcosystemInterface_PolicyV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// RbacV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) RbacV1() rbacv1.RbacV1Interface { + ret := _m.Called() + + var r0 rbacv1.RbacV1Interface + if rf, ok := ret.Get(0).(func() rbacv1.RbacV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rbacv1.RbacV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_RbacV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RbacV1' +type mockComponentEcosystemInterface_RbacV1_Call struct { + *mock.Call +} + +// RbacV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) RbacV1() *mockComponentEcosystemInterface_RbacV1_Call { + return &mockComponentEcosystemInterface_RbacV1_Call{Call: _e.mock.On("RbacV1")} +} + +func (_c *mockComponentEcosystemInterface_RbacV1_Call) Run(run func()) *mockComponentEcosystemInterface_RbacV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_RbacV1_Call) Return(_a0 rbacv1.RbacV1Interface) *mockComponentEcosystemInterface_RbacV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_RbacV1_Call) RunAndReturn(run func() rbacv1.RbacV1Interface) *mockComponentEcosystemInterface_RbacV1_Call { + _c.Call.Return(run) + return _c +} + +// RbacV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) RbacV1alpha1() rbacv1alpha1.RbacV1alpha1Interface { + ret := _m.Called() + + var r0 rbacv1alpha1.RbacV1alpha1Interface + if rf, ok := ret.Get(0).(func() rbacv1alpha1.RbacV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rbacv1alpha1.RbacV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_RbacV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RbacV1alpha1' +type mockComponentEcosystemInterface_RbacV1alpha1_Call struct { + *mock.Call +} + +// RbacV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) RbacV1alpha1() *mockComponentEcosystemInterface_RbacV1alpha1_Call { + return &mockComponentEcosystemInterface_RbacV1alpha1_Call{Call: _e.mock.On("RbacV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_RbacV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_RbacV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_RbacV1alpha1_Call) Return(_a0 rbacv1alpha1.RbacV1alpha1Interface) *mockComponentEcosystemInterface_RbacV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_RbacV1alpha1_Call) RunAndReturn(run func() rbacv1alpha1.RbacV1alpha1Interface) *mockComponentEcosystemInterface_RbacV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// RbacV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) RbacV1beta1() rbacv1beta1.RbacV1beta1Interface { + ret := _m.Called() + + var r0 rbacv1beta1.RbacV1beta1Interface + if rf, ok := ret.Get(0).(func() rbacv1beta1.RbacV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rbacv1beta1.RbacV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_RbacV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RbacV1beta1' +type mockComponentEcosystemInterface_RbacV1beta1_Call struct { + *mock.Call +} + +// RbacV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) RbacV1beta1() *mockComponentEcosystemInterface_RbacV1beta1_Call { + return &mockComponentEcosystemInterface_RbacV1beta1_Call{Call: _e.mock.On("RbacV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_RbacV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_RbacV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_RbacV1beta1_Call) Return(_a0 rbacv1beta1.RbacV1beta1Interface) *mockComponentEcosystemInterface_RbacV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_RbacV1beta1_Call) RunAndReturn(run func() rbacv1beta1.RbacV1beta1Interface) *mockComponentEcosystemInterface_RbacV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// ResourceV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) ResourceV1alpha1() resourcev1alpha1.ResourceV1alpha1Interface { + ret := _m.Called() + + var r0 resourcev1alpha1.ResourceV1alpha1Interface + if rf, ok := ret.Get(0).(func() resourcev1alpha1.ResourceV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(resourcev1alpha1.ResourceV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_ResourceV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ResourceV1alpha1' +type mockComponentEcosystemInterface_ResourceV1alpha1_Call struct { + *mock.Call +} + +// ResourceV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) ResourceV1alpha1() *mockComponentEcosystemInterface_ResourceV1alpha1_Call { + return &mockComponentEcosystemInterface_ResourceV1alpha1_Call{Call: _e.mock.On("ResourceV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_ResourceV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_ResourceV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_ResourceV1alpha1_Call) Return(_a0 resourcev1alpha1.ResourceV1alpha1Interface) *mockComponentEcosystemInterface_ResourceV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_ResourceV1alpha1_Call) RunAndReturn(run func() resourcev1alpha1.ResourceV1alpha1Interface) *mockComponentEcosystemInterface_ResourceV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// SchedulingV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) SchedulingV1() schedulingv1.SchedulingV1Interface { + ret := _m.Called() + + var r0 schedulingv1.SchedulingV1Interface + if rf, ok := ret.Get(0).(func() schedulingv1.SchedulingV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(schedulingv1.SchedulingV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_SchedulingV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SchedulingV1' +type mockComponentEcosystemInterface_SchedulingV1_Call struct { + *mock.Call +} + +// SchedulingV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) SchedulingV1() *mockComponentEcosystemInterface_SchedulingV1_Call { + return &mockComponentEcosystemInterface_SchedulingV1_Call{Call: _e.mock.On("SchedulingV1")} +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1_Call) Run(run func()) *mockComponentEcosystemInterface_SchedulingV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1_Call) Return(_a0 schedulingv1.SchedulingV1Interface) *mockComponentEcosystemInterface_SchedulingV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1_Call) RunAndReturn(run func() schedulingv1.SchedulingV1Interface) *mockComponentEcosystemInterface_SchedulingV1_Call { + _c.Call.Return(run) + return _c +} + +// SchedulingV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) SchedulingV1alpha1() schedulingv1alpha1.SchedulingV1alpha1Interface { + ret := _m.Called() + + var r0 schedulingv1alpha1.SchedulingV1alpha1Interface + if rf, ok := ret.Get(0).(func() schedulingv1alpha1.SchedulingV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(schedulingv1alpha1.SchedulingV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_SchedulingV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SchedulingV1alpha1' +type mockComponentEcosystemInterface_SchedulingV1alpha1_Call struct { + *mock.Call +} + +// SchedulingV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) SchedulingV1alpha1() *mockComponentEcosystemInterface_SchedulingV1alpha1_Call { + return &mockComponentEcosystemInterface_SchedulingV1alpha1_Call{Call: _e.mock.On("SchedulingV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_SchedulingV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1alpha1_Call) Return(_a0 schedulingv1alpha1.SchedulingV1alpha1Interface) *mockComponentEcosystemInterface_SchedulingV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1alpha1_Call) RunAndReturn(run func() schedulingv1alpha1.SchedulingV1alpha1Interface) *mockComponentEcosystemInterface_SchedulingV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// SchedulingV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) SchedulingV1beta1() schedulingv1beta1.SchedulingV1beta1Interface { + ret := _m.Called() + + var r0 schedulingv1beta1.SchedulingV1beta1Interface + if rf, ok := ret.Get(0).(func() schedulingv1beta1.SchedulingV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(schedulingv1beta1.SchedulingV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_SchedulingV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SchedulingV1beta1' +type mockComponentEcosystemInterface_SchedulingV1beta1_Call struct { + *mock.Call +} + +// SchedulingV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) SchedulingV1beta1() *mockComponentEcosystemInterface_SchedulingV1beta1_Call { + return &mockComponentEcosystemInterface_SchedulingV1beta1_Call{Call: _e.mock.On("SchedulingV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_SchedulingV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1beta1_Call) Return(_a0 schedulingv1beta1.SchedulingV1beta1Interface) *mockComponentEcosystemInterface_SchedulingV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_SchedulingV1beta1_Call) RunAndReturn(run func() schedulingv1beta1.SchedulingV1beta1Interface) *mockComponentEcosystemInterface_SchedulingV1beta1_Call { + _c.Call.Return(run) + return _c +} + +// StorageV1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) StorageV1() storagev1.StorageV1Interface { + ret := _m.Called() + + var r0 storagev1.StorageV1Interface + if rf, ok := ret.Get(0).(func() storagev1.StorageV1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(storagev1.StorageV1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_StorageV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StorageV1' +type mockComponentEcosystemInterface_StorageV1_Call struct { + *mock.Call +} + +// StorageV1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) StorageV1() *mockComponentEcosystemInterface_StorageV1_Call { + return &mockComponentEcosystemInterface_StorageV1_Call{Call: _e.mock.On("StorageV1")} +} + +func (_c *mockComponentEcosystemInterface_StorageV1_Call) Run(run func()) *mockComponentEcosystemInterface_StorageV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_StorageV1_Call) Return(_a0 storagev1.StorageV1Interface) *mockComponentEcosystemInterface_StorageV1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_StorageV1_Call) RunAndReturn(run func() storagev1.StorageV1Interface) *mockComponentEcosystemInterface_StorageV1_Call { + _c.Call.Return(run) + return _c +} + +// StorageV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) StorageV1alpha1() storagev1alpha1.StorageV1alpha1Interface { + ret := _m.Called() + + var r0 storagev1alpha1.StorageV1alpha1Interface + if rf, ok := ret.Get(0).(func() storagev1alpha1.StorageV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(storagev1alpha1.StorageV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_StorageV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StorageV1alpha1' +type mockComponentEcosystemInterface_StorageV1alpha1_Call struct { + *mock.Call +} + +// StorageV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) StorageV1alpha1() *mockComponentEcosystemInterface_StorageV1alpha1_Call { + return &mockComponentEcosystemInterface_StorageV1alpha1_Call{Call: _e.mock.On("StorageV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_StorageV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_StorageV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_StorageV1alpha1_Call) Return(_a0 storagev1alpha1.StorageV1alpha1Interface) *mockComponentEcosystemInterface_StorageV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_StorageV1alpha1_Call) RunAndReturn(run func() storagev1alpha1.StorageV1alpha1Interface) *mockComponentEcosystemInterface_StorageV1alpha1_Call { + _c.Call.Return(run) + return _c +} + +// StorageV1beta1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) StorageV1beta1() storagev1beta1.StorageV1beta1Interface { + ret := _m.Called() + + var r0 storagev1beta1.StorageV1beta1Interface + if rf, ok := ret.Get(0).(func() storagev1beta1.StorageV1beta1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(storagev1beta1.StorageV1beta1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_StorageV1beta1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StorageV1beta1' +type mockComponentEcosystemInterface_StorageV1beta1_Call struct { + *mock.Call +} + +// StorageV1beta1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) StorageV1beta1() *mockComponentEcosystemInterface_StorageV1beta1_Call { + return &mockComponentEcosystemInterface_StorageV1beta1_Call{Call: _e.mock.On("StorageV1beta1")} +} + +func (_c *mockComponentEcosystemInterface_StorageV1beta1_Call) Run(run func()) *mockComponentEcosystemInterface_StorageV1beta1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_StorageV1beta1_Call) Return(_a0 storagev1beta1.StorageV1beta1Interface) *mockComponentEcosystemInterface_StorageV1beta1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_StorageV1beta1_Call) RunAndReturn(run func() storagev1beta1.StorageV1beta1Interface) *mockComponentEcosystemInterface_StorageV1beta1_Call { + _c.Call.Return(run) + return _c +} + +type mockConstructorTestingTnewMockComponentEcosystemInterface interface { + mock.TestingT + Cleanup(func()) +} + +// newMockComponentEcosystemInterface creates a new instance of mockComponentEcosystemInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockComponentEcosystemInterface(t mockConstructorTestingTnewMockComponentEcosystemInterface) *mockComponentEcosystemInterface { + mock := &mockComponentEcosystemInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/pkg/controllers/mock_componentInterface_test.go b/pkg/controllers/mock_componentInterface_test.go new file mode 100644 index 0000000..d01382e --- /dev/null +++ b/pkg/controllers/mock_componentInterface_test.go @@ -0,0 +1,871 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package controllers + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + types "k8s.io/apimachinery/pkg/types" + + v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + + watch "k8s.io/apimachinery/pkg/watch" +) + +// mockComponentInterface is an autogenerated mock type for the componentInterface type +type mockComponentInterface struct { + mock.Mock +} + +type mockComponentInterface_Expecter struct { + mock *mock.Mock +} + +func (_m *mockComponentInterface) EXPECT() *mockComponentInterface_Expecter { + return &mockComponentInterface_Expecter{mock: &_m.Mock} +} + +// AddFinalizer provides a mock function with given fields: ctx, component, finalizer +func (_m *mockComponentInterface) AddFinalizer(ctx context.Context, component *v1.Component, finalizer string) (*v1.Component, error) { + ret := _m.Called(ctx, component, finalizer) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) (*v1.Component, error)); ok { + return rf(ctx, component, finalizer) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) *v1.Component); ok { + r0 = rf(ctx, component, finalizer) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, string) error); ok { + r1 = rf(ctx, component, finalizer) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_AddFinalizer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddFinalizer' +type mockComponentInterface_AddFinalizer_Call struct { + *mock.Call +} + +// AddFinalizer is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +// - finalizer string +func (_e *mockComponentInterface_Expecter) AddFinalizer(ctx interface{}, component interface{}, finalizer interface{}) *mockComponentInterface_AddFinalizer_Call { + return &mockComponentInterface_AddFinalizer_Call{Call: _e.mock.On("AddFinalizer", ctx, component, finalizer)} +} + +func (_c *mockComponentInterface_AddFinalizer_Call) Run(run func(ctx context.Context, component *v1.Component, finalizer string)) *mockComponentInterface_AddFinalizer_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component), args[2].(string)) + }) + return _c +} + +func (_c *mockComponentInterface_AddFinalizer_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_AddFinalizer_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_AddFinalizer_Call) RunAndReturn(run func(context.Context, *v1.Component, string) (*v1.Component, error)) *mockComponentInterface_AddFinalizer_Call { + _c.Call.Return(run) + return _c +} + +// Create provides a mock function with given fields: ctx, component, opts +func (_m *mockComponentInterface) Create(ctx context.Context, component *v1.Component, opts metav1.CreateOptions) (*v1.Component, error) { + ret := _m.Called(ctx, component, opts) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.CreateOptions) (*v1.Component, error)); ok { + return rf(ctx, component, opts) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.CreateOptions) *v1.Component); ok { + r0 = rf(ctx, component, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, metav1.CreateOptions) error); ok { + r1 = rf(ctx, component, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_Create_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Create' +type mockComponentInterface_Create_Call struct { + *mock.Call +} + +// Create is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +// - opts metav1.CreateOptions +func (_e *mockComponentInterface_Expecter) Create(ctx interface{}, component interface{}, opts interface{}) *mockComponentInterface_Create_Call { + return &mockComponentInterface_Create_Call{Call: _e.mock.On("Create", ctx, component, opts)} +} + +func (_c *mockComponentInterface_Create_Call) Run(run func(ctx context.Context, component *v1.Component, opts metav1.CreateOptions)) *mockComponentInterface_Create_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component), args[2].(metav1.CreateOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_Create_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_Create_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_Create_Call) RunAndReturn(run func(context.Context, *v1.Component, metav1.CreateOptions) (*v1.Component, error)) *mockComponentInterface_Create_Call { + _c.Call.Return(run) + return _c +} + +// Delete provides a mock function with given fields: ctx, name, opts +func (_m *mockComponentInterface) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + ret := _m.Called(ctx, name, opts) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, metav1.DeleteOptions) error); ok { + r0 = rf(ctx, name, opts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockComponentInterface_Delete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Delete' +type mockComponentInterface_Delete_Call struct { + *mock.Call +} + +// Delete is a helper method to define mock.On call +// - ctx context.Context +// - name string +// - opts metav1.DeleteOptions +func (_e *mockComponentInterface_Expecter) Delete(ctx interface{}, name interface{}, opts interface{}) *mockComponentInterface_Delete_Call { + return &mockComponentInterface_Delete_Call{Call: _e.mock.On("Delete", ctx, name, opts)} +} + +func (_c *mockComponentInterface_Delete_Call) Run(run func(ctx context.Context, name string, opts metav1.DeleteOptions)) *mockComponentInterface_Delete_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(metav1.DeleteOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_Delete_Call) Return(_a0 error) *mockComponentInterface_Delete_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentInterface_Delete_Call) RunAndReturn(run func(context.Context, string, metav1.DeleteOptions) error) *mockComponentInterface_Delete_Call { + _c.Call.Return(run) + return _c +} + +// DeleteCollection provides a mock function with given fields: ctx, opts, listOpts +func (_m *mockComponentInterface) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + ret := _m.Called(ctx, opts, listOpts) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, metav1.DeleteOptions, metav1.ListOptions) error); ok { + r0 = rf(ctx, opts, listOpts) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockComponentInterface_DeleteCollection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteCollection' +type mockComponentInterface_DeleteCollection_Call struct { + *mock.Call +} + +// DeleteCollection is a helper method to define mock.On call +// - ctx context.Context +// - opts metav1.DeleteOptions +// - listOpts metav1.ListOptions +func (_e *mockComponentInterface_Expecter) DeleteCollection(ctx interface{}, opts interface{}, listOpts interface{}) *mockComponentInterface_DeleteCollection_Call { + return &mockComponentInterface_DeleteCollection_Call{Call: _e.mock.On("DeleteCollection", ctx, opts, listOpts)} +} + +func (_c *mockComponentInterface_DeleteCollection_Call) Run(run func(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions)) *mockComponentInterface_DeleteCollection_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(metav1.DeleteOptions), args[2].(metav1.ListOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_DeleteCollection_Call) Return(_a0 error) *mockComponentInterface_DeleteCollection_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentInterface_DeleteCollection_Call) RunAndReturn(run func(context.Context, metav1.DeleteOptions, metav1.ListOptions) error) *mockComponentInterface_DeleteCollection_Call { + _c.Call.Return(run) + return _c +} + +// Get provides a mock function with given fields: ctx, name, opts +func (_m *mockComponentInterface) Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Component, error) { + ret := _m.Called(ctx, name, opts) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, metav1.GetOptions) (*v1.Component, error)); ok { + return rf(ctx, name, opts) + } + if rf, ok := ret.Get(0).(func(context.Context, string, metav1.GetOptions) *v1.Component); ok { + r0 = rf(ctx, name, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string, metav1.GetOptions) error); ok { + r1 = rf(ctx, name, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' +type mockComponentInterface_Get_Call struct { + *mock.Call +} + +// Get is a helper method to define mock.On call +// - ctx context.Context +// - name string +// - opts metav1.GetOptions +func (_e *mockComponentInterface_Expecter) Get(ctx interface{}, name interface{}, opts interface{}) *mockComponentInterface_Get_Call { + return &mockComponentInterface_Get_Call{Call: _e.mock.On("Get", ctx, name, opts)} +} + +func (_c *mockComponentInterface_Get_Call) Run(run func(ctx context.Context, name string, opts metav1.GetOptions)) *mockComponentInterface_Get_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(metav1.GetOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_Get_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_Get_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_Get_Call) RunAndReturn(run func(context.Context, string, metav1.GetOptions) (*v1.Component, error)) *mockComponentInterface_Get_Call { + _c.Call.Return(run) + return _c +} + +// List provides a mock function with given fields: ctx, opts +func (_m *mockComponentInterface) List(ctx context.Context, opts metav1.ListOptions) (*v1.ComponentList, error) { + ret := _m.Called(ctx, opts) + + var r0 *v1.ComponentList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) (*v1.ComponentList, error)); ok { + return rf(ctx, opts) + } + if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) *v1.ComponentList); ok { + r0 = rf(ctx, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.ComponentList) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, metav1.ListOptions) error); ok { + r1 = rf(ctx, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_List_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'List' +type mockComponentInterface_List_Call struct { + *mock.Call +} + +// List is a helper method to define mock.On call +// - ctx context.Context +// - opts metav1.ListOptions +func (_e *mockComponentInterface_Expecter) List(ctx interface{}, opts interface{}) *mockComponentInterface_List_Call { + return &mockComponentInterface_List_Call{Call: _e.mock.On("List", ctx, opts)} +} + +func (_c *mockComponentInterface_List_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *mockComponentInterface_List_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(metav1.ListOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_List_Call) Return(_a0 *v1.ComponentList, _a1 error) *mockComponentInterface_List_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_List_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (*v1.ComponentList, error)) *mockComponentInterface_List_Call { + _c.Call.Return(run) + return _c +} + +// Patch provides a mock function with given fields: ctx, name, pt, data, opts, subresources +func (_m *mockComponentInterface) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*v1.Component, error) { + _va := make([]interface{}, len(subresources)) + for _i := range subresources { + _va[_i] = subresources[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, name, pt, data, opts) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) (*v1.Component, error)); ok { + return rf(ctx, name, pt, data, opts, subresources...) + } + if rf, ok := ret.Get(0).(func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) *v1.Component); ok { + r0 = rf(ctx, name, pt, data, opts, subresources...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) error); ok { + r1 = rf(ctx, name, pt, data, opts, subresources...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_Patch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Patch' +type mockComponentInterface_Patch_Call struct { + *mock.Call +} + +// Patch is a helper method to define mock.On call +// - ctx context.Context +// - name string +// - pt types.PatchType +// - data []byte +// - opts metav1.PatchOptions +// - subresources ...string +func (_e *mockComponentInterface_Expecter) Patch(ctx interface{}, name interface{}, pt interface{}, data interface{}, opts interface{}, subresources ...interface{}) *mockComponentInterface_Patch_Call { + return &mockComponentInterface_Patch_Call{Call: _e.mock.On("Patch", + append([]interface{}{ctx, name, pt, data, opts}, subresources...)...)} +} + +func (_c *mockComponentInterface_Patch_Call) Run(run func(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string)) *mockComponentInterface_Patch_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]string, len(args)-5) + for i, a := range args[5:] { + if a != nil { + variadicArgs[i] = a.(string) + } + } + run(args[0].(context.Context), args[1].(string), args[2].(types.PatchType), args[3].([]byte), args[4].(metav1.PatchOptions), variadicArgs...) + }) + return _c +} + +func (_c *mockComponentInterface_Patch_Call) Return(result *v1.Component, err error) *mockComponentInterface_Patch_Call { + _c.Call.Return(result, err) + return _c +} + +func (_c *mockComponentInterface_Patch_Call) RunAndReturn(run func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) (*v1.Component, error)) *mockComponentInterface_Patch_Call { + _c.Call.Return(run) + return _c +} + +// RemoveFinalizer provides a mock function with given fields: ctx, component, finalizer +func (_m *mockComponentInterface) RemoveFinalizer(ctx context.Context, component *v1.Component, finalizer string) (*v1.Component, error) { + ret := _m.Called(ctx, component, finalizer) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) (*v1.Component, error)); ok { + return rf(ctx, component, finalizer) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, string) *v1.Component); ok { + r0 = rf(ctx, component, finalizer) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, string) error); ok { + r1 = rf(ctx, component, finalizer) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_RemoveFinalizer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RemoveFinalizer' +type mockComponentInterface_RemoveFinalizer_Call struct { + *mock.Call +} + +// RemoveFinalizer is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +// - finalizer string +func (_e *mockComponentInterface_Expecter) RemoveFinalizer(ctx interface{}, component interface{}, finalizer interface{}) *mockComponentInterface_RemoveFinalizer_Call { + return &mockComponentInterface_RemoveFinalizer_Call{Call: _e.mock.On("RemoveFinalizer", ctx, component, finalizer)} +} + +func (_c *mockComponentInterface_RemoveFinalizer_Call) Run(run func(ctx context.Context, component *v1.Component, finalizer string)) *mockComponentInterface_RemoveFinalizer_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component), args[2].(string)) + }) + return _c +} + +func (_c *mockComponentInterface_RemoveFinalizer_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_RemoveFinalizer_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_RemoveFinalizer_Call) RunAndReturn(run func(context.Context, *v1.Component, string) (*v1.Component, error)) *mockComponentInterface_RemoveFinalizer_Call { + _c.Call.Return(run) + return _c +} + +// Update provides a mock function with given fields: ctx, component, opts +func (_m *mockComponentInterface) Update(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions) (*v1.Component, error) { + ret := _m.Called(ctx, component, opts) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)); ok { + return rf(ctx, component, opts) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) *v1.Component); ok { + r0 = rf(ctx, component, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, metav1.UpdateOptions) error); ok { + r1 = rf(ctx, component, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_Update_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Update' +type mockComponentInterface_Update_Call struct { + *mock.Call +} + +// Update is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +// - opts metav1.UpdateOptions +func (_e *mockComponentInterface_Expecter) Update(ctx interface{}, component interface{}, opts interface{}) *mockComponentInterface_Update_Call { + return &mockComponentInterface_Update_Call{Call: _e.mock.On("Update", ctx, component, opts)} +} + +func (_c *mockComponentInterface_Update_Call) Run(run func(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions)) *mockComponentInterface_Update_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component), args[2].(metav1.UpdateOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_Update_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_Update_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_Update_Call) RunAndReturn(run func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)) *mockComponentInterface_Update_Call { + _c.Call.Return(run) + return _c +} + +// UpdateStatus provides a mock function with given fields: ctx, component, opts +func (_m *mockComponentInterface) UpdateStatus(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions) (*v1.Component, error) { + ret := _m.Called(ctx, component, opts) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)); ok { + return rf(ctx, component, opts) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component, metav1.UpdateOptions) *v1.Component); ok { + r0 = rf(ctx, component, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component, metav1.UpdateOptions) error); ok { + r1 = rf(ctx, component, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_UpdateStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatus' +type mockComponentInterface_UpdateStatus_Call struct { + *mock.Call +} + +// UpdateStatus is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +// - opts metav1.UpdateOptions +func (_e *mockComponentInterface_Expecter) UpdateStatus(ctx interface{}, component interface{}, opts interface{}) *mockComponentInterface_UpdateStatus_Call { + return &mockComponentInterface_UpdateStatus_Call{Call: _e.mock.On("UpdateStatus", ctx, component, opts)} +} + +func (_c *mockComponentInterface_UpdateStatus_Call) Run(run func(ctx context.Context, component *v1.Component, opts metav1.UpdateOptions)) *mockComponentInterface_UpdateStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component), args[2].(metav1.UpdateOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_UpdateStatus_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_UpdateStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_UpdateStatus_Call) RunAndReturn(run func(context.Context, *v1.Component, metav1.UpdateOptions) (*v1.Component, error)) *mockComponentInterface_UpdateStatus_Call { + _c.Call.Return(run) + return _c +} + +// UpdateStatusDeleting provides a mock function with given fields: ctx, component +func (_m *mockComponentInterface) UpdateStatusDeleting(ctx context.Context, component *v1.Component) (*v1.Component, error) { + ret := _m.Called(ctx, component) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { + return rf(ctx, component) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { + r0 = rf(ctx, component) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { + r1 = rf(ctx, component) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_UpdateStatusDeleting_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusDeleting' +type mockComponentInterface_UpdateStatusDeleting_Call struct { + *mock.Call +} + +// UpdateStatusDeleting is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +func (_e *mockComponentInterface_Expecter) UpdateStatusDeleting(ctx interface{}, component interface{}) *mockComponentInterface_UpdateStatusDeleting_Call { + return &mockComponentInterface_UpdateStatusDeleting_Call{Call: _e.mock.On("UpdateStatusDeleting", ctx, component)} +} + +func (_c *mockComponentInterface_UpdateStatusDeleting_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockComponentInterface_UpdateStatusDeleting_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component)) + }) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusDeleting_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_UpdateStatusDeleting_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusDeleting_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *mockComponentInterface_UpdateStatusDeleting_Call { + _c.Call.Return(run) + return _c +} + +// UpdateStatusInstalled provides a mock function with given fields: ctx, component +func (_m *mockComponentInterface) UpdateStatusInstalled(ctx context.Context, component *v1.Component) (*v1.Component, error) { + ret := _m.Called(ctx, component) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { + return rf(ctx, component) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { + r0 = rf(ctx, component) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { + r1 = rf(ctx, component) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_UpdateStatusInstalled_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusInstalled' +type mockComponentInterface_UpdateStatusInstalled_Call struct { + *mock.Call +} + +// UpdateStatusInstalled is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +func (_e *mockComponentInterface_Expecter) UpdateStatusInstalled(ctx interface{}, component interface{}) *mockComponentInterface_UpdateStatusInstalled_Call { + return &mockComponentInterface_UpdateStatusInstalled_Call{Call: _e.mock.On("UpdateStatusInstalled", ctx, component)} +} + +func (_c *mockComponentInterface_UpdateStatusInstalled_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockComponentInterface_UpdateStatusInstalled_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component)) + }) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusInstalled_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_UpdateStatusInstalled_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusInstalled_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *mockComponentInterface_UpdateStatusInstalled_Call { + _c.Call.Return(run) + return _c +} + +// UpdateStatusInstalling provides a mock function with given fields: ctx, component +func (_m *mockComponentInterface) UpdateStatusInstalling(ctx context.Context, component *v1.Component) (*v1.Component, error) { + ret := _m.Called(ctx, component) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { + return rf(ctx, component) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { + r0 = rf(ctx, component) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { + r1 = rf(ctx, component) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_UpdateStatusInstalling_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusInstalling' +type mockComponentInterface_UpdateStatusInstalling_Call struct { + *mock.Call +} + +// UpdateStatusInstalling is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +func (_e *mockComponentInterface_Expecter) UpdateStatusInstalling(ctx interface{}, component interface{}) *mockComponentInterface_UpdateStatusInstalling_Call { + return &mockComponentInterface_UpdateStatusInstalling_Call{Call: _e.mock.On("UpdateStatusInstalling", ctx, component)} +} + +func (_c *mockComponentInterface_UpdateStatusInstalling_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockComponentInterface_UpdateStatusInstalling_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component)) + }) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusInstalling_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_UpdateStatusInstalling_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusInstalling_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *mockComponentInterface_UpdateStatusInstalling_Call { + _c.Call.Return(run) + return _c +} + +// UpdateStatusUpgrading provides a mock function with given fields: ctx, component +func (_m *mockComponentInterface) UpdateStatusUpgrading(ctx context.Context, component *v1.Component) (*v1.Component, error) { + ret := _m.Called(ctx, component) + + var r0 *v1.Component + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) (*v1.Component, error)); ok { + return rf(ctx, component) + } + if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) *v1.Component); ok { + r0 = rf(ctx, component) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.Component) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *v1.Component) error); ok { + r1 = rf(ctx, component) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_UpdateStatusUpgrading_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatusUpgrading' +type mockComponentInterface_UpdateStatusUpgrading_Call struct { + *mock.Call +} + +// UpdateStatusUpgrading is a helper method to define mock.On call +// - ctx context.Context +// - component *v1.Component +func (_e *mockComponentInterface_Expecter) UpdateStatusUpgrading(ctx interface{}, component interface{}) *mockComponentInterface_UpdateStatusUpgrading_Call { + return &mockComponentInterface_UpdateStatusUpgrading_Call{Call: _e.mock.On("UpdateStatusUpgrading", ctx, component)} +} + +func (_c *mockComponentInterface_UpdateStatusUpgrading_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockComponentInterface_UpdateStatusUpgrading_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*v1.Component)) + }) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusUpgrading_Call) Return(_a0 *v1.Component, _a1 error) *mockComponentInterface_UpdateStatusUpgrading_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_UpdateStatusUpgrading_Call) RunAndReturn(run func(context.Context, *v1.Component) (*v1.Component, error)) *mockComponentInterface_UpdateStatusUpgrading_Call { + _c.Call.Return(run) + return _c +} + +// Watch provides a mock function with given fields: ctx, opts +func (_m *mockComponentInterface) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + ret := _m.Called(ctx, opts) + + var r0 watch.Interface + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) (watch.Interface, error)); ok { + return rf(ctx, opts) + } + if rf, ok := ret.Get(0).(func(context.Context, metav1.ListOptions) watch.Interface); ok { + r0 = rf(ctx, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(watch.Interface) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, metav1.ListOptions) error); ok { + r1 = rf(ctx, opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockComponentInterface_Watch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Watch' +type mockComponentInterface_Watch_Call struct { + *mock.Call +} + +// Watch is a helper method to define mock.On call +// - ctx context.Context +// - opts metav1.ListOptions +func (_e *mockComponentInterface_Expecter) Watch(ctx interface{}, opts interface{}) *mockComponentInterface_Watch_Call { + return &mockComponentInterface_Watch_Call{Call: _e.mock.On("Watch", ctx, opts)} +} + +func (_c *mockComponentInterface_Watch_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *mockComponentInterface_Watch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(metav1.ListOptions)) + }) + return _c +} + +func (_c *mockComponentInterface_Watch_Call) Return(_a0 watch.Interface, _a1 error) *mockComponentInterface_Watch_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockComponentInterface_Watch_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (watch.Interface, error)) *mockComponentInterface_Watch_Call { + _c.Call.Return(run) + return _c +} + +type mockConstructorTestingTnewMockComponentInterface interface { + mock.TestingT + Cleanup(func()) +} + +// newMockComponentInterface creates a new instance of mockComponentInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockComponentInterface(t mockConstructorTestingTnewMockComponentInterface) *mockComponentInterface { + mock := &mockComponentInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/pkg/controllers/mock_componentV1Alpha1Interface_test.go b/pkg/controllers/mock_componentV1Alpha1Interface_test.go new file mode 100644 index 0000000..fbd0629 --- /dev/null +++ b/pkg/controllers/mock_componentV1Alpha1Interface_test.go @@ -0,0 +1,80 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package controllers + +import ( + ecosystem "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" + mock "github.com/stretchr/testify/mock" +) + +// mockComponentV1Alpha1Interface is an autogenerated mock type for the componentV1Alpha1Interface type +type mockComponentV1Alpha1Interface struct { + mock.Mock +} + +type mockComponentV1Alpha1Interface_Expecter struct { + mock *mock.Mock +} + +func (_m *mockComponentV1Alpha1Interface) EXPECT() *mockComponentV1Alpha1Interface_Expecter { + return &mockComponentV1Alpha1Interface_Expecter{mock: &_m.Mock} +} + +// Components provides a mock function with given fields: namespace +func (_m *mockComponentV1Alpha1Interface) Components(namespace string) ecosystem.ComponentInterface { + ret := _m.Called(namespace) + + var r0 ecosystem.ComponentInterface + if rf, ok := ret.Get(0).(func(string) ecosystem.ComponentInterface); ok { + r0 = rf(namespace) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ecosystem.ComponentInterface) + } + } + + return r0 +} + +// mockComponentV1Alpha1Interface_Components_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Components' +type mockComponentV1Alpha1Interface_Components_Call struct { + *mock.Call +} + +// Components is a helper method to define mock.On call +// - namespace string +func (_e *mockComponentV1Alpha1Interface_Expecter) Components(namespace interface{}) *mockComponentV1Alpha1Interface_Components_Call { + return &mockComponentV1Alpha1Interface_Components_Call{Call: _e.mock.On("Components", namespace)} +} + +func (_c *mockComponentV1Alpha1Interface_Components_Call) Run(run func(namespace string)) *mockComponentV1Alpha1Interface_Components_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *mockComponentV1Alpha1Interface_Components_Call) Return(_a0 ecosystem.ComponentInterface) *mockComponentV1Alpha1Interface_Components_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentV1Alpha1Interface_Components_Call) RunAndReturn(run func(string) ecosystem.ComponentInterface) *mockComponentV1Alpha1Interface_Components_Call { + _c.Call.Return(run) + return _c +} + +type mockConstructorTestingTnewMockComponentV1Alpha1Interface interface { + mock.TestingT + Cleanup(func()) +} + +// newMockComponentV1Alpha1Interface creates a new instance of mockComponentV1Alpha1Interface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockComponentV1Alpha1Interface(t mockConstructorTestingTnewMockComponentV1Alpha1Interface) *mockComponentV1Alpha1Interface { + mock := &mockComponentV1Alpha1Interface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/pkg/controllers/mock_DeleteManager_test.go b/pkg/controllers/mock_deleteManager_test.go similarity index 51% rename from pkg/controllers/mock_DeleteManager_test.go rename to pkg/controllers/mock_deleteManager_test.go index a95bd0e..b6b1799 100644 --- a/pkg/controllers/mock_DeleteManager_test.go +++ b/pkg/controllers/mock_deleteManager_test.go @@ -9,21 +9,21 @@ import ( mock "github.com/stretchr/testify/mock" ) -// MockDeleteManager is an autogenerated mock type for the DeleteManager type -type MockDeleteManager struct { +// mockDeleteManager is an autogenerated mock type for the deleteManager type +type mockDeleteManager struct { mock.Mock } -type MockDeleteManager_Expecter struct { +type mockDeleteManager_Expecter struct { mock *mock.Mock } -func (_m *MockDeleteManager) EXPECT() *MockDeleteManager_Expecter { - return &MockDeleteManager_Expecter{mock: &_m.Mock} +func (_m *mockDeleteManager) EXPECT() *mockDeleteManager_Expecter { + return &mockDeleteManager_Expecter{mock: &_m.Mock} } // Delete provides a mock function with given fields: ctx, component -func (_m *MockDeleteManager) Delete(ctx context.Context, component *v1.Component) error { +func (_m *mockDeleteManager) Delete(ctx context.Context, component *v1.Component) error { ret := _m.Called(ctx, component) var r0 error @@ -36,43 +36,43 @@ func (_m *MockDeleteManager) Delete(ctx context.Context, component *v1.Component return r0 } -// MockDeleteManager_Delete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Delete' -type MockDeleteManager_Delete_Call struct { +// mockDeleteManager_Delete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Delete' +type mockDeleteManager_Delete_Call struct { *mock.Call } // Delete is a helper method to define mock.On call // - ctx context.Context // - component *v1.Component -func (_e *MockDeleteManager_Expecter) Delete(ctx interface{}, component interface{}) *MockDeleteManager_Delete_Call { - return &MockDeleteManager_Delete_Call{Call: _e.mock.On("Delete", ctx, component)} +func (_e *mockDeleteManager_Expecter) Delete(ctx interface{}, component interface{}) *mockDeleteManager_Delete_Call { + return &mockDeleteManager_Delete_Call{Call: _e.mock.On("Delete", ctx, component)} } -func (_c *MockDeleteManager_Delete_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockDeleteManager_Delete_Call { +func (_c *mockDeleteManager_Delete_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockDeleteManager_Delete_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*v1.Component)) }) return _c } -func (_c *MockDeleteManager_Delete_Call) Return(_a0 error) *MockDeleteManager_Delete_Call { +func (_c *mockDeleteManager_Delete_Call) Return(_a0 error) *mockDeleteManager_Delete_Call { _c.Call.Return(_a0) return _c } -func (_c *MockDeleteManager_Delete_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *MockDeleteManager_Delete_Call { +func (_c *mockDeleteManager_Delete_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *mockDeleteManager_Delete_Call { _c.Call.Return(run) return _c } -type mockConstructorTestingTNewMockDeleteManager interface { +type mockConstructorTestingTnewMockDeleteManager interface { mock.TestingT Cleanup(func()) } -// NewMockDeleteManager creates a new instance of MockDeleteManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockDeleteManager(t mockConstructorTestingTNewMockDeleteManager) *MockDeleteManager { - mock := &MockDeleteManager{} +// newMockDeleteManager creates a new instance of mockDeleteManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockDeleteManager(t mockConstructorTestingTnewMockDeleteManager) *mockDeleteManager { + mock := &mockDeleteManager{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/pkg/controllers/mock_EventRecorder_test.go b/pkg/controllers/mock_eventRecorder_test.go similarity index 61% rename from pkg/controllers/mock_EventRecorder_test.go rename to pkg/controllers/mock_eventRecorder_test.go index 453badd..cd6de49 100644 --- a/pkg/controllers/mock_EventRecorder_test.go +++ b/pkg/controllers/mock_eventRecorder_test.go @@ -7,29 +7,29 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) -// MockEventRecorder is an autogenerated mock type for the EventRecorder type -type MockEventRecorder struct { +// mockEventRecorder is an autogenerated mock type for the eventRecorder type +type mockEventRecorder struct { mock.Mock } -type MockEventRecorder_Expecter struct { +type mockEventRecorder_Expecter struct { mock *mock.Mock } -func (_m *MockEventRecorder) EXPECT() *MockEventRecorder_Expecter { - return &MockEventRecorder_Expecter{mock: &_m.Mock} +func (_m *mockEventRecorder) EXPECT() *mockEventRecorder_Expecter { + return &mockEventRecorder_Expecter{mock: &_m.Mock} } // AnnotatedEventf provides a mock function with given fields: object, annotations, eventtype, reason, messageFmt, args -func (_m *MockEventRecorder) AnnotatedEventf(object runtime.Object, annotations map[string]string, eventtype string, reason string, messageFmt string, args ...interface{}) { +func (_m *mockEventRecorder) AnnotatedEventf(object runtime.Object, annotations map[string]string, eventtype string, reason string, messageFmt string, args ...interface{}) { var _ca []interface{} _ca = append(_ca, object, annotations, eventtype, reason, messageFmt) _ca = append(_ca, args...) _m.Called(_ca...) } -// MockEventRecorder_AnnotatedEventf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AnnotatedEventf' -type MockEventRecorder_AnnotatedEventf_Call struct { +// mockEventRecorder_AnnotatedEventf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AnnotatedEventf' +type mockEventRecorder_AnnotatedEventf_Call struct { *mock.Call } @@ -40,12 +40,12 @@ type MockEventRecorder_AnnotatedEventf_Call struct { // - reason string // - messageFmt string // - args ...interface{} -func (_e *MockEventRecorder_Expecter) AnnotatedEventf(object interface{}, annotations interface{}, eventtype interface{}, reason interface{}, messageFmt interface{}, args ...interface{}) *MockEventRecorder_AnnotatedEventf_Call { - return &MockEventRecorder_AnnotatedEventf_Call{Call: _e.mock.On("AnnotatedEventf", +func (_e *mockEventRecorder_Expecter) AnnotatedEventf(object interface{}, annotations interface{}, eventtype interface{}, reason interface{}, messageFmt interface{}, args ...interface{}) *mockEventRecorder_AnnotatedEventf_Call { + return &mockEventRecorder_AnnotatedEventf_Call{Call: _e.mock.On("AnnotatedEventf", append([]interface{}{object, annotations, eventtype, reason, messageFmt}, args...)...)} } -func (_c *MockEventRecorder_AnnotatedEventf_Call) Run(run func(object runtime.Object, annotations map[string]string, eventtype string, reason string, messageFmt string, args ...interface{})) *MockEventRecorder_AnnotatedEventf_Call { +func (_c *mockEventRecorder_AnnotatedEventf_Call) Run(run func(object runtime.Object, annotations map[string]string, eventtype string, reason string, messageFmt string, args ...interface{})) *mockEventRecorder_AnnotatedEventf_Call { _c.Call.Run(func(args mock.Arguments) { variadicArgs := make([]interface{}, len(args)-5) for i, a := range args[5:] { @@ -58,23 +58,23 @@ func (_c *MockEventRecorder_AnnotatedEventf_Call) Run(run func(object runtime.Ob return _c } -func (_c *MockEventRecorder_AnnotatedEventf_Call) Return() *MockEventRecorder_AnnotatedEventf_Call { +func (_c *mockEventRecorder_AnnotatedEventf_Call) Return() *mockEventRecorder_AnnotatedEventf_Call { _c.Call.Return() return _c } -func (_c *MockEventRecorder_AnnotatedEventf_Call) RunAndReturn(run func(runtime.Object, map[string]string, string, string, string, ...interface{})) *MockEventRecorder_AnnotatedEventf_Call { +func (_c *mockEventRecorder_AnnotatedEventf_Call) RunAndReturn(run func(runtime.Object, map[string]string, string, string, string, ...interface{})) *mockEventRecorder_AnnotatedEventf_Call { _c.Call.Return(run) return _c } // Event provides a mock function with given fields: object, eventtype, reason, message -func (_m *MockEventRecorder) Event(object runtime.Object, eventtype string, reason string, message string) { +func (_m *mockEventRecorder) Event(object runtime.Object, eventtype string, reason string, message string) { _m.Called(object, eventtype, reason, message) } -// MockEventRecorder_Event_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Event' -type MockEventRecorder_Event_Call struct { +// mockEventRecorder_Event_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Event' +type mockEventRecorder_Event_Call struct { *mock.Call } @@ -83,37 +83,37 @@ type MockEventRecorder_Event_Call struct { // - eventtype string // - reason string // - message string -func (_e *MockEventRecorder_Expecter) Event(object interface{}, eventtype interface{}, reason interface{}, message interface{}) *MockEventRecorder_Event_Call { - return &MockEventRecorder_Event_Call{Call: _e.mock.On("Event", object, eventtype, reason, message)} +func (_e *mockEventRecorder_Expecter) Event(object interface{}, eventtype interface{}, reason interface{}, message interface{}) *mockEventRecorder_Event_Call { + return &mockEventRecorder_Event_Call{Call: _e.mock.On("Event", object, eventtype, reason, message)} } -func (_c *MockEventRecorder_Event_Call) Run(run func(object runtime.Object, eventtype string, reason string, message string)) *MockEventRecorder_Event_Call { +func (_c *mockEventRecorder_Event_Call) Run(run func(object runtime.Object, eventtype string, reason string, message string)) *mockEventRecorder_Event_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(runtime.Object), args[1].(string), args[2].(string), args[3].(string)) }) return _c } -func (_c *MockEventRecorder_Event_Call) Return() *MockEventRecorder_Event_Call { +func (_c *mockEventRecorder_Event_Call) Return() *mockEventRecorder_Event_Call { _c.Call.Return() return _c } -func (_c *MockEventRecorder_Event_Call) RunAndReturn(run func(runtime.Object, string, string, string)) *MockEventRecorder_Event_Call { +func (_c *mockEventRecorder_Event_Call) RunAndReturn(run func(runtime.Object, string, string, string)) *mockEventRecorder_Event_Call { _c.Call.Return(run) return _c } // Eventf provides a mock function with given fields: object, eventtype, reason, messageFmt, args -func (_m *MockEventRecorder) Eventf(object runtime.Object, eventtype string, reason string, messageFmt string, args ...interface{}) { +func (_m *mockEventRecorder) Eventf(object runtime.Object, eventtype string, reason string, messageFmt string, args ...interface{}) { var _ca []interface{} _ca = append(_ca, object, eventtype, reason, messageFmt) _ca = append(_ca, args...) _m.Called(_ca...) } -// MockEventRecorder_Eventf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Eventf' -type MockEventRecorder_Eventf_Call struct { +// mockEventRecorder_Eventf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Eventf' +type mockEventRecorder_Eventf_Call struct { *mock.Call } @@ -123,12 +123,12 @@ type MockEventRecorder_Eventf_Call struct { // - reason string // - messageFmt string // - args ...interface{} -func (_e *MockEventRecorder_Expecter) Eventf(object interface{}, eventtype interface{}, reason interface{}, messageFmt interface{}, args ...interface{}) *MockEventRecorder_Eventf_Call { - return &MockEventRecorder_Eventf_Call{Call: _e.mock.On("Eventf", +func (_e *mockEventRecorder_Expecter) Eventf(object interface{}, eventtype interface{}, reason interface{}, messageFmt interface{}, args ...interface{}) *mockEventRecorder_Eventf_Call { + return &mockEventRecorder_Eventf_Call{Call: _e.mock.On("Eventf", append([]interface{}{object, eventtype, reason, messageFmt}, args...)...)} } -func (_c *MockEventRecorder_Eventf_Call) Run(run func(object runtime.Object, eventtype string, reason string, messageFmt string, args ...interface{})) *MockEventRecorder_Eventf_Call { +func (_c *mockEventRecorder_Eventf_Call) Run(run func(object runtime.Object, eventtype string, reason string, messageFmt string, args ...interface{})) *mockEventRecorder_Eventf_Call { _c.Call.Run(func(args mock.Arguments) { variadicArgs := make([]interface{}, len(args)-4) for i, a := range args[4:] { @@ -141,24 +141,24 @@ func (_c *MockEventRecorder_Eventf_Call) Run(run func(object runtime.Object, eve return _c } -func (_c *MockEventRecorder_Eventf_Call) Return() *MockEventRecorder_Eventf_Call { +func (_c *mockEventRecorder_Eventf_Call) Return() *mockEventRecorder_Eventf_Call { _c.Call.Return() return _c } -func (_c *MockEventRecorder_Eventf_Call) RunAndReturn(run func(runtime.Object, string, string, string, ...interface{})) *MockEventRecorder_Eventf_Call { +func (_c *mockEventRecorder_Eventf_Call) RunAndReturn(run func(runtime.Object, string, string, string, ...interface{})) *mockEventRecorder_Eventf_Call { _c.Call.Return(run) return _c } -type mockConstructorTestingTNewMockEventRecorder interface { +type mockConstructorTestingTnewMockEventRecorder interface { mock.TestingT Cleanup(func()) } -// NewMockEventRecorder creates a new instance of MockEventRecorder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockEventRecorder(t mockConstructorTestingTNewMockEventRecorder) *MockEventRecorder { - mock := &MockEventRecorder{} +// newMockEventRecorder creates a new instance of mockEventRecorder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockEventRecorder(t mockConstructorTestingTnewMockEventRecorder) *mockEventRecorder { + mock := &mockEventRecorder{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/pkg/controllers/mock_HelmClient_test.go b/pkg/controllers/mock_helmClient_test.go similarity index 53% rename from pkg/controllers/mock_HelmClient_test.go rename to pkg/controllers/mock_helmClient_test.go index 6684b66..5ebcd5e 100644 --- a/pkg/controllers/mock_HelmClient_test.go +++ b/pkg/controllers/mock_helmClient_test.go @@ -11,21 +11,21 @@ import ( v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" ) -// MockHelmClient is an autogenerated mock type for the HelmClient type -type MockHelmClient struct { +// mockHelmClient is an autogenerated mock type for the helmClient type +type mockHelmClient struct { mock.Mock } -type MockHelmClient_Expecter struct { +type mockHelmClient_Expecter struct { mock *mock.Mock } -func (_m *MockHelmClient) EXPECT() *MockHelmClient_Expecter { - return &MockHelmClient_Expecter{mock: &_m.Mock} +func (_m *mockHelmClient) EXPECT() *mockHelmClient_Expecter { + return &mockHelmClient_Expecter{mock: &_m.Mock} } // InstallOrUpgrade provides a mock function with given fields: ctx, component -func (_m *MockHelmClient) InstallOrUpgrade(ctx context.Context, component *v1.Component) error { +func (_m *mockHelmClient) InstallOrUpgrade(ctx context.Context, component *v1.Component) error { ret := _m.Called(ctx, component) var r0 error @@ -38,37 +38,37 @@ func (_m *MockHelmClient) InstallOrUpgrade(ctx context.Context, component *v1.Co return r0 } -// MockHelmClient_InstallOrUpgrade_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InstallOrUpgrade' -type MockHelmClient_InstallOrUpgrade_Call struct { +// mockHelmClient_InstallOrUpgrade_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InstallOrUpgrade' +type mockHelmClient_InstallOrUpgrade_Call struct { *mock.Call } // InstallOrUpgrade is a helper method to define mock.On call // - ctx context.Context // - component *v1.Component -func (_e *MockHelmClient_Expecter) InstallOrUpgrade(ctx interface{}, component interface{}) *MockHelmClient_InstallOrUpgrade_Call { - return &MockHelmClient_InstallOrUpgrade_Call{Call: _e.mock.On("InstallOrUpgrade", ctx, component)} +func (_e *mockHelmClient_Expecter) InstallOrUpgrade(ctx interface{}, component interface{}) *mockHelmClient_InstallOrUpgrade_Call { + return &mockHelmClient_InstallOrUpgrade_Call{Call: _e.mock.On("InstallOrUpgrade", ctx, component)} } -func (_c *MockHelmClient_InstallOrUpgrade_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockHelmClient_InstallOrUpgrade_Call { +func (_c *mockHelmClient_InstallOrUpgrade_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockHelmClient_InstallOrUpgrade_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*v1.Component)) }) return _c } -func (_c *MockHelmClient_InstallOrUpgrade_Call) Return(_a0 error) *MockHelmClient_InstallOrUpgrade_Call { +func (_c *mockHelmClient_InstallOrUpgrade_Call) Return(_a0 error) *mockHelmClient_InstallOrUpgrade_Call { _c.Call.Return(_a0) return _c } -func (_c *MockHelmClient_InstallOrUpgrade_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *MockHelmClient_InstallOrUpgrade_Call { +func (_c *mockHelmClient_InstallOrUpgrade_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *mockHelmClient_InstallOrUpgrade_Call { _c.Call.Return(run) return _c } // ListDeployedReleases provides a mock function with given fields: -func (_m *MockHelmClient) ListDeployedReleases() ([]*release.Release, error) { +func (_m *mockHelmClient) ListDeployedReleases() ([]*release.Release, error) { ret := _m.Called() var r0 []*release.Release @@ -93,35 +93,35 @@ func (_m *MockHelmClient) ListDeployedReleases() ([]*release.Release, error) { return r0, r1 } -// MockHelmClient_ListDeployedReleases_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListDeployedReleases' -type MockHelmClient_ListDeployedReleases_Call struct { +// mockHelmClient_ListDeployedReleases_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListDeployedReleases' +type mockHelmClient_ListDeployedReleases_Call struct { *mock.Call } // ListDeployedReleases is a helper method to define mock.On call -func (_e *MockHelmClient_Expecter) ListDeployedReleases() *MockHelmClient_ListDeployedReleases_Call { - return &MockHelmClient_ListDeployedReleases_Call{Call: _e.mock.On("ListDeployedReleases")} +func (_e *mockHelmClient_Expecter) ListDeployedReleases() *mockHelmClient_ListDeployedReleases_Call { + return &mockHelmClient_ListDeployedReleases_Call{Call: _e.mock.On("ListDeployedReleases")} } -func (_c *MockHelmClient_ListDeployedReleases_Call) Run(run func()) *MockHelmClient_ListDeployedReleases_Call { +func (_c *mockHelmClient_ListDeployedReleases_Call) Run(run func()) *mockHelmClient_ListDeployedReleases_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *MockHelmClient_ListDeployedReleases_Call) Return(_a0 []*release.Release, _a1 error) *MockHelmClient_ListDeployedReleases_Call { +func (_c *mockHelmClient_ListDeployedReleases_Call) Return(_a0 []*release.Release, _a1 error) *mockHelmClient_ListDeployedReleases_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *MockHelmClient_ListDeployedReleases_Call) RunAndReturn(run func() ([]*release.Release, error)) *MockHelmClient_ListDeployedReleases_Call { +func (_c *mockHelmClient_ListDeployedReleases_Call) RunAndReturn(run func() ([]*release.Release, error)) *mockHelmClient_ListDeployedReleases_Call { _c.Call.Return(run) return _c } // SatisfiesDependencies provides a mock function with given fields: ctx, component -func (_m *MockHelmClient) SatisfiesDependencies(ctx context.Context, component *v1.Component) error { +func (_m *mockHelmClient) SatisfiesDependencies(ctx context.Context, component *v1.Component) error { ret := _m.Called(ctx, component) var r0 error @@ -134,37 +134,37 @@ func (_m *MockHelmClient) SatisfiesDependencies(ctx context.Context, component * return r0 } -// MockHelmClient_SatisfiesDependencies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SatisfiesDependencies' -type MockHelmClient_SatisfiesDependencies_Call struct { +// mockHelmClient_SatisfiesDependencies_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SatisfiesDependencies' +type mockHelmClient_SatisfiesDependencies_Call struct { *mock.Call } // SatisfiesDependencies is a helper method to define mock.On call // - ctx context.Context // - component *v1.Component -func (_e *MockHelmClient_Expecter) SatisfiesDependencies(ctx interface{}, component interface{}) *MockHelmClient_SatisfiesDependencies_Call { - return &MockHelmClient_SatisfiesDependencies_Call{Call: _e.mock.On("SatisfiesDependencies", ctx, component)} +func (_e *mockHelmClient_Expecter) SatisfiesDependencies(ctx interface{}, component interface{}) *mockHelmClient_SatisfiesDependencies_Call { + return &mockHelmClient_SatisfiesDependencies_Call{Call: _e.mock.On("SatisfiesDependencies", ctx, component)} } -func (_c *MockHelmClient_SatisfiesDependencies_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockHelmClient_SatisfiesDependencies_Call { +func (_c *mockHelmClient_SatisfiesDependencies_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockHelmClient_SatisfiesDependencies_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*v1.Component)) }) return _c } -func (_c *MockHelmClient_SatisfiesDependencies_Call) Return(_a0 error) *MockHelmClient_SatisfiesDependencies_Call { +func (_c *mockHelmClient_SatisfiesDependencies_Call) Return(_a0 error) *mockHelmClient_SatisfiesDependencies_Call { _c.Call.Return(_a0) return _c } -func (_c *MockHelmClient_SatisfiesDependencies_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *MockHelmClient_SatisfiesDependencies_Call { +func (_c *mockHelmClient_SatisfiesDependencies_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *mockHelmClient_SatisfiesDependencies_Call { _c.Call.Return(run) return _c } // Uninstall provides a mock function with given fields: component -func (_m *MockHelmClient) Uninstall(component *v1.Component) error { +func (_m *mockHelmClient) Uninstall(component *v1.Component) error { ret := _m.Called(component) var r0 error @@ -177,42 +177,42 @@ func (_m *MockHelmClient) Uninstall(component *v1.Component) error { return r0 } -// MockHelmClient_Uninstall_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Uninstall' -type MockHelmClient_Uninstall_Call struct { +// mockHelmClient_Uninstall_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Uninstall' +type mockHelmClient_Uninstall_Call struct { *mock.Call } // Uninstall is a helper method to define mock.On call // - component *v1.Component -func (_e *MockHelmClient_Expecter) Uninstall(component interface{}) *MockHelmClient_Uninstall_Call { - return &MockHelmClient_Uninstall_Call{Call: _e.mock.On("Uninstall", component)} +func (_e *mockHelmClient_Expecter) Uninstall(component interface{}) *mockHelmClient_Uninstall_Call { + return &mockHelmClient_Uninstall_Call{Call: _e.mock.On("Uninstall", component)} } -func (_c *MockHelmClient_Uninstall_Call) Run(run func(component *v1.Component)) *MockHelmClient_Uninstall_Call { +func (_c *mockHelmClient_Uninstall_Call) Run(run func(component *v1.Component)) *mockHelmClient_Uninstall_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(*v1.Component)) }) return _c } -func (_c *MockHelmClient_Uninstall_Call) Return(_a0 error) *MockHelmClient_Uninstall_Call { +func (_c *mockHelmClient_Uninstall_Call) Return(_a0 error) *mockHelmClient_Uninstall_Call { _c.Call.Return(_a0) return _c } -func (_c *MockHelmClient_Uninstall_Call) RunAndReturn(run func(*v1.Component) error) *MockHelmClient_Uninstall_Call { +func (_c *mockHelmClient_Uninstall_Call) RunAndReturn(run func(*v1.Component) error) *mockHelmClient_Uninstall_Call { _c.Call.Return(run) return _c } -type mockConstructorTestingTNewMockHelmClient interface { +type mockConstructorTestingTnewMockHelmClient interface { mock.TestingT Cleanup(func()) } -// NewMockHelmClient creates a new instance of MockHelmClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockHelmClient(t mockConstructorTestingTNewMockHelmClient) *MockHelmClient { - mock := &MockHelmClient{} +// newMockHelmClient creates a new instance of mockHelmClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockHelmClient(t mockConstructorTestingTnewMockHelmClient) *mockHelmClient { + mock := &mockHelmClient{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/pkg/controllers/mock_InstallManager_test.go b/pkg/controllers/mock_installManager_test.go similarity index 51% rename from pkg/controllers/mock_InstallManager_test.go rename to pkg/controllers/mock_installManager_test.go index 372b3e5..492536c 100644 --- a/pkg/controllers/mock_InstallManager_test.go +++ b/pkg/controllers/mock_installManager_test.go @@ -9,21 +9,21 @@ import ( mock "github.com/stretchr/testify/mock" ) -// MockInstallManager is an autogenerated mock type for the InstallManager type -type MockInstallManager struct { +// mockInstallManager is an autogenerated mock type for the installManager type +type mockInstallManager struct { mock.Mock } -type MockInstallManager_Expecter struct { +type mockInstallManager_Expecter struct { mock *mock.Mock } -func (_m *MockInstallManager) EXPECT() *MockInstallManager_Expecter { - return &MockInstallManager_Expecter{mock: &_m.Mock} +func (_m *mockInstallManager) EXPECT() *mockInstallManager_Expecter { + return &mockInstallManager_Expecter{mock: &_m.Mock} } // Install provides a mock function with given fields: ctx, component -func (_m *MockInstallManager) Install(ctx context.Context, component *v1.Component) error { +func (_m *mockInstallManager) Install(ctx context.Context, component *v1.Component) error { ret := _m.Called(ctx, component) var r0 error @@ -36,43 +36,43 @@ func (_m *MockInstallManager) Install(ctx context.Context, component *v1.Compone return r0 } -// MockInstallManager_Install_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Install' -type MockInstallManager_Install_Call struct { +// mockInstallManager_Install_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Install' +type mockInstallManager_Install_Call struct { *mock.Call } // Install is a helper method to define mock.On call // - ctx context.Context // - component *v1.Component -func (_e *MockInstallManager_Expecter) Install(ctx interface{}, component interface{}) *MockInstallManager_Install_Call { - return &MockInstallManager_Install_Call{Call: _e.mock.On("Install", ctx, component)} +func (_e *mockInstallManager_Expecter) Install(ctx interface{}, component interface{}) *mockInstallManager_Install_Call { + return &mockInstallManager_Install_Call{Call: _e.mock.On("Install", ctx, component)} } -func (_c *MockInstallManager_Install_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockInstallManager_Install_Call { +func (_c *mockInstallManager_Install_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockInstallManager_Install_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*v1.Component)) }) return _c } -func (_c *MockInstallManager_Install_Call) Return(_a0 error) *MockInstallManager_Install_Call { +func (_c *mockInstallManager_Install_Call) Return(_a0 error) *mockInstallManager_Install_Call { _c.Call.Return(_a0) return _c } -func (_c *MockInstallManager_Install_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *MockInstallManager_Install_Call { +func (_c *mockInstallManager_Install_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *mockInstallManager_Install_Call { _c.Call.Return(run) return _c } -type mockConstructorTestingTNewMockInstallManager interface { +type mockConstructorTestingTnewMockInstallManager interface { mock.TestingT Cleanup(func()) } -// NewMockInstallManager creates a new instance of MockInstallManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockInstallManager(t mockConstructorTestingTNewMockInstallManager) *MockInstallManager { - mock := &MockInstallManager{} +// newMockInstallManager creates a new instance of mockInstallManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockInstallManager(t mockConstructorTestingTnewMockInstallManager) *mockInstallManager { + mock := &mockInstallManager{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/pkg/controllers/mock_requeuableError_test.go b/pkg/controllers/mock_requeuableError_test.go new file mode 100644 index 0000000..bd293e8 --- /dev/null +++ b/pkg/controllers/mock_requeuableError_test.go @@ -0,0 +1,119 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package controllers + +import ( + time "time" + + mock "github.com/stretchr/testify/mock" +) + +// mockRequeuableError is an autogenerated mock type for the requeuableError type +type mockRequeuableError struct { + mock.Mock +} + +type mockRequeuableError_Expecter struct { + mock *mock.Mock +} + +func (_m *mockRequeuableError) EXPECT() *mockRequeuableError_Expecter { + return &mockRequeuableError_Expecter{mock: &_m.Mock} +} + +// Error provides a mock function with given fields: +func (_m *mockRequeuableError) Error() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// mockRequeuableError_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error' +type mockRequeuableError_Error_Call struct { + *mock.Call +} + +// Error is a helper method to define mock.On call +func (_e *mockRequeuableError_Expecter) Error() *mockRequeuableError_Error_Call { + return &mockRequeuableError_Error_Call{Call: _e.mock.On("Error")} +} + +func (_c *mockRequeuableError_Error_Call) Run(run func()) *mockRequeuableError_Error_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockRequeuableError_Error_Call) Return(_a0 string) *mockRequeuableError_Error_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockRequeuableError_Error_Call) RunAndReturn(run func() string) *mockRequeuableError_Error_Call { + _c.Call.Return(run) + return _c +} + +// GetRequeueTime provides a mock function with given fields: +func (_m *mockRequeuableError) GetRequeueTime() time.Duration { + ret := _m.Called() + + var r0 time.Duration + if rf, ok := ret.Get(0).(func() time.Duration); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(time.Duration) + } + + return r0 +} + +// mockRequeuableError_GetRequeueTime_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRequeueTime' +type mockRequeuableError_GetRequeueTime_Call struct { + *mock.Call +} + +// GetRequeueTime is a helper method to define mock.On call +func (_e *mockRequeuableError_Expecter) GetRequeueTime() *mockRequeuableError_GetRequeueTime_Call { + return &mockRequeuableError_GetRequeueTime_Call{Call: _e.mock.On("GetRequeueTime")} +} + +func (_c *mockRequeuableError_GetRequeueTime_Call) Run(run func()) *mockRequeuableError_GetRequeueTime_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockRequeuableError_GetRequeueTime_Call) Return(_a0 time.Duration) *mockRequeuableError_GetRequeueTime_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockRequeuableError_GetRequeueTime_Call) RunAndReturn(run func() time.Duration) *mockRequeuableError_GetRequeueTime_Call { + _c.Call.Return(run) + return _c +} + +type mockConstructorTestingTnewMockRequeuableError interface { + mock.TestingT + Cleanup(func()) +} + +// newMockRequeuableError creates a new instance of mockRequeuableError. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockRequeuableError(t mockConstructorTestingTnewMockRequeuableError) *mockRequeuableError { + mock := &mockRequeuableError{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/pkg/controllers/mock_requeueHandler_test.go b/pkg/controllers/mock_requeueHandler_test.go new file mode 100644 index 0000000..e3470d2 --- /dev/null +++ b/pkg/controllers/mock_requeueHandler_test.go @@ -0,0 +1,96 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package controllers + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + reconcile "sigs.k8s.io/controller-runtime/pkg/reconcile" + + v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" +) + +// mockRequeueHandler is an autogenerated mock type for the requeueHandler type +type mockRequeueHandler struct { + mock.Mock +} + +type mockRequeueHandler_Expecter struct { + mock *mock.Mock +} + +func (_m *mockRequeueHandler) EXPECT() *mockRequeueHandler_Expecter { + return &mockRequeueHandler_Expecter{mock: &_m.Mock} +} + +// Handle provides a mock function with given fields: ctx, contextMessage, componentResource, originalErr, onRequeue +func (_m *mockRequeueHandler) Handle(ctx context.Context, contextMessage string, componentResource *v1.Component, originalErr error, onRequeue func()) (reconcile.Result, error) { + ret := _m.Called(ctx, contextMessage, componentResource, originalErr, onRequeue) + + var r0 reconcile.Result + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, *v1.Component, error, func()) (reconcile.Result, error)); ok { + return rf(ctx, contextMessage, componentResource, originalErr, onRequeue) + } + if rf, ok := ret.Get(0).(func(context.Context, string, *v1.Component, error, func()) reconcile.Result); ok { + r0 = rf(ctx, contextMessage, componentResource, originalErr, onRequeue) + } else { + r0 = ret.Get(0).(reconcile.Result) + } + + if rf, ok := ret.Get(1).(func(context.Context, string, *v1.Component, error, func()) error); ok { + r1 = rf(ctx, contextMessage, componentResource, originalErr, onRequeue) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockRequeueHandler_Handle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Handle' +type mockRequeueHandler_Handle_Call struct { + *mock.Call +} + +// Handle is a helper method to define mock.On call +// - ctx context.Context +// - contextMessage string +// - componentResource *v1.Component +// - originalErr error +// - onRequeue func() +func (_e *mockRequeueHandler_Expecter) Handle(ctx interface{}, contextMessage interface{}, componentResource interface{}, originalErr interface{}, onRequeue interface{}) *mockRequeueHandler_Handle_Call { + return &mockRequeueHandler_Handle_Call{Call: _e.mock.On("Handle", ctx, contextMessage, componentResource, originalErr, onRequeue)} +} + +func (_c *mockRequeueHandler_Handle_Call) Run(run func(ctx context.Context, contextMessage string, componentResource *v1.Component, originalErr error, onRequeue func())) *mockRequeueHandler_Handle_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(*v1.Component), args[3].(error), args[4].(func())) + }) + return _c +} + +func (_c *mockRequeueHandler_Handle_Call) Return(_a0 reconcile.Result, _a1 error) *mockRequeueHandler_Handle_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockRequeueHandler_Handle_Call) RunAndReturn(run func(context.Context, string, *v1.Component, error, func()) (reconcile.Result, error)) *mockRequeueHandler_Handle_Call { + _c.Call.Return(run) + return _c +} + +type mockConstructorTestingTnewMockRequeueHandler interface { + mock.TestingT + Cleanup(func()) +} + +// newMockRequeueHandler creates a new instance of mockRequeueHandler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockRequeueHandler(t mockConstructorTestingTnewMockRequeueHandler) *mockRequeueHandler { + mock := &mockRequeueHandler{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/pkg/controllers/mock_UpgradeManager_test.go b/pkg/controllers/mock_upgradeManager_test.go similarity index 51% rename from pkg/controllers/mock_UpgradeManager_test.go rename to pkg/controllers/mock_upgradeManager_test.go index 7214e75..f5c3a16 100644 --- a/pkg/controllers/mock_UpgradeManager_test.go +++ b/pkg/controllers/mock_upgradeManager_test.go @@ -9,21 +9,21 @@ import ( mock "github.com/stretchr/testify/mock" ) -// MockUpgradeManager is an autogenerated mock type for the UpgradeManager type -type MockUpgradeManager struct { +// mockUpgradeManager is an autogenerated mock type for the upgradeManager type +type mockUpgradeManager struct { mock.Mock } -type MockUpgradeManager_Expecter struct { +type mockUpgradeManager_Expecter struct { mock *mock.Mock } -func (_m *MockUpgradeManager) EXPECT() *MockUpgradeManager_Expecter { - return &MockUpgradeManager_Expecter{mock: &_m.Mock} +func (_m *mockUpgradeManager) EXPECT() *mockUpgradeManager_Expecter { + return &mockUpgradeManager_Expecter{mock: &_m.Mock} } // Upgrade provides a mock function with given fields: ctx, component -func (_m *MockUpgradeManager) Upgrade(ctx context.Context, component *v1.Component) error { +func (_m *mockUpgradeManager) Upgrade(ctx context.Context, component *v1.Component) error { ret := _m.Called(ctx, component) var r0 error @@ -36,43 +36,43 @@ func (_m *MockUpgradeManager) Upgrade(ctx context.Context, component *v1.Compone return r0 } -// MockUpgradeManager_Upgrade_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Upgrade' -type MockUpgradeManager_Upgrade_Call struct { +// mockUpgradeManager_Upgrade_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Upgrade' +type mockUpgradeManager_Upgrade_Call struct { *mock.Call } // Upgrade is a helper method to define mock.On call // - ctx context.Context // - component *v1.Component -func (_e *MockUpgradeManager_Expecter) Upgrade(ctx interface{}, component interface{}) *MockUpgradeManager_Upgrade_Call { - return &MockUpgradeManager_Upgrade_Call{Call: _e.mock.On("Upgrade", ctx, component)} +func (_e *mockUpgradeManager_Expecter) Upgrade(ctx interface{}, component interface{}) *mockUpgradeManager_Upgrade_Call { + return &mockUpgradeManager_Upgrade_Call{Call: _e.mock.On("Upgrade", ctx, component)} } -func (_c *MockUpgradeManager_Upgrade_Call) Run(run func(ctx context.Context, component *v1.Component)) *MockUpgradeManager_Upgrade_Call { +func (_c *mockUpgradeManager_Upgrade_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockUpgradeManager_Upgrade_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*v1.Component)) }) return _c } -func (_c *MockUpgradeManager_Upgrade_Call) Return(_a0 error) *MockUpgradeManager_Upgrade_Call { +func (_c *mockUpgradeManager_Upgrade_Call) Return(_a0 error) *mockUpgradeManager_Upgrade_Call { _c.Call.Return(_a0) return _c } -func (_c *MockUpgradeManager_Upgrade_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *MockUpgradeManager_Upgrade_Call { +func (_c *mockUpgradeManager_Upgrade_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *mockUpgradeManager_Upgrade_Call { _c.Call.Return(run) return _c } -type mockConstructorTestingTNewMockUpgradeManager interface { +type mockConstructorTestingTnewMockUpgradeManager interface { mock.TestingT Cleanup(func()) } -// NewMockUpgradeManager creates a new instance of MockUpgradeManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockUpgradeManager(t mockConstructorTestingTNewMockUpgradeManager) *MockUpgradeManager { - mock := &MockUpgradeManager{} +// newMockUpgradeManager creates a new instance of mockUpgradeManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockUpgradeManager(t mockConstructorTestingTnewMockUpgradeManager) *mockUpgradeManager { + mock := &mockUpgradeManager{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/pkg/controllers/requeueHandler.go b/pkg/controllers/requeueHandler.go new file mode 100644 index 0000000..c70c9b4 --- /dev/null +++ b/pkg/controllers/requeueHandler.go @@ -0,0 +1,63 @@ +package controllers + +import ( + "context" + "errors" + "fmt" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/tools/record" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/log" + + k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" +) + +// componentRequeueHandler is responsible to requeue a dogu resource after it failed. +type componentRequeueHandler struct { + clientSet componentEcosystemInterface + namespace string + recorder record.EventRecorder +} + +// NewComponentRequeueHandler creates a new dogu requeue handler. +func NewComponentRequeueHandler(clientSet componentEcosystemInterface, recorder record.EventRecorder, namespace string) *componentRequeueHandler { + return &componentRequeueHandler{ + clientSet: clientSet, + namespace: namespace, + recorder: recorder, + } +} + +// Handle takes an error and handles the requeue process for the current dogu operation. +func (d *componentRequeueHandler) Handle(ctx context.Context, contextMessage string, component *k8sv1.Component, originalErr error, onRequeue func()) (ctrl.Result, error) { + requeueable, requeueableErr := shouldRequeue(originalErr) + if !requeueable { + return ctrl.Result{}, nil + } + if onRequeue != nil { + onRequeue() + } + + _, updateError := d.clientSet.ComponentV1Alpha1().Components(d.namespace).UpdateStatus(ctx, component, metav1.UpdateOptions{}) + if updateError != nil { + return ctrl.Result{}, fmt.Errorf("failed to update component status: %w", updateError) + } + + requeueTime := requeueableErr.GetRequeueTime() + result := ctrl.Result{Requeue: true, RequeueAfter: requeueTime} + d.fireRequeueEvent(component, result) + + log.FromContext(ctx).Info(fmt.Sprintf("%s: requeue in %s seconds because of: %s", contextMessage, requeueTime, originalErr.Error())) + + return result, nil +} + +func shouldRequeue(err error) (bool, requeuableError) { + var requeueableError requeuableError + return errors.As(err, &requeueableError), requeueableError +} + +func (d *componentRequeueHandler) fireRequeueEvent(component *k8sv1.Component, result ctrl.Result) { + d.recorder.Eventf(component, v1.EventTypeNormal, RequeueEventReason, "Trying again in %s.", result.RequeueAfter.String()) +} diff --git a/pkg/controllers/requeueHandler_test.go b/pkg/controllers/requeueHandler_test.go new file mode 100644 index 0000000..b15d3f0 --- /dev/null +++ b/pkg/controllers/requeueHandler_test.go @@ -0,0 +1,119 @@ +package controllers + +import ( + "context" + v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "testing" + "time" +) + +var testCtx = context.Background() + +func Test_componentRequeueHandler_Handle(t *testing.T) { + t.Run("should exit early if there is no error", func(t *testing.T) { + // given + sut := &componentRequeueHandler{} + var originalErr error = nil + + // when + actual, err := sut.Handle(testCtx, "", nil, originalErr, nil) + + // then + require.NoError(t, err) + assert.Equal(t, reconcile.Result{Requeue: false, RequeueAfter: 0}, actual) + }) + t.Run("should exit early if error is not requeuable", func(t *testing.T) { + // given + sut := &componentRequeueHandler{} + var originalErr = assert.AnError + + // when + actual, err := sut.Handle(testCtx, "", nil, originalErr, nil) + + // then + require.NoError(t, err) + assert.Equal(t, reconcile.Result{Requeue: false, RequeueAfter: 0}, actual) + }) + t.Run("should fail to update component status", func(t *testing.T) { + // given + component := createComponent("k8s-dogu-operator", "official", "1.2.3") + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().UpdateStatus(testCtx, component, metav1.UpdateOptions{}).Return(nil, assert.AnError) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + sut := &componentRequeueHandler{namespace: testNamespace, clientSet: clientSetMock} + + requeueErrMock := newMockRequeuableError(t) + + onRequeueExecuted := false + onRequeue := func() { + onRequeueExecuted = true + } + + // when + actual, err := sut.Handle(testCtx, "", component, requeueErrMock, onRequeue) + + // then + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + assert.ErrorContains(t, err, "failed to update component status") + + assert.Equal(t, reconcile.Result{Requeue: false, RequeueAfter: 0}, actual) + assert.True(t, onRequeueExecuted, "onRequeue function should have been executed") + }) + t.Run("should succeed", func(t *testing.T) { + // given + component := createComponent("k8s-dogu-operator", "official", "1.2.3") + + componentInterfaceMock := newMockComponentInterface(t) + componentInterfaceMock.EXPECT().UpdateStatus(testCtx, component, metav1.UpdateOptions{}).Return(component, nil) + componentClientGetterMock := newMockComponentV1Alpha1Interface(t) + componentClientGetterMock.EXPECT().Components(testNamespace).Return(componentInterfaceMock) + clientSetMock := newMockComponentEcosystemInterface(t) + clientSetMock.EXPECT().ComponentV1Alpha1().Return(componentClientGetterMock) + + recorderMock := newMockEventRecorder(t) + recorderMock.EXPECT().Eventf(component, "Normal", "Requeue", "Trying again in %s.", "1s") + + sut := &componentRequeueHandler{namespace: testNamespace, clientSet: clientSetMock, recorder: recorderMock} + + requeueErrMock := newMockRequeuableError(t) + requeueErrMock.EXPECT().GetRequeueTime().Return(time.Second) + requeueErrMock.EXPECT().Error().Return("my error") + + onRequeueExecuted := false + onRequeue := func() { + onRequeueExecuted = true + } + + // when + actual, err := sut.Handle(testCtx, "", component, requeueErrMock, onRequeue) + + // then + require.NoError(t, err) + + assert.Equal(t, reconcile.Result{Requeue: true, RequeueAfter: 1000000000}, actual) + assert.True(t, onRequeueExecuted, "onRequeue function should have been executed") + }) +} + +func createComponent(name, namespace, version string) *v1.Component { + return &v1.Component{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1.ComponentSpec{ + Namespace: namespace, + Name: name, + Version: version, + }, + } +} diff --git a/pkg/helm/client_test.go b/pkg/helm/client_test.go index c81cc59..1240ff6 100644 --- a/pkg/helm/client_test.go +++ b/pkg/helm/client_test.go @@ -2,16 +2,19 @@ package helm import ( "context" + "testing" + k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" "github.com/cloudogu/k8s-component-operator/pkg/config" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "helm.sh/helm/v3/pkg/release" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" - "testing" ) func TestNew(t *testing.T) { @@ -104,7 +107,7 @@ func TestClient_InstallOrUpgrade(t *testing.T) { require.Error(t, err) assert.ErrorIs(t, err, assert.AnError) - assert.ErrorContains(t, err, "error while installOrUpgrade chart testComponent") + assert.ErrorContains(t, err, "error while installOrUpgrade component testing/testComponent:0.1.1") }) } From e595c58a0864c64b60245ddc1e3b8b1bd2d71ee0 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Wed, 16 Aug 2023 15:57:23 +0200 Subject: [PATCH 04/47] #15 return requeueable errors from install manager The component CR status is used to hold the state of the respective time when the CR should be requeued. The interval doubles until a threshold is reached; then only a fixed interval will be used. The initial value of 15 seconds was plain guessed, so there was no deep thinking about that value. Co-authored-by: Jeremias Weber --- .../bases/k8s.cloudogu.com_components.yaml | 5 ++ config/manager/kustomization.yaml | 14 ++-- pkg/api/v1/ces_component_types.go | 2 + pkg/api/v1/k8s.cloudogu.com_components.yaml | 5 ++ pkg/controllers/componentInstallManager.go | 11 ++- pkg/controllers/interfaces.go | 5 +- pkg/controllers/mock_requeuableError_test.go | 21 ++--- pkg/controllers/requeableErrors.go | 62 ++++++++++++++ pkg/controllers/requeableErrors_test.go | 80 +++++++++++++++++++ pkg/controllers/requeueHandler.go | 2 +- pkg/controllers/requeueHandler_test.go | 12 ++- 11 files changed, 188 insertions(+), 31 deletions(-) create mode 100644 pkg/controllers/requeableErrors.go create mode 100644 pkg/controllers/requeableErrors_test.go diff --git a/config/crd/bases/k8s.cloudogu.com_components.yaml b/config/crd/bases/k8s.cloudogu.com_components.yaml index 2417fcf..e96cd16 100644 --- a/config/crd/bases/k8s.cloudogu.com_components.yaml +++ b/config/crd/bases/k8s.cloudogu.com_components.yaml @@ -48,6 +48,11 @@ spec: status: description: ComponentStatus defines the observed state of a Component. properties: + requeueTimeNanos: + description: RequeueTimeNanos contains the time in nanoseconds to + wait until the next requeue. + format: int64 + type: integer status: description: Status represents the state of the component in the ecosystem. type: string diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index 7236b9b..c664e9a 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -1,14 +1,14 @@ resources: - - manager.yaml +- manager.yaml generatorOptions: disableNameSuffixHash: true configMapGenerator: - - files: - - controller_manager_config.yaml - name: manager-config +- files: + - controller_manager_config.yaml + name: manager-config apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - - name: controller - newName: cloudogu/k8s-component-operator - newTag: 0.0.2 +- name: controller + newName: cloudogu/k8s-component-operator + newTag: 0.0.2 diff --git a/pkg/api/v1/ces_component_types.go b/pkg/api/v1/ces_component_types.go index a9a3c4e..14f7153 100644 --- a/pkg/api/v1/ces_component_types.go +++ b/pkg/api/v1/ces_component_types.go @@ -47,6 +47,8 @@ type ComponentSpec struct { type ComponentStatus struct { // Status represents the state of the component in the ecosystem. Status string `json:"status"` + // RequeueTimeNanos contains the time in nanoseconds to wait until the next requeue. + RequeueTimeNanos time.Duration `json:"requeueTimeNanos,omitempty"` } // +kubebuilder:object:root=true diff --git a/pkg/api/v1/k8s.cloudogu.com_components.yaml b/pkg/api/v1/k8s.cloudogu.com_components.yaml index 2417fcf..e96cd16 100644 --- a/pkg/api/v1/k8s.cloudogu.com_components.yaml +++ b/pkg/api/v1/k8s.cloudogu.com_components.yaml @@ -48,6 +48,11 @@ spec: status: description: ComponentStatus defines the observed state of a Component. properties: + requeueTimeNanos: + description: RequeueTimeNanos contains the time in nanoseconds to + wait until the next requeue. + format: int64 + type: integer status: description: Status represents the state of the component in the ecosystem. type: string diff --git a/pkg/controllers/componentInstallManager.go b/pkg/controllers/componentInstallManager.go index bc788b0..8aff400 100644 --- a/pkg/controllers/componentInstallManager.go +++ b/pkg/controllers/componentInstallManager.go @@ -35,13 +35,12 @@ func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv err := cim.helmClient.SatisfiesDependencies(ctx, component) if err != nil { cim.recorder.Eventf(component, corev1.EventTypeWarning, InstallEventReason, "One or more dependencies are not satisfied: %s", err.Error()) - // TODO implement requeueable error with timing and state and return an error instance here instead - return fmt.Errorf("one or more dependencies are not satisfied: %w", err) + return &dependencyUnsatisfiedError{err: err} } component, err = cim.componentClient.UpdateStatusInstalling(ctx, component) if err != nil { - return fmt.Errorf("failed to set status installing: %w", err) + return &genericRequeueableError{errMsg: "failed to set status installing", err: err} } // Set the finalizer at the beginning of the installation procedure. @@ -50,7 +49,7 @@ func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv // deletion procedure from the controller. component, err = cim.componentClient.AddFinalizer(ctx, component, k8sv1.FinalizerName) if err != nil { - return fmt.Errorf("failed to add finalizer %s: %w", k8sv1.FinalizerName, err) + return &genericRequeueableError{"failed to add finalizer " + k8sv1.FinalizerName, err} } logger.Info("Install helm chart...") @@ -59,12 +58,12 @@ func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv helmCtx := context.Background() if err := cim.helmClient.InstallOrUpgrade(helmCtx, component); err != nil { - return fmt.Errorf("failed to install chart for component %s: %w", component.Spec.Name, err) + return &genericRequeueableError{"failed to install chart for component " + component.Spec.Name, err} } component, err = cim.componentClient.UpdateStatusInstalled(helmCtx, component) if err != nil { - return fmt.Errorf("failed to update status-installed for component %s: %w", component.Spec.Name, err) + return &genericRequeueableError{"failed to update status-installed for component " + component.Spec.Name, err} } logger.Info(fmt.Sprintf("Installed component %s.", component.Spec.Name)) diff --git a/pkg/controllers/interfaces.go b/pkg/controllers/interfaces.go index 94804f4..5578486 100644 --- a/pkg/controllers/interfaces.go +++ b/pkg/controllers/interfaces.go @@ -64,7 +64,6 @@ type componentInterface interface { // requeuableError indicates that the current error requires the operator to requeue the dogu. type requeuableError interface { error - // GetRequeueTime return the time to wait before the next reconciliation. The constant ExponentialRequeueTime indicates - // that the requeue time increased exponentially. - GetRequeueTime() time.Duration + // GetRequeueTime returns the time to wait before the next reconciliation. + GetRequeueTime(requeueTimeNanos time.Duration) time.Duration } diff --git a/pkg/controllers/mock_requeuableError_test.go b/pkg/controllers/mock_requeuableError_test.go index bd293e8..9f2fe87 100644 --- a/pkg/controllers/mock_requeuableError_test.go +++ b/pkg/controllers/mock_requeuableError_test.go @@ -62,13 +62,13 @@ func (_c *mockRequeuableError_Error_Call) RunAndReturn(run func() string) *mockR return _c } -// GetRequeueTime provides a mock function with given fields: -func (_m *mockRequeuableError) GetRequeueTime() time.Duration { - ret := _m.Called() +// GetRequeueTime provides a mock function with given fields: requeueTimeNanos +func (_m *mockRequeuableError) GetRequeueTime(requeueTimeNanos time.Duration) time.Duration { + ret := _m.Called(requeueTimeNanos) var r0 time.Duration - if rf, ok := ret.Get(0).(func() time.Duration); ok { - r0 = rf() + if rf, ok := ret.Get(0).(func(time.Duration) time.Duration); ok { + r0 = rf(requeueTimeNanos) } else { r0 = ret.Get(0).(time.Duration) } @@ -82,13 +82,14 @@ type mockRequeuableError_GetRequeueTime_Call struct { } // GetRequeueTime is a helper method to define mock.On call -func (_e *mockRequeuableError_Expecter) GetRequeueTime() *mockRequeuableError_GetRequeueTime_Call { - return &mockRequeuableError_GetRequeueTime_Call{Call: _e.mock.On("GetRequeueTime")} +// - requeueTimeNanos time.Duration +func (_e *mockRequeuableError_Expecter) GetRequeueTime(requeueTimeNanos interface{}) *mockRequeuableError_GetRequeueTime_Call { + return &mockRequeuableError_GetRequeueTime_Call{Call: _e.mock.On("GetRequeueTime", requeueTimeNanos)} } -func (_c *mockRequeuableError_GetRequeueTime_Call) Run(run func()) *mockRequeuableError_GetRequeueTime_Call { +func (_c *mockRequeuableError_GetRequeueTime_Call) Run(run func(requeueTimeNanos time.Duration)) *mockRequeuableError_GetRequeueTime_Call { _c.Call.Run(func(args mock.Arguments) { - run() + run(args[0].(time.Duration)) }) return _c } @@ -98,7 +99,7 @@ func (_c *mockRequeuableError_GetRequeueTime_Call) Return(_a0 time.Duration) *mo return _c } -func (_c *mockRequeuableError_GetRequeueTime_Call) RunAndReturn(run func() time.Duration) *mockRequeuableError_GetRequeueTime_Call { +func (_c *mockRequeuableError_GetRequeueTime_Call) RunAndReturn(run func(time.Duration) time.Duration) *mockRequeuableError_GetRequeueTime_Call { _c.Call.Return(run) return _c } diff --git a/pkg/controllers/requeableErrors.go b/pkg/controllers/requeableErrors.go new file mode 100644 index 0000000..cf43947 --- /dev/null +++ b/pkg/controllers/requeableErrors.go @@ -0,0 +1,62 @@ +package controllers + +import ( + "fmt" + "time" +) + +type genericRequeueableError struct { + errMsg string + err error +} + +// Error returns the string representation of the wrapped error. +func (gre *genericRequeueableError) Error() string { + return fmt.Sprintf("%s: %s", gre.errMsg, gre.err.Error()) +} + +// GetRequeueTime returns the time until the component should be requeued. +func (gre *genericRequeueableError) GetRequeueTime(requeueTimeNanos time.Duration) time.Duration { + return getRequeueTime(requeueTimeNanos) +} + +// Unwrap returns the root error. +func (gre *genericRequeueableError) Unwrap() error { + return gre.err +} + +type dependencyUnsatisfiedError struct { + err error +} + +// Error returns the string representation of the wrapped error. +func (due *dependencyUnsatisfiedError) Error() string { + return fmt.Sprintf("one or more dependencies are not satisfied: %s", due.err.Error()) +} + +// GetRequeueTime returns the time until the component should be requeued. +func (due *dependencyUnsatisfiedError) GetRequeueTime(requeueTimeNanos time.Duration) time.Duration { + return getRequeueTime(requeueTimeNanos) +} + +// Unwrap returns the root error. +func (due *dependencyUnsatisfiedError) Unwrap() error { + return due.err +} + +func getRequeueTime(currentRequeueTime time.Duration) time.Duration { + const initialRequeueTime = 15 * time.Second + const linearCutoffThreshold6Hours = 6 * time.Hour + + if currentRequeueTime == 0 { + return initialRequeueTime + } + + nextRequeueTime := currentRequeueTime * 2 + + if nextRequeueTime >= linearCutoffThreshold6Hours { + return linearCutoffThreshold6Hours + } + + return nextRequeueTime +} diff --git a/pkg/controllers/requeableErrors_test.go b/pkg/controllers/requeableErrors_test.go new file mode 100644 index 0000000..2b0111f --- /dev/null +++ b/pkg/controllers/requeableErrors_test.go @@ -0,0 +1,80 @@ +package controllers + +import ( + "errors" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_dependencyUnsatisfiedError_GetRequeueTime(t *testing.T) { + type args struct { + requeueTime time.Duration + } + tests := []struct { + name string + args args + want time.Duration + }{ + // double the value until the threshold jumps in + {"1st interval", args{0 * time.Second}, 15 * time.Second}, + {"2nd interval", args{15 * time.Second}, 30 * time.Second}, + {"3rd interval", args{30 * time.Second}, 1 * time.Minute}, + {"11th interval", args{128 * time.Minute}, 256 * time.Minute}, + {"cutoff interval ", args{256 * time.Minute}, 6 * time.Hour}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + due := &dependencyUnsatisfiedError{} + assert.Equalf(t, tt.want, due.GetRequeueTime(tt.args.requeueTime), "getRequeueTime(%v)", tt.args.requeueTime) + }) + } +} + +func Test_dependencyUnsatisfiedError_Unwrap(t *testing.T) { + testErr1 := assert.AnError + testErr2 := errors.New("test") + inputErr := errors.Join(testErr1, testErr2) + + sut := &dependencyUnsatisfiedError{inputErr} + + // when + actualErr := sut.Unwrap() + + // then + require.Error(t, sut) + require.Error(t, actualErr) + assert.ErrorIs(t, actualErr, testErr1) + assert.ErrorIs(t, actualErr, testErr2) +} + +func Test_dependencyUnsatisfiedError_Error(t *testing.T) { + sut := &dependencyUnsatisfiedError{assert.AnError} + expected := "one or more dependencies are not satisfied: assert.AnError general error for testing" + assert.Equal(t, expected, sut.Error()) +} + +func Test_genericRequeueableError_Unwrap(t *testing.T) { + testErr1 := assert.AnError + testErr2 := errors.New("test") + inputErr := errors.Join(testErr1, testErr2) + + sut := &genericRequeueableError{"oh noez", inputErr} + + // when + actualErr := sut.Unwrap() + + // then + require.Error(t, sut) + require.Error(t, actualErr) + assert.ErrorIs(t, actualErr, testErr1) + assert.ErrorIs(t, actualErr, testErr2) +} + +func Test_genericRequeueableError_Error(t *testing.T) { + sut := &genericRequeueableError{"oh noez", assert.AnError} + expected := "oh noez: " + assert.AnError.Error() + assert.Equal(t, expected, sut.Error()) +} diff --git a/pkg/controllers/requeueHandler.go b/pkg/controllers/requeueHandler.go index c70c9b4..04e4fc4 100644 --- a/pkg/controllers/requeueHandler.go +++ b/pkg/controllers/requeueHandler.go @@ -44,7 +44,7 @@ func (d *componentRequeueHandler) Handle(ctx context.Context, contextMessage str return ctrl.Result{}, fmt.Errorf("failed to update component status: %w", updateError) } - requeueTime := requeueableErr.GetRequeueTime() + requeueTime := requeueableErr.GetRequeueTime(component.Status.RequeueTimeNanos) result := ctrl.Result{Requeue: true, RequeueAfter: requeueTime} d.fireRequeueEvent(component, result) diff --git a/pkg/controllers/requeueHandler_test.go b/pkg/controllers/requeueHandler_test.go index b15d3f0..2ea96b0 100644 --- a/pkg/controllers/requeueHandler_test.go +++ b/pkg/controllers/requeueHandler_test.go @@ -2,13 +2,17 @@ package controllers import ( "context" - v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + "testing" + "time" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "testing" - "time" + + v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" ) var testCtx = context.Background() @@ -86,7 +90,7 @@ func Test_componentRequeueHandler_Handle(t *testing.T) { sut := &componentRequeueHandler{namespace: testNamespace, clientSet: clientSetMock, recorder: recorderMock} requeueErrMock := newMockRequeuableError(t) - requeueErrMock.EXPECT().GetRequeueTime().Return(time.Second) + requeueErrMock.EXPECT().GetRequeueTime(mock.Anything).Return(time.Second) requeueErrMock.EXPECT().Error().Return("my error") onRequeueExecuted := false From 21f387bd2686e20e42cf6b83018b0e0b22da172b Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Wed, 16 Aug 2023 16:04:21 +0200 Subject: [PATCH 05/47] #15 Requeue errors With the help of requeueable errors, the reconciler is now able to set a given time (provided by the requeueable error). Once this interval was elapsed, the K8s API will re-submit the CR to our reconciler. Co-authored-by: Jeremias Weber --- pkg/controllers/requeueHandler.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/controllers/requeueHandler.go b/pkg/controllers/requeueHandler.go index 04e4fc4..32713fe 100644 --- a/pkg/controllers/requeueHandler.go +++ b/pkg/controllers/requeueHandler.go @@ -39,12 +39,14 @@ func (d *componentRequeueHandler) Handle(ctx context.Context, contextMessage str onRequeue() } + requeueTime := requeueableErr.GetRequeueTime(component.Status.RequeueTimeNanos) + component.Status.RequeueTimeNanos = requeueTime + _, updateError := d.clientSet.ComponentV1Alpha1().Components(d.namespace).UpdateStatus(ctx, component, metav1.UpdateOptions{}) if updateError != nil { return ctrl.Result{}, fmt.Errorf("failed to update component status: %w", updateError) } - requeueTime := requeueableErr.GetRequeueTime(component.Status.RequeueTimeNanos) result := ctrl.Result{Requeue: true, RequeueAfter: requeueTime} d.fireRequeueEvent(component, result) From a5babdb8e0441585eb3fc4b3bcd21ee9483ff613 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Wed, 16 Aug 2023 16:24:48 +0200 Subject: [PATCH 06/47] #15 return requeueable errors from upgrade manager The component CR status is used to hold the state of the respective time when the CR should be requeued. The interval doubles until a threshold is reached; then only a fixed interval will be used. The initial value of 15 seconds was plain guessed, so there was no deep thinking about that value. Co-authored-by: Jeremias Weber --- .../componentInstallManager_test.go | 4 +- pkg/controllers/componentUpgradeManager.go | 3 +- .../componentUpgradeManager_test.go | 44 +++++++++++++++---- pkg/controllers/requeueHandler_test.go | 1 + 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/pkg/controllers/componentInstallManager_test.go b/pkg/controllers/componentInstallManager_test.go index c7aa96d..d833312 100644 --- a/pkg/controllers/componentInstallManager_test.go +++ b/pkg/controllers/componentInstallManager_test.go @@ -19,7 +19,7 @@ func Test_componentInstallManager_Install(t *testing.T) { namespace := "ecosystem" component := getComponent(namespace, "k8s", "dogu-op", "0.1.0") - t.Run("success", func(t *testing.T) { + t.Run("should install component", func(t *testing.T) { // given mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusInstalling(testCtx, component).Return(component, nil) @@ -64,6 +64,8 @@ func Test_componentInstallManager_Install(t *testing.T) { // then require.Error(t, err) assert.ErrorIs(t, err, assert.AnError) + var expectedRequeueableErr *dependencyUnsatisfiedError + assert.ErrorAs(t, err, &expectedRequeueableErr) assert.ErrorContains(t, err, "one or more dependencies are not satisfied") }) diff --git a/pkg/controllers/componentUpgradeManager.go b/pkg/controllers/componentUpgradeManager.go index 7320f62..dbd9861 100644 --- a/pkg/controllers/componentUpgradeManager.go +++ b/pkg/controllers/componentUpgradeManager.go @@ -35,8 +35,7 @@ func (cum *componentUpgradeManager) Upgrade(ctx context.Context, component *k8sv err := cum.helmClient.SatisfiesDependencies(ctx, component) if err != nil { cum.recorder.Eventf(component, corev1.EventTypeWarning, UpgradeEventReason, "One or more dependencies are not satisfied: %s", err.Error()) - // TODO implement requeueable error with timing and state and return an error instance here instead - return err + return &dependencyUnsatisfiedError{err: err} } component, err = cum.componentClient.UpdateStatusUpgrading(ctx, component) diff --git a/pkg/controllers/componentUpgradeManager_test.go b/pkg/controllers/componentUpgradeManager_test.go index d135506..5b6c268 100644 --- a/pkg/controllers/componentUpgradeManager_test.go +++ b/pkg/controllers/componentUpgradeManager_test.go @@ -22,16 +22,17 @@ func TestNewComponentUpgradeManager(t *testing.T) { } func Test_componentUpgradeManager_Upgrade(t *testing.T) { + component := &k8sv1.Component{ + Spec: k8sv1.ComponentSpec{ + Namespace: "ecosystem", + Name: "testComponent", + Version: "1.0", + }, + Status: k8sv1.ComponentStatus{Status: "installed"}, + } + t.Run("should upgrade component", func(t *testing.T) { ctx := context.Background() - component := &k8sv1.Component{ - Spec: k8sv1.ComponentSpec{ - Namespace: "ecosystem", - Name: "testComponent", - Version: "1.0", - }, - Status: k8sv1.ComponentStatus{Status: "installed"}, - } mockComponentClient := newMockComponentInterface(t) mockComponentClient.EXPECT().UpdateStatusUpgrading(ctx, component).Return(component, nil) @@ -50,6 +51,33 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { require.NoError(t, err) }) + t.Run("dependency check failed", func(t *testing.T) { + // given + mockComponentClient := newMockComponentInterface(t) + + mockHelmClient := newMockHelmClient(t) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(assert.AnError) + + mockRecorder := newMockEventRecorder(t) + mockRecorder.EXPECT().Eventf(component, "Warning", "Upgrade", "One or more dependencies are not satisfied: %s", assert.AnError.Error()).Return() + + sut := componentUpgradeManager{ + componentClient: mockComponentClient, + helmClient: mockHelmClient, + recorder: mockRecorder, + } + + // when + err := sut.Upgrade(testCtx, component) + + // then + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + var expectedRequeueableErr *dependencyUnsatisfiedError + assert.ErrorAs(t, err, &expectedRequeueableErr) + assert.ErrorContains(t, err, "one or more dependencies are not satisfied") + }) + t.Run("should fail to upgrade component on error while setting upgrading status", func(t *testing.T) { ctx := context.Background() component := &k8sv1.Component{ diff --git a/pkg/controllers/requeueHandler_test.go b/pkg/controllers/requeueHandler_test.go index 2ea96b0..18eced6 100644 --- a/pkg/controllers/requeueHandler_test.go +++ b/pkg/controllers/requeueHandler_test.go @@ -56,6 +56,7 @@ func Test_componentRequeueHandler_Handle(t *testing.T) { sut := &componentRequeueHandler{namespace: testNamespace, clientSet: clientSetMock} requeueErrMock := newMockRequeuableError(t) + requeueErrMock.EXPECT().GetRequeueTime(mock.Anything).Return(30 * time.Second) onRequeueExecuted := false onRequeue := func() { From b196f13a3ce44cd479f4d7aec091480150a4abfb Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Wed, 16 Aug 2023 16:25:18 +0200 Subject: [PATCH 07/47] #15 fix a weird error message Co-authored-by: Jeremias Weber --- pkg/helm/client.go | 2 +- pkg/helm/client_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index a437603..9eb1558 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -86,7 +86,7 @@ func (c *Client) InstallOrUpgrade(ctx context.Context, component *k8sv1.Componen _, err = c.helmClient.InstallOrUpgradeChart(ctx, chartSpec, nil) if err != nil { - return fmt.Errorf("error while installOrUpgrade component %s: %w", component, err) + return fmt.Errorf("error while installing/upgrading component %s: %w", component, err) } return nil } diff --git a/pkg/helm/client_test.go b/pkg/helm/client_test.go index 1240ff6..3628e90 100644 --- a/pkg/helm/client_test.go +++ b/pkg/helm/client_test.go @@ -107,7 +107,7 @@ func TestClient_InstallOrUpgrade(t *testing.T) { require.Error(t, err) assert.ErrorIs(t, err, assert.AnError) - assert.ErrorContains(t, err, "error while installOrUpgrade component testing/testComponent:0.1.1") + assert.ErrorContains(t, err, "error while installing/upgrading component testing/testComponent:0.1.1") }) } From b20c265b852621ec086bb179e7c6e3a2c879e306 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Wed, 16 Aug 2023 16:59:34 +0200 Subject: [PATCH 08/47] #15 enhance docs (WIP) Co-authored-by: Jeremias Weber --- ...ts_de.md => developing_the_operator_de.md} | 10 ++- ...ts_en.md => developing_the_operator_en.md} | 0 docs/operations/managing_components_de.md | 72 +++++++++++++++++++ 3 files changed, 79 insertions(+), 3 deletions(-) rename docs/development/{managing_components_de.md => developing_the_operator_de.md} (94%) rename docs/development/{managing_components_en.md => developing_the_operator_en.md} (100%) create mode 100644 docs/operations/managing_components_de.md diff --git a/docs/development/managing_components_de.md b/docs/development/developing_the_operator_de.md similarity index 94% rename from docs/development/managing_components_de.md rename to docs/development/developing_the_operator_de.md index 7ef0b1e..577f4bf 100644 --- a/docs/development/managing_components_de.md +++ b/docs/development/developing_the_operator_de.md @@ -35,7 +35,7 @@ spec: version: 3.5.9-1 ``` -- `namespace` ist hier der Namespace der Komponente in der Helm-Registry (s.o.) +- `namespace` ist hier der Namespace der Komponente in der Helm-Registry (s. o.) - Weitere Beispiele finden sich unter config/samples - Anwenden der CR auf den Cluster: bspw. `kubectl apply -f etcd.yaml` @@ -43,5 +43,9 @@ spec: ## Komponente deinstallieren -- Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete -f etcd.yaml` -- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente \ No newline at end of file +- Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete component k8s-etcd` +- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente + +## Abhängigkeiten in Komponenten darstellen + +???? \ No newline at end of file diff --git a/docs/development/managing_components_en.md b/docs/development/developing_the_operator_en.md similarity index 100% rename from docs/development/managing_components_en.md rename to docs/development/developing_the_operator_en.md diff --git a/docs/operations/managing_components_de.md b/docs/operations/managing_components_de.md new file mode 100644 index 0000000..c12fc48 --- /dev/null +++ b/docs/operations/managing_components_de.md @@ -0,0 +1,72 @@ +# Komponenten mit dem Komponenten-Operator verwalten + +Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten im Cluster installiert, aktualisiert und löscht. + +## Installation des Komponenten-Operators + +### Helm-Repository konfigurieren + +```bash +$ helm repo add oci://registry.cloudogu.com/k8s ???? +``` + +### Zugangsdaten konfigurieren + +Gegebenenfalls für das Helm-Repository Zugangsdaten anlegen. + +```bash +$ kubectl add secret ???? +``` + +### Komponenten-Operator installieren + +Entweder mittels Helm-Client installieren oder aktualisieren + +```bash +$ helm install chart.tgz??? +``` + +oder mittels `helm template` und einem darauf folgenden `kubectl`-Aufruf + + +```bash +$ helm template chart.tgz??? +``` + +## Komponente installieren oder aktualisieren +- Custom Ressource (CR) für Komponente schreiben. Beispiel: + +```yaml +apiVersion: k8s.cloudogu.com/v1 +kind: Component +metadata: + name: k8s-etcd +spec: + name: k8s-etcd + namespace: k8s + version: 3.5.9-1 +``` + +- `namespace` ist hier der Namespace der Komponente in der Helm-Registry (s. o.) +- Weitere Beispiele finden sich unter config/samples + +- Anwenden der CR auf den Cluster: bspw. `kubectl apply -f etcd.yaml` +- Der Komponenten-Operator beginnt nun mit der Installation der Komponente +- Abhängigkeiten zu anderen k8s-CES-Komponenten und deren Versionen müssen erfüllt sein (siehe hierzu [Abhängigkeiten zu anderen Komponenten](#Abhängigkeiten-zu-anderen-Komponenten)) + +## Komponente deinstallieren + +- Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete -f etcd.yaml` +- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente + +```bash +$ kubectl api-resources --verbs=list -o name \ + | sort | xargs -t -n 1 \ + kubectl delete --ignore-not-found -l app.kubernetes.io/name: k8s-component-operator -n ecosystem +``` + +## Abhängigkeiten zu anderen Komponenten + +K8s-CES-Komponenten können von anderen k8s-CES-Komponenten abhängen. Um sicherzustellen, dass eine Komponente voll funktionsfähig ist, wird während der Installation bzw. Aktualisierung geprüft, ob Komponenten vorhanden sind und eine korrekte Version aufweisen. + +Sollte eine oder mehrere Komponenten fehlen oder nicht in der richtigen Version vorhanden sein, so müssen diese manuell [nachinstalliert](#Komponente-installieren-oder-aktualisieren) bzw. aktualisiert werden. From 325d95701ad1710c73477ae775baf550e4eb5882 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 17 Aug 2023 14:55:01 +0200 Subject: [PATCH 09/47] #15 enhance docs (WIP) --- .../development/developing_the_operator_de.md | 37 ++++---- docs/operations/managing_components_de.md | 43 +++++++--- docs/operations/managing_components_en.md | 86 +++++++++++++++++++ 3 files changed, 131 insertions(+), 35 deletions(-) create mode 100644 docs/operations/managing_components_en.md diff --git a/docs/development/developing_the_operator_de.md b/docs/development/developing_the_operator_de.md index 577f4bf..35b172a 100644 --- a/docs/development/developing_the_operator_de.md +++ b/docs/development/developing_the_operator_de.md @@ -21,31 +21,24 @@ Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten - Helm-Chart in Registry pushen: bspw. `helm push target/make/k8s/helm/k8s-etcd-3.5.9-1.tgz oci://registry.domain.test/testing/` - `testing` ist hier der Namespace der Komponente in der Helm-Registry und kann angepasst werden, falls nötig -## Komponente installieren -- Custom Ressource (CR) für Komponente schreiben. Beispiel: +## Komponenten verwalten -```yaml -apiVersion: k8s.cloudogu.com/v1 -kind: Component -metadata: - name: k8s-etcd -spec: - name: k8s-etcd - namespace: testing - version: 3.5.9-1 -``` +Siehe hierzu die Anmerkungen im [Operations-Dokument](../operations/managing_components_de.md) -- `namespace` ist hier der Namespace der Komponente in der Helm-Registry (s. o.) -- Weitere Beispiele finden sich unter config/samples - -- Anwenden der CR auf den Cluster: bspw. `kubectl apply -f etcd.yaml` -- Der Komponenten-Operator beginnt nun mit der Installation der Komponente +## Abhängigkeiten in Komponenten darstellen -## Komponente deinstallieren +```yaml +apiVersion: v2 +name: k8s-dogu-operator +... +dependencies: +- name: k8s/k8s-etcd + version: 3.*.* + condition: false +``` -- Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete component k8s-etcd` -- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente +Versionsmöglichkeiten und evtl. best practices oder Empfehlungen hier beschreiben -## Abhängigkeiten in Komponenten darstellen +## Den Komponenten-Operator mit anderen Komponenten lokal testen -???? \ No newline at end of file +irgendwelche Magie mit der cluster-lokalen Registry... \ No newline at end of file diff --git a/docs/operations/managing_components_de.md b/docs/operations/managing_components_de.md index c12fc48..1cd06ca 100644 --- a/docs/operations/managing_components_de.md +++ b/docs/operations/managing_components_de.md @@ -1,6 +1,6 @@ -# Komponenten mit dem Komponenten-Operator verwalten +# Verwendung von `k8s-component-operator` -Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten im Cluster installiert, aktualisiert und löscht. +Der Komponenten-Operator `k8s-component-operator` ist eine Komponente für die Kubernetes-Version des Cloudogu EcoSystems. Dieser Operator ermöglicht es, Komponenten auf einfache Weise zu installieren, zu aktualisieren oder zu löschen. Diese Komponenten stellen ihrerseits erforderliche Dienste für das EcoSystem bereit. ## Installation des Komponenten-Operators @@ -14,27 +14,33 @@ $ helm repo add oci://registry.cloudogu.com/k8s ???? Gegebenenfalls für das Helm-Repository Zugangsdaten anlegen. +siehe make helm-repo-config + ```bash $ kubectl add secret ???? ``` ### Komponenten-Operator installieren -Entweder mittels Helm-Client installieren oder aktualisieren +setup hinweis -```bash -$ helm install chart.tgz??? -``` +bei fehlern -oder mittels `helm template` und einem darauf folgenden `kubectl`-Aufruf +Entweder mittels Helm-Client installieren oder aktualisieren +- An der Helm-Registry anmelden: bspw. `helm registry login registry.domain.test` + - oder helm registry login -u myuser localhost:5000**** +- Helm-Chart in Registry pushen: bspw. `helm push target/make/k8s/helm/k8s-etcd-3.5.9-1.tgz oci://registry.domain.test/testing/` ```bash -$ helm template chart.tgz??? +$ helm install k8s-component-operator oci://registry.domain.test/testing/k8s-component-operator --version 0.2.0 ``` ## Komponente installieren oder aktualisieren -- Custom Ressource (CR) für Komponente schreiben. Beispiel: + +Um Komponenten zu installieren oder zu aktualisieren, muss jeweils eine _Custom Resource_ (CR) für die gewünschte Komponente existieren. + +Beispiel einer Komponenten-Ressource (z. B. als `k8s-etcd.yaml`): ```yaml apiVersion: k8s.cloudogu.com/v1 @@ -47,13 +53,22 @@ spec: version: 3.5.9-1 ``` -- `namespace` ist hier der Namespace der Komponente in der Helm-Registry (s. o.) -- Weitere Beispiele finden sich unter config/samples - -- Anwenden der CR auf den Cluster: bspw. `kubectl apply -f etcd.yaml` +Diese CR kann dann auf den Cluster angewendet werden: `kubectl apply -f k8s-etcd.yaml` - Der Komponenten-Operator beginnt nun mit der Installation der Komponente - Abhängigkeiten zu anderen k8s-CES-Komponenten und deren Versionen müssen erfüllt sein (siehe hierzu [Abhängigkeiten zu anderen Komponenten](#Abhängigkeiten-zu-anderen-Komponenten)) +Weitere Beispiele von Komponenten-Ressourcen befinden sich im [config/samples-Verzeichnis](../../config/samples) + +### Felder und deren Bedeutung: + +- `.metadata.name`: Der Komponentenname der Kubernetes-Resource. Dieser muss identisch mit `.spec.name` sein. +- `.spec.name`: Der Komponentenname wie er in der Komponenten-Registry lautet. Dieser muss identisch mit `.spec.name` sein. +- `.spec.namespace`: Der Namespace der Komponente in der Komponenten-Registry. + - Mittels unterschiedlicher Komponenten-Namespaces können unterschiedliche Versionen ausgebracht werden (z. B. zu Debugging-Zwecken). + - Es handelt sich hierbei _nicht_ um den Cluster-Namespace. +- `.spec.version`: Die Version der Komponente in der Komponenten-Registry. + + ## Komponente deinstallieren - Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete -f etcd.yaml` @@ -70,3 +85,5 @@ $ kubectl api-resources --verbs=list -o name \ K8s-CES-Komponenten können von anderen k8s-CES-Komponenten abhängen. Um sicherzustellen, dass eine Komponente voll funktionsfähig ist, wird während der Installation bzw. Aktualisierung geprüft, ob Komponenten vorhanden sind und eine korrekte Version aufweisen. Sollte eine oder mehrere Komponenten fehlen oder nicht in der richtigen Version vorhanden sein, so müssen diese manuell [nachinstalliert](#Komponente-installieren-oder-aktualisieren) bzw. aktualisiert werden. + +Die Versionen zu Abhängigkeiten werden während der Komponentenentwicklung im Helm-Chart hinterlegt. Abhängige Versionen können so gestaltet werden, dass sie nicht auf eine einzige Version fixiert werden, sondern unterschiedliche Versionsbereiche abdecken. Dies ermöglicht den Betrieb von Komponenten, selbst wenn Komponentenversionen mit kleineren Änderungen oder Fehlerbehebungen ausgebracht wurden. \ No newline at end of file diff --git a/docs/operations/managing_components_en.md b/docs/operations/managing_components_en.md new file mode 100644 index 0000000..b7f6016 --- /dev/null +++ b/docs/operations/managing_components_en.md @@ -0,0 +1,86 @@ +# Using `k8s-component-operator` + +The component operator `k8s-component-operator` is a component for the Kubernetes version of the Cloudogu EcoSystem. This operator enables you to install, update, or delete components in an easy fashion. These components in turn provide necessary services specific to the EcoSystem. + +## Installation of the component operator + +### Configure a Helm repository + +```bash +$ helm repo add oci://registry.cloudogu.com/k8s ???? +``` + +### Configure credentials + +Gegebenenfalls für das Helm-Repository Zugangsdaten anlegen. + +```bash +$ kubectl add secret ???? +``` + +### Install the component operator + +Entweder mittels Helm-Client installieren oder aktualisieren + +```bash +$ helm install chart.tgz??? +``` + +oder mittels `helm template` und einem darauf folgenden `kubectl`-Aufruf + + +```bash +$ helm template chart.tgz??? +``` + +## Komponente installieren oder aktualisieren + +Um Komponenten zu installieren oder zu aktualisieren, muss jeweils eine _Custom Resource_ (CR) für die gewünschte Komponente existieren. + +Beispiel einer Komponenten-Ressource (z. B. als `k8s-etcd.yaml`): + +```yaml +apiVersion: k8s.cloudogu.com/v1 +kind: Component +metadata: + name: k8s-etcd +spec: + name: k8s-etcd + namespace: k8s + version: 3.5.9-1 +``` + +Diese CR kann dann auf den Cluster angewendet werden: `kubectl apply -f k8s-etcd.yaml` +- Der Komponenten-Operator beginnt nun mit der Installation der Komponente +- Abhängigkeiten zu anderen k8s-CES-Komponenten und deren Versionen müssen erfüllt sein (siehe hierzu [Abhängigkeiten zu anderen Komponenten](#Abhängigkeiten-zu-anderen-Komponenten)) + +Weitere Beispiele von Komponenten-Ressourcen befinden sich im [config/samples-Verzeichnis](../../config/samples) + +### Felder und deren Bedeutung: + +- `.metadata.name`: Der Komponentenname der Kubernetes-Resource. Dieser muss identisch mit `.spec.name` sein. +- `.spec.name`: Der Komponentenname wie er in der Komponenten-Registry lautet. Dieser muss identisch mit `.spec.name` sein. +- `.spec.namespace`: Der Namespace der Komponente in der Komponenten-Registry. + - Mittels unterschiedlicher Komponenten-Namespaces können unterschiedliche Versionen ausgebracht werden (z. B. zu Debugging-Zwecken). + - Es handelt sich hierbei _nicht_ um den Cluster-Namespace. +- `.spec.version`: Die Version der Komponente in der Komponenten-Registry. + + +## Komponente deinstallieren + +- Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete -f etcd.yaml` +- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente + +```bash +$ kubectl api-resources --verbs=list -o name \ + | sort | xargs -t -n 1 \ + kubectl delete --ignore-not-found -l app.kubernetes.io/name: k8s-component-operator -n ecosystem +``` + +## Abhängigkeiten zu anderen Komponenten + +K8s-CES-Komponenten können von anderen k8s-CES-Komponenten abhängen. Um sicherzustellen, dass eine Komponente voll funktionsfähig ist, wird während der Installation bzw. Aktualisierung geprüft, ob Komponenten vorhanden sind und eine korrekte Version aufweisen. + +Sollte eine oder mehrere Komponenten fehlen oder nicht in der richtigen Version vorhanden sein, so müssen diese manuell [nachinstalliert](#Komponente-installieren-oder-aktualisieren) bzw. aktualisiert werden. + +Die Versionen zu Abhängigkeiten werden während der Komponentenentwicklung im Helm-Chart hinterlegt. Abhängige Versionen können so gestaltet werden, dass sie nicht auf eine einzige Version fixiert werden, sondern unterschiedliche Versionsbereiche abdecken. Dies ermöglicht den Betrieb von Komponenten, selbst wenn Kompoentenversionen mit kleineren Änderungen oder Fehlerbehebungen ausgebracht wurden. \ No newline at end of file From d493720e16b7dc53ccc816025cb11603a0659f3b Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 17 Aug 2023 14:56:53 +0200 Subject: [PATCH 10/47] #15 update CHANGELOG.md --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f2e4c3..2808583 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- [#15] Check if component dependencies are installed and if their version is appropriate + - you can find more information about components in the [operations docs]() ## [v0.0.2] - 2023-07-14 ### Added -- Add documentation for component operator usage in dev environment - [#12] Add upgrade of components and self-upgrade of component-operator +- Add documentation for component operator usage in a devlepment environment ### Fixed - Operator finishes uninstallation steps even if component has been uninstalled already @@ -18,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [v0.0.1] - 2023-07-07 ### Changed - [#8] Stabilise the installation process with atomic helm operations and a timeout for the underlying k8s client. + ### Added - [#4] Add Helm chart release process to project -- [#3] Initialize a first version for the `k8s-component-operator`. In contrast to the prior poc status the operator pulls charts from an oci registry. +- [#3] Initialize a first version for the `k8s-component-operator`. In contrast to the prior PoC status the operator pulls charts from an OCI registry. From 53948c0e41f49d20ddcdcd43291602808d5b2794 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 17 Aug 2023 14:57:32 +0200 Subject: [PATCH 11/47] #15 make TLS addictive helm happy --- build/make/k8s.mk | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/build/make/k8s.mk b/build/make/k8s.mk index c569fa3..7f35a3d 100644 --- a/build/make/k8s.mk +++ b/build/make/k8s.mk @@ -22,6 +22,7 @@ K8S_RESOURCE_TEMP_FOLDER ?= $(TARGET_DIR)/make/k8s K8S_RESOURCE_TEMP_YAML ?= $(K8S_RESOURCE_TEMP_FOLDER)/$(ARTIFACT_ID)_$(VERSION).yaml K8S_HELM_TARGET ?= $(K8S_RESOURCE_TEMP_FOLDER)/helm K8S_HELM_RESSOURCES ?= k8s/helm +K8S_HELM_RELEASE_TGZ=${K8S_HELM_TARGET}/${ARTIFACT_ID}-${VERSION}.tgz ##@ K8s - Variables @@ -95,7 +96,9 @@ k8s-helm-delete: ${BINARY_HELM} ## Uninstalls the current helm chart. @${BINARY_HELM} uninstall ${ARTIFACT_ID} .PHONY: k8s-helm-generate-chart -k8s-helm-generate-chart: ${K8S_HELM_RESSOURCES}/Chart.yaml $(K8S_RESOURCE_TEMP_FOLDER) ## Generates the final helm chart. +k8s-helm-generate-chart: ${K8S_HELM_TARGET}/Chart.yaml + +${K8S_HELM_TARGET}/Chart.yaml: ${K8S_HELM_RESSOURCES}/Chart.yaml $(K8S_RESOURCE_TEMP_FOLDER) ## Generates the final helm chart. @echo "Generate helm chart..." @rm -drf ${K8S_HELM_TARGET} # delete folder, so Chart.yaml is newly created from template @mkdir -p ${K8S_HELM_TARGET}/templates @@ -120,13 +123,17 @@ k8s-helm-reinstall: k8s-helm-delete k8s-helm-apply ## Uninstalls the current hel ##@ K8s - Helm release targets .PHONY: k8s-helm-generate-release -k8s-helm-generate-release: $(K8S_PRE_GENERATE_TARGETS) k8s-helm-generate-chart ## Generates the final helm chart with release urls. +k8s-helm-generate-release: ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml + +${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml: $(K8S_PRE_GENERATE_TARGETS) ${K8S_HELM_TARGET}/Chart.yaml ## Generates the final helm chart with release urls. @sed -i "s/'{{ .Namespace }}'/'{{ .Release.Namespace }}'/" ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml .PHONY: k8s-helm-package-release -k8s-helm-package-release: ${BINARY_HELM} k8s-helm-generate-release $(K8S_POST_GENERATE_TARGETS) ## Generates and packages the helm chart with release urls. +k8s-helm-package-release: ${K8S_HELM_RELEASE_TGZ} + +${K8S_HELM_RELEASE_TGZ}: ${BINARY_HELM} ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml $(K8S_POST_GENERATE_TARGETS) ## Generates and packages the helm chart with release urls. @echo "Package generated helm chart" - @${BINARY_HELM} package ${K8S_HELM_TARGET} -d ${K8S_HELM_TARGET} + ${BINARY_HELM} package ${K8S_HELM_TARGET} -d ${K8S_HELM_TARGET} ##@ K8s - Docker @@ -153,6 +160,13 @@ image-import: check-all-vars check-k8s-artifact-id docker-dev-tag ## Imports the @docker push ${IMAGE_DEV} @echo "Done." +.PHONY: chart-import +chart-import: check-all-vars check-k8s-artifact-id k8s-helm-generate-chart image-import ## Imports the currently available image into the cluster-local registry. + @echo "Import ${K8S_HELM_RELEASE_TGZ} into K8s cluster ${K3CES_REGISTRY_URL_PREFIX}..." + @helm push --kube-insecure-skip-tls-verify ${K8S_HELM_RELEASE_TGZ} oci://${K3CES_REGISTRY_URL_PREFIX}/k8s + + @echo "Done." + ## Functions # Check that given variables are set and all have non-empty values, From a94af575b26d0e8f735e51b3f259c9ccfd77d5e5 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 17 Aug 2023 17:08:54 +0200 Subject: [PATCH 12/47] Boyscouting: Fix line break in make target `helm-repo-config` This commit fixes unwanted line breaks during the generation of k8s secrets. Such line breaks lead to a configuration error during the start-up of the operator. The base64 command may add linebreaks after ~70ish characters. The added CLI switch of zero (0) avoids this behavior. Co-authored-by: Jeremias Weber --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 968c66c..5eeeb6a 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ kill-operator-pod: .PHONY: helm-repo-config helm-repo-config: ## Creates a configMap and a secret for the helm repo connection from env vars HELM_REPO_USERNAME, HELM_REPO_PASSWORD, HELM_REPO_ENDPOINT. @kubectl create configmap component-operator-helm-repository --from-literal=endpoint=${HELM_REPO_ENDPOINT} - @kubectl create secret generic component-operator-helm-registry --from-literal=config.json='{"auths": {"${HELM_REPO_ENDPOINT}": {"auth": "$(shell printf "%s:%s" "${HELM_REPO_USERNAME}" "${HELM_REPO_PASSWORD}" | base64)"}}}' + kubectl create secret generic component-operator-helm-registry --from-literal=config.json='{"auths": {"${HELM_REPO_ENDPOINT}": {"auth": "$(shell printf "%s:%s" "${HELM_REPO_USERNAME}" "${HELM_REPO_PASSWORD}" | base64 -w0)"}}}' ##@ Debug From 10016d108f9ca76f246cc48c7e29f4eea3f66a77 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Fri, 18 Aug 2023 15:34:27 +0200 Subject: [PATCH 13/47] #15 [heavy WIPing intensifies] fix text in error chain, try to get hands on chart getting Co-authored-by: Jeremias Weber --- build/make/k8s.mk | 2 +- config/samples/component-operator.yaml | 3 ++ config/samples/dogu-operator.yaml | 4 +- .../development/developing_the_operator_de.md | 15 ++++++ pkg/config/config.go | 21 ++++++-- pkg/controllers/componentInstallManager.go | 4 +- pkg/controllers/componentUpgradeManager.go | 4 +- pkg/controllers/requeableErrors.go | 19 ------- pkg/helm/client.go | 51 +++++++++++++++++-- 9 files changed, 89 insertions(+), 34 deletions(-) diff --git a/build/make/k8s.mk b/build/make/k8s.mk index 7f35a3d..6a48c18 100644 --- a/build/make/k8s.mk +++ b/build/make/k8s.mk @@ -161,7 +161,7 @@ image-import: check-all-vars check-k8s-artifact-id docker-dev-tag ## Imports the @echo "Done." .PHONY: chart-import -chart-import: check-all-vars check-k8s-artifact-id k8s-helm-generate-chart image-import ## Imports the currently available image into the cluster-local registry. +chart-import: check-all-vars check-k8s-artifact-id k8s-helm-generate-chart k8s-helm-package-release image-import ## Imports the currently available image into the cluster-local registry. @echo "Import ${K8S_HELM_RELEASE_TGZ} into K8s cluster ${K3CES_REGISTRY_URL_PREFIX}..." @helm push --kube-insecure-skip-tls-verify ${K8S_HELM_RELEASE_TGZ} oci://${K3CES_REGISTRY_URL_PREFIX}/k8s diff --git a/config/samples/component-operator.yaml b/config/samples/component-operator.yaml index f5d5cc5..aada516 100644 --- a/config/samples/component-operator.yaml +++ b/config/samples/component-operator.yaml @@ -2,6 +2,9 @@ apiVersion: k8s.cloudogu.com/v1 kind: Component metadata: name: k8s-component-operator + labels: + app: ces + app.kubernetes.io/name: k8s-component-operator spec: name: k8s-component-operator namespace: testing diff --git a/config/samples/dogu-operator.yaml b/config/samples/dogu-operator.yaml index 3611e1e..941c84f 100644 --- a/config/samples/dogu-operator.yaml +++ b/config/samples/dogu-operator.yaml @@ -4,5 +4,5 @@ metadata: name: k8s-dogu-operator spec: name: k8s-dogu-operator - namespace: testing - version: 0.2.0 \ No newline at end of file + namespace: k8s + version: 0.35.0 \ No newline at end of file diff --git a/docs/development/developing_the_operator_de.md b/docs/development/developing_the_operator_de.md index 35b172a..4817700 100644 --- a/docs/development/developing_the_operator_de.md +++ b/docs/development/developing_the_operator_de.md @@ -10,6 +10,21 @@ Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten - Außerdem sollte NAMESPACE korrekt gesetzt sein - Credentials im Cluster ablegen: `make helm-repo-config` +### Den Komponenten-Operator lokal debuggen + +1. Befolgen Sie die Installationsanweisungen von k8s-ecosystem +2. Bearbeiten Sie Ihre `/etc/hosts` und fügen Sie ein Mapping von localhost zu etcd hinzu + - `127.0.0.1 localhost etcd docker-registry.ecosystem.svc.cluster.local` +3. Öffnen Sie die Datei `.env.template` und folgen Sie den Anweisungen um eine + Umgebungsvariablendatei mit persönlichen Informationen anzulegen +4. Erzeugen Sie einen etcd Port-Forward + - `kubectl -n=ecosystem port-forward docker-registry 30099:30099` +5. Löschen Sie eventuelle Dogu-Operator-Deployments im Cluster, um Parallelisierungsfehler auszuschließen + - `kubectl delete deployment k8s-dogu-operator` +6. Legen Sie eine neue Debug-Konfiguration (z. B. in IntelliJ) ans, um den Operator lokal auszuführen + - mit diesen Umgebungsvariablen: + - STAGE=production;NAMESPACE=ecosystem;KUBECONFIG=/pfad/zur/kubeconfig/.kube/k3ces.local + ### Komponenten-Operator installieren - Operator bauen und im Cluster installieren: `make k8s-helm-apply` diff --git a/pkg/config/config.go b/pkg/config/config.go index f5eee25..7fbbf53 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -3,14 +3,17 @@ package config import ( "context" "fmt" + "os" + "strconv" + "strings" + "github.com/cloudogu/cesapp-lib/core" + "gopkg.in/yaml.v3" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - "os" ctrl "sigs.k8s.io/controller-runtime" - "strings" ) const ( @@ -40,7 +43,11 @@ var ( // HelmRepositoryData contains all necessary data for the helm repository. type HelmRepositoryData struct { + // Endpoint contains the Helm registry endpoint URL. Endpoint string `json:"endpoint"` + // InsecureSkipTLSVerify indicates if the server's certificate will not be checked for validity. + // This makes the HTTPS connections insecure. + InsecureSkipTLSVerify bool `json:"insecureSkipTLSVerify"` } // GetOciEndpoint returns the configured endpoint of the HelmRepositoryData with the OCI-protocol @@ -114,8 +121,16 @@ func getHelmRepositoryFromConfigMap(configMapClient corev1.ConfigMapInterface) ( return nil, fmt.Errorf("failed to get helm repository configMap %s: %w", helmRepositoryConfigMapName, err) } + // TODO Test the parsing + const configMapInsecureSkipTLSVerify = "insecureSkipTLSVerify" + insecureSkipTLSVerify, err := strconv.ParseBool(configMap.Data[configMapInsecureSkipTLSVerify]) + if err != nil { + return nil, fmt.Errorf("failed to parse field %s", configMapInsecureSkipTLSVerify) + } + return &HelmRepositoryData{ - Endpoint: configMap.Data["endpoint"], + Endpoint: configMap.Data["endpoint"], + InsecureSkipTLSVerify: insecureSkipTLSVerify, }, nil } diff --git a/pkg/controllers/componentInstallManager.go b/pkg/controllers/componentInstallManager.go index 8aff400..2f49909 100644 --- a/pkg/controllers/componentInstallManager.go +++ b/pkg/controllers/componentInstallManager.go @@ -34,8 +34,8 @@ func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv err := cim.helmClient.SatisfiesDependencies(ctx, component) if err != nil { - cim.recorder.Eventf(component, corev1.EventTypeWarning, InstallEventReason, "One or more dependencies are not satisfied: %s", err.Error()) - return &dependencyUnsatisfiedError{err: err} + cim.recorder.Eventf(component, corev1.EventTypeWarning, InstallEventReason, "Dependency check failed: %s", err.Error()) + return &genericRequeueableError{errMsg: "failed to check dependencies", err: err} } component, err = cim.componentClient.UpdateStatusInstalling(ctx, component) diff --git a/pkg/controllers/componentUpgradeManager.go b/pkg/controllers/componentUpgradeManager.go index dbd9861..6f0468f 100644 --- a/pkg/controllers/componentUpgradeManager.go +++ b/pkg/controllers/componentUpgradeManager.go @@ -34,8 +34,8 @@ func (cum *componentUpgradeManager) Upgrade(ctx context.Context, component *k8sv err := cum.helmClient.SatisfiesDependencies(ctx, component) if err != nil { - cum.recorder.Eventf(component, corev1.EventTypeWarning, UpgradeEventReason, "One or more dependencies are not satisfied: %s", err.Error()) - return &dependencyUnsatisfiedError{err: err} + cum.recorder.Eventf(component, corev1.EventTypeWarning, UpgradeEventReason, "Dependency check failed: %s", err.Error()) + return &genericRequeueableError{errMsg: "failed to check dependencies", err: err} } component, err = cum.componentClient.UpdateStatusUpgrading(ctx, component) diff --git a/pkg/controllers/requeableErrors.go b/pkg/controllers/requeableErrors.go index cf43947..2f38b62 100644 --- a/pkg/controllers/requeableErrors.go +++ b/pkg/controllers/requeableErrors.go @@ -25,25 +25,6 @@ func (gre *genericRequeueableError) Unwrap() error { return gre.err } -type dependencyUnsatisfiedError struct { - err error -} - -// Error returns the string representation of the wrapped error. -func (due *dependencyUnsatisfiedError) Error() string { - return fmt.Sprintf("one or more dependencies are not satisfied: %s", due.err.Error()) -} - -// GetRequeueTime returns the time until the component should be requeued. -func (due *dependencyUnsatisfiedError) GetRequeueTime(requeueTimeNanos time.Duration) time.Duration { - return getRequeueTime(requeueTimeNanos) -} - -// Unwrap returns the root error. -func (due *dependencyUnsatisfiedError) Unwrap() error { - return due.err -} - func getRequeueTime(currentRequeueTime time.Duration) time.Duration { const initialRequeueTime = 15 * time.Second const linearCutoffThreshold6Hours = 6 * time.Hour diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 9eb1558..b8ffc76 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -11,6 +11,7 @@ import ( helmclient "github.com/mittwald/go-helm-client" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/registry" "helm.sh/helm/v3/pkg/release" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/log" @@ -36,7 +37,7 @@ type Client struct { } // NewClient create a new instance of the helm client. -func NewClient(namespace string, helmRepoSecret *config.HelmRepositoryData, debug bool, debugLog action.DebugLog) (*Client, error) { +func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug bool, debugLog action.DebugLog) (*Client, error) { opt := &helmclient.RestConfClientOptions{ Options: &helmclient.Options{ Namespace: namespace, @@ -50,16 +51,20 @@ func NewClient(namespace string, helmRepoSecret *config.HelmRepositoryData, debu RestConfig: ctrl.GetConfigOrDie(), } + opt.RestConfig.Insecure = true helmClient, err := helmclient.NewClientFromRestConf(opt) if err != nil { return nil, fmt.Errorf("failed to create helm client: %w", err) } + // TODO Check if this is still needed after applying the http-plain patch + helmClient.(*helmclient.HelmClient).Settings.KubeInsecureSkipTLSVerify = helmRepoData.InsecureSkipTLSVerify clientGetter := helmclient.NewRESTClientGetter(namespace, nil, opt.RestConfig) actionConfig := new(action.Configuration) err = actionConfig.Init( clientGetter, namespace, + // TODO PhilippPixel/ move to place of central configuration os.Getenv("HELM_DRIVER"), debugLog, ) @@ -67,9 +72,18 @@ func NewClient(namespace string, helmRepoSecret *config.HelmRepositoryData, debu return nil, err } + helmRegistryClient, err := registry.NewClient( + registry.ClientOptDebug(debug), + registry.ClientOptCredentialsFile(helmRegistryConfigFile), + ) + if err != nil { + return nil, err + } + actionConfig.RegistryClient = helmRegistryClient + return &Client{ helmClient: helmClient, - helmRepoData: helmRepoSecret, + helmRepoData: helmRepoData, actionConfig: actionConfig, dependencyChecker: &installedDependencyChecker{}, }, nil @@ -103,7 +117,7 @@ func (c *Client) SatisfiesDependencies(ctx context.Context, component *k8sv1.Com chartSpec := component.GetHelmChartSpec(endpoint) - componentChart, err := c.getChart(component, chartSpec) + componentChart, err := c.getChart(ctx, component, chartSpec) if err != nil { return fmt.Errorf("failed to get chart for component %s: %w", component, err) } @@ -116,7 +130,7 @@ func (c *Client) SatisfiesDependencies(ctx context.Context, component *k8sv1.Com err = c.dependencyChecker.CheckSatisfied(dependencies, deployedReleases) if err != nil { - return fmt.Errorf("some dependencies are missing: %w", err) + return &dependencyUnsatisfiedError{err: err} } return nil @@ -131,10 +145,23 @@ func (c *Client) getOciEndpoint(component *k8sv1.Component) (string, error) { return endpoint, nil } -func (c *Client) getChart(component *k8sv1.Component, spec *helmclient.ChartSpec) (*chart.Chart, error) { +func (c *Client) getChart(ctx context.Context, component *k8sv1.Component, spec *helmclient.ChartSpec) (*chart.Chart, error) { + logger := log.FromContext(ctx) + + // TODO extract into helper method // We need this installAction because it sets the registryClient in ChartPathOptions which is a private field. install := action.NewInstall(c.actionConfig) install.Version = component.Spec.Version + install.InsecureSkipTLSverify = c.helmRepoData.InsecureSkipTLSVerify + install.ChartPathOptions.InsecureSkipTLSverify = c.helmRepoData.InsecureSkipTLSVerify + + logger.Info("Trying to get chart with options", + "chart", spec.ChartName, + "version", component.Spec.Version, + "tls insecure", c.helmRepoData.InsecureSkipTLSVerify) + + logger.Info("----- andere Logausgaben hier? -------------------") + componentChart, _, err := c.helmClient.GetChart(spec.ChartName, &install.ChartPathOptions) if err != nil { return nil, fmt.Errorf("error while getting chart for %s:%s: %w", component.Spec.Name, component.Spec.Version, err) @@ -155,3 +182,17 @@ func (c *Client) Uninstall(component *k8sv1.Component) error { func (c *Client) ListDeployedReleases() ([]*release.Release, error) { return c.helmClient.ListDeployedReleases() } + +type dependencyUnsatisfiedError struct { + err error +} + +// Error returns the string representation of the wrapped error. +func (due *dependencyUnsatisfiedError) Error() string { + return fmt.Sprintf("one or more dependencies are not satisfied: %s", due.err.Error()) +} + +// Unwrap returns the root error. +func (due *dependencyUnsatisfiedError) Unwrap() error { + return due.err +} From 4b594a776ebad9b25779c510dee31dbbfacd387f Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Fri, 18 Aug 2023 16:47:19 +0200 Subject: [PATCH 14/47] #15 [WIP] connect to helm registry over http This updates to the latest helm library to access this feature. Other libraries have been updated as well. Co-authored-by: Philipp Pixel --- go.mod | 154 +- go.sum | 1503 +++++++++++++---- pkg/config/config.go | 15 +- .../mock_componentEcosystemInterface_test.go | 75 +- pkg/helm/client.go | 8 +- 5 files changed, 1281 insertions(+), 474 deletions(-) diff --git a/go.mod b/go.mod index cbf60fe..e133480 100644 --- a/go.mod +++ b/go.mod @@ -3,65 +3,67 @@ module github.com/cloudogu/k8s-component-operator go 1.20 require ( + github.com/Masterminds/semver/v3 v3.2.1 github.com/bombsimon/logrusr/v2 v2.0.1 github.com/cloudogu/cesapp-lib v0.12.0 - github.com/cloudogu/k8s-apply-lib v0.4.0 - github.com/go-logr/logr v1.2.3 - github.com/mittwald/go-helm-client v0.12.1 + github.com/cloudogu/k8s-apply-lib v0.4.2 + github.com/go-logr/logr v1.2.4 + github.com/mittwald/go-helm-client v0.12.3 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.24.1 - github.com/sirupsen/logrus v1.9.0 - github.com/stretchr/testify v1.8.1 + github.com/onsi/gomega v1.27.10 + github.com/sirupsen/logrus v1.9.3 + github.com/stretchr/testify v1.8.4 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.11.2 - k8s.io/api v0.26.4 - k8s.io/apimachinery v0.26.4 - k8s.io/client-go v0.26.4 - sigs.k8s.io/controller-runtime v0.14.6 + helm.sh/helm/v3 v3.12.0-dev.1.0.20230817154107-a749b663101d + k8s.io/api v0.28.0 + k8s.io/apimachinery v0.28.0 + k8s.io/client-go v0.28.0 + sigs.k8s.io/controller-runtime v0.15.1 ) -replace google.golang.org/grpc => google.golang.org/grpc v1.29.0 +replace google.golang.org/grpc => google.golang.org/grpc v1.57.0 require ( - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/BurntSushi/toml v1.2.1 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.2.0 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Masterminds/squirrel v1.5.3 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/Masterminds/squirrel v1.5.4 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/containerd/containerd v1.6.18 // indirect + github.com/containerd/containerd v1.7.3 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.21+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.21+incompatible // indirect - github.com/docker/docker-credential-helpers v0.7.0 // indirect + github.com/docker/cli v23.0.1+incompatible // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v23.0.3+incompatible // indirect + github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/eapache/go-resiliency v1.3.0 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/eapache/go-resiliency v1.4.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/gnostic v0.6.9 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect @@ -69,28 +71,30 @@ require ( github.com/gorilla/mux v1.8.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/huandu/xstrings v1.4.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.15.12 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lib/pq v1.10.7 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect + github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect @@ -98,56 +102,58 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc2 // indirect + github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.4.2 // indirect - github.com/rubenv/sql-migrate v1.3.1 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/rubenv/sql-migrate v1.5.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/xlab/treeprint v1.1.0 // indirect - go.starlark.net v0.0.0-20221020143700-22309ac47eac // indirect - golang.org/x/crypto v0.5.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/oauth2 v0.1.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + github.com/xlab/treeprint v1.2.0 // indirect + go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.starlark.net v0.0.0-20230814145427-12f4cb8177e4 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 // indirect + google.golang.org/grpc v1.54.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.26.3 // indirect - k8s.io/apiserver v0.26.3 // indirect - k8s.io/cli-runtime v0.26.3 // indirect - k8s.io/component-base v0.26.3 // indirect - k8s.io/klog/v2 v2.80.1 // indirect - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect - k8s.io/kubectl v0.26.0 // indirect - k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect - oras.land/oras-go v1.2.2 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/kustomize/api v0.12.1 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + k8s.io/apiextensions-apiserver v0.28.0 // indirect + k8s.io/apiserver v0.28.0 // indirect + k8s.io/cli-runtime v0.28.0 // indirect + k8s.io/component-base v0.28.0 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443 // indirect + k8s.io/kubectl v0.28.0 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + oras.land/oras-go v1.2.3 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kustomize/api v0.14.0 // indirect + sigs.k8s.io/kustomize/kyaml v0.14.3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index ee81a7f..9cab267 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 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.44.3/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= @@ -14,84 +15,640 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY 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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= 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.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= 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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +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/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= 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/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= 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= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= -github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/hcsshim v0.10.0-rc.8 h1:YSZVvlIIDD1UxQpJp0h+dnpLUw+TrY0cx8obKsp3bek= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/a8m/expect v1.0.0/go.mod h1:4IwSCMumY49ScypDnjNbYEjgVeqy1/U2cEs3Lat96eA= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -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/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -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/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= 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/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/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/bombsimon/logrusr/v2 v2.0.1 h1:1VgxVNQMCvjirZIYaT9JYn6sAVGVEcNtRE0y4mvaOAM= github.com/bombsimon/logrusr/v2 v2.0.1/go.mod h1:ByVAX+vHdLGAfdroiMg6q0zgq2FODY2lc5YJvzmOJio= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -99,20 +656,20 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cloudogu/cesapp-lib v0.12.0 h1:+yRVk65DljGtJj/gNpgBRhvIJHfGy7kr4/iEw1LJugg= github.com/cloudogu/cesapp-lib v0.12.0/go.mod h1:PTQqI3xs1ReJMXYE6BGTF33yAfmS4J7P8UiE4AwDMDY= -github.com/cloudogu/k8s-apply-lib v0.4.0 h1:4jYj0gTDSvW0qs9d5yM5w8aOsMu5Sx+PBCwJwa5sMss= -github.com/cloudogu/k8s-apply-lib v0.4.0/go.mod h1:WHCe588o8e1vzNdLGV6N4E0g7BarbPXPpW4y8U0/lxE= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= -github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= -github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -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-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cloudogu/k8s-apply-lib v0.4.2 h1:D5hTYvIZya+tAyGCUGaZ1T83otvpQwzrZXz5JPHQQ5M= +github.com/cloudogu/k8s-apply-lib v0.4.2/go.mod h1:jR/+7q47O5gb++4gVsmEElT8/EJoi+Msw2dVzArTPW0= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +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/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/containerd v1.7.3 h1:cKwYKkP1eTj54bP3wCdXXBymmKRQMrWjkLSWZZJDa8o= +github.com/containerd/containerd v1.7.3/go.mod h1:32FOM4/O0RkNg7AjQj3hDzN9cUGtu+HMvaKUNiqCZB8= +github.com/containerd/continuity v0.4.1 h1:wQnVrjIyQ8vhU2sgOiL5T07jo+ouqc2bnKsv5/EqGhU= 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/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -121,18 +678,15 @@ github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxG 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/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc= -github.com/docker/cli v20.10.21+incompatible h1:qVkgyYUnOLQ98LtXBrwd/duVqPT2X4SHndOuGsfwyhU= -github.com/docker/cli v20.10.21+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.21+incompatible h1:UTLdBmHk3bEY+w8qeO5KttOhy6OmXWsl/FEet9Uswog= -github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= -github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= +github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v23.0.3+incompatible h1:9GhVsShNWz1hO//9BNg/dpMnZW25KydO4wtVxWAIbho= +github.com/docker/docker v23.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= @@ -142,28 +696,31 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= -github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= +github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= +github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -171,60 +728,62 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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-gorp/gorp/v3 v3.0.5/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= 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-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.0.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.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.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= -github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= -github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XEWlY= -github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 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.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da 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/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -232,6 +791,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt 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/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -248,15 +808,19 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw 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/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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= @@ -268,7 +832,9 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -277,6 +843,8 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ 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/martian/v3 v3.3.2/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= @@ -286,8 +854,13 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf 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-20201218002935-b9804c9f04c2/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 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +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/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -295,95 +868,86 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +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/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= 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 v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/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.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -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-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 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/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= 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.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 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.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/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/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= -github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 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/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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= @@ -393,73 +957,52 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtB github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -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/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= -github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/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.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= +github.com/miekg/dns v1.1.25 h1:dFwPR6SfLtrSwgDcIq2bcU/gVutB4sNApq2HBdqcakg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -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-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mittwald/go-helm-client v0.12.1 h1:wOe5R5kFhlFVzRPqMG/xZoVy/o6AduVdaOxAh1fXk4c= -github.com/mittwald/go-helm-client v0.12.1/go.mod h1:4Ypx0sZaq0K9ldt+rdbQNvIBKBmUTMa4m73kMjfvB24= +github.com/mittwald/go-helm-client v0.12.3 h1:WlXhuMTT5HUdiYeiYMxlvi3XBxTKoGCNHcSsirLi8ug= +github.com/mittwald/go-helm-client v0.12.3/go.mod h1:lC1Sn912rgRkGQZBUntJO7TOlqa1kK3Idwr3yo1Tco0= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= 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= @@ -474,130 +1017,93 @@ github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7P 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/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/nelsam/hel/v2 v2.3.2/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= -github.com/nelsam/hel/v2 v2.3.3/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= 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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.6.0 h1:9t9b9vRUbFq3C4qKFCGkVuq/fIHji802N1nrtkh1mNc= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= 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.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/poy/onpar v0.0.0-20200406201722-06f95a1c68e8/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= -github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= 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_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= -github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rubenv/sql-migrate v1.3.1 h1:Vx+n4Du8X8VTYuXbhNxdEUoh6wiJERA0GlWocR5FrbA= -github.com/rubenv/sql-migrate v1.3.1/go.mod h1:YzG/Vh82CwyhTFXy+Mf5ahAiiEOpAlHurg+23VEzcsk= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rubenv/sql-migrate v1.5.2 h1:bMDqOnrJVV/6JQgQ/MxOpU+AdO8uzYYA/TxFUBzFtS0= +github.com/rubenv/sql-migrate v1.5.2/go.mod h1:H38GW8Vqf8F0Su5XignRyaRcbXbJunSWxs+kmzlg0Is= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -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 v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= 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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -611,11 +1117,10 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -623,71 +1128,85 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= -github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.starlark.net v0.0.0-20221020143700-22309ac47eac h1:gBO5Qfcw5V9404yzsu2FEIsxK/u2mBNTNogK0uIoVhk= -go.starlark.net v0.0.0-20221020143700-22309ac47eac/go.mod h1:kIVgS18CjmEC3PqMd5kaJSGEifyV/CeB9x506ZJ1Vbk= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.starlark.net v0.0.0-20230814145427-12f4cb8177e4 h1:Ydko8M6UfXgvSpGOnbAjRMQDIvBheUsjBjkm6Azcpf4= +go.starlark.net v0.0.0-20230814145427-12f4cb8177e4/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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-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-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= 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/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= 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= @@ -710,20 +1229,22 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/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-20181023162649-9b4f9f5ad519/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-20181201002055-351d144fa1fc/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-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-20190404232315-eb5bcb51f2a3/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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 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= @@ -748,20 +1269,34 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY 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-20201224014010-6772e930b67b/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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/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/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -772,11 +1307,25 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ 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-20210402161424-2e8d93401602/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.1.0 h1:isLCZuhj4v+tYv7eskaN4v/TM+A1begWWgyVJDdl1+Y= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= 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= @@ -788,20 +1337,19 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 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-20181026203630-95b1ffbd15a5/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-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-20190312061237-fead79001313/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-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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -815,7 +1363,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -829,8 +1376,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w 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-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= @@ -839,40 +1384,65 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/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-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/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-20210603081109-ebe580a85c40/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-20210608053332-aa57babbf139/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-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-20210809222454-d867a43fc93e/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-20210816183151-1e6c022a8912/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-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= 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= @@ -882,22 +1452,28 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-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-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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -906,8 +1482,8 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw 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-20190927191325-030b2cf1153e/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-20191112195655-aa38f8e97acc/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= @@ -925,7 +1501,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK 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-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 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-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -937,23 +1512,44 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc 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-20201124115921-2c860bdd6e78/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.0.0-20210108195828-e2f9c7f1fc8e/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.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +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/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -975,7 +1571,42 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q 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.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +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.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= 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.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -983,7 +1614,6 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID 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= @@ -1018,17 +1648,113 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D 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-20210108203827-ffc7fda8c3d7/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-20210226172003-ab064af71705/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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= 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-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= +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-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +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-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +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= @@ -1042,41 +1768,38 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -helm.sh/helm/v3 v3.11.2 h1:P3cLaFxfoxaGLGJVnoPrhf1j86LC5EDINSpYSpMUkkA= -helm.sh/helm/v3 v3.11.2/go.mod h1:Hw+09mfpDiRRKAgAIZlFkPSeOkvv7Acl5McBvQyNPVw= +gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +helm.sh/helm/v3 v3.12.0-dev.1.0.20230817154107-a749b663101d h1:6J+y+NmyX17vulRO05myRL0BzQwmzZ3bNs+h0ZUiAE4= +helm.sh/helm/v3 v3.12.0-dev.1.0.20230817154107-a749b663101d/go.mod h1:bmvO+xB/gCRkjlpIFBHGEDI4tCwmTU+tcOGqd4C4RqU= 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= @@ -1084,42 +1807,78 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.26.4 h1:qSG2PmtcD23BkYiWfoYAcak870eF/hE7NNYBYavTT94= -k8s.io/api v0.26.4/go.mod h1:WwKEXU3R1rgCZ77AYa7DFksd9/BAIKyOmRlbVxgvjCk= -k8s.io/apiextensions-apiserver v0.26.3 h1:5PGMm3oEzdB1W/FTMgGIDmm100vn7IaUP5er36dB+YE= -k8s.io/apiextensions-apiserver v0.26.3/go.mod h1:jdA5MdjNWGP+njw1EKMZc64xAT5fIhN6VJrElV3sfpQ= -k8s.io/apimachinery v0.26.4 h1:rZccKdBLg9vP6J09JD+z8Yr99Ce8gk3Lbi9TCx05Jzs= -k8s.io/apimachinery v0.26.4/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/apiserver v0.26.3 h1:blBpv+yOiozkPH2aqClhJmJY+rp53Tgfac4SKPDJnU4= -k8s.io/apiserver v0.26.3/go.mod h1:CJe/VoQNcXdhm67EvaVjYXxR3QyfwpceKPuPaeLibTA= -k8s.io/cli-runtime v0.26.3 h1:3ULe0oI28xmgeLMVXIstB+ZL5CTGvWSMVMLeHxitIuc= -k8s.io/cli-runtime v0.26.3/go.mod h1:5YEhXLV4kLt/OSy9yQwtSSNZU2Z7aTEYta1A+Jg4VC4= -k8s.io/client-go v0.26.4 h1:/7P/IbGBuT73A+G97trf44NTPSNqvuBREpOfdLbHvD4= -k8s.io/client-go v0.26.4/go.mod h1:6qOItWm3EwxJdl/8p5t7FWtWUOwyMdA8N9ekbW4idpI= -k8s.io/component-base v0.26.3 h1:oC0WMK/ggcbGDTkdcqefI4wIZRYdK3JySx9/HADpV0g= -k8s.io/component-base v0.26.3/go.mod h1:5kj1kZYwSC6ZstHJN7oHBqcJC6yyn41eR+Sqa/mQc8E= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.26.0 h1:xmrzoKR9CyNdzxBmXV7jW9Ln8WMrwRK6hGbbf69o4T0= -k8s.io/kubectl v0.26.0/go.mod h1:eInP0b+U9XUJWSYeU9XZnTA+cVYuWyl3iYPGtru0qhQ= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -oras.land/oras-go v1.2.2 h1:0E9tOHUfrNH7TCDk5KU0jVBEzCqbfdyuVfGmJ7ZeRPE= -oras.land/oras-go v1.2.2/go.mod h1:Apa81sKoZPpP7CDciE006tSZ0x3Q3+dOoBcMZ/aNxvw= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.28.0 h1:3j3VPWmN9tTDI68NETBWlDiA9qOiGJ7sdKeufehBYsM= +k8s.io/api v0.28.0/go.mod h1:0l8NZJzB0i/etuWnIXcwfIv+xnDOhL3lLW919AWYDuY= +k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= +k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= +k8s.io/apimachinery v0.28.0 h1:ScHS2AG16UlYWk63r46oU3D5y54T53cVI5mMJwwqFNA= +k8s.io/apimachinery v0.28.0/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw= +k8s.io/apiserver v0.28.0 h1:wVh7bK6Xj7hq+5ntInysTeQRAOqqFoKGUOW2yj8DXrY= +k8s.io/apiserver v0.28.0/go.mod h1:MvLmtxhQ0Tb1SZk4hfJBjs8iqr5nhYeaFSaoEcz7Lk4= +k8s.io/cli-runtime v0.28.0 h1:Tcz1nnccXZDNIzoH6EwjCs+7ezkUGhorzCweEvlVOFg= +k8s.io/cli-runtime v0.28.0/go.mod h1:U+ySmOKBm/JUCmebhmecXeTwNN1RzI7DW4+OM8Oryas= +k8s.io/client-go v0.28.0 h1:ebcPRDZsCjpj62+cMk1eGNX1QkMdRmQ6lmz5BLoFWeM= +k8s.io/client-go v0.28.0/go.mod h1:0Asy9Xt3U98RypWJmU1ZrRAGKhP6NqDPmptlAzK2kMc= +k8s.io/component-base v0.28.0 h1:HQKy1enJrOeJlTlN4a6dU09wtmXaUvThC0irImfqyxI= +k8s.io/component-base v0.28.0/go.mod h1:Yyf3+ZypLfMydVzuLBqJ5V7Kx6WwDr/5cN+dFjw1FNk= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443 h1:CAIciCnJnSOQxPd0xvpV6JU3D4AJvnYbImPpFpO9Hnw= +k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/kubectl v0.28.0 h1:qhfju0OaU+JGeBlToPeeIg2UJUWP++QwTkpio6nlPKg= +k8s.io/kubectl v0.28.0/go.mod h1:1We+E5nSX3/TVoSQ6y5Bzld5OhTBHZHlKEYl7g/NaTk= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +oras.land/oras-go v1.2.3 h1:v8PJl+gEAntI1pJ/LCrDgsuk+1PKVavVEPsYIHFE5uY= +oras.land/oras-go v1.2.3/go.mod h1:M/uaPdYklze0Vf3AakfarnpoEckvw0ESbRdN8Z1vdJg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= -sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= -sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= -sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= -sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/controller-runtime v0.15.1 h1:9UvgKD4ZJGcj24vefUFgZFP3xej/3igL9BsOUTb/+4c= +sigs.k8s.io/controller-runtime v0.15.1/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.14.0 h1:6+QLmXXA8X4eDM7ejeaNUyruA1DDB3PVIjbpVhDOJRA= +sigs.k8s.io/kustomize/api v0.14.0/go.mod h1:vmOXlC8BcmcUJQjiceUbcyQ75JBP6eg8sgoyzc+eLpQ= +sigs.k8s.io/kustomize/kyaml v0.14.3 h1:WpabVAKZe2YEp/irTSHwD6bfjwZnTtSDewd2BVJGMZs= +sigs.k8s.io/kustomize/kyaml v0.14.3/go.mod h1:npvh9epWysfQ689Rtt/U+dpOJDTBn8kUnF1O6VzvmZA= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pkg/config/config.go b/pkg/config/config.go index 7fbbf53..7ccff31 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -45,9 +45,8 @@ var ( type HelmRepositoryData struct { // Endpoint contains the Helm registry endpoint URL. Endpoint string `json:"endpoint"` - // InsecureSkipTLSVerify indicates if the server's certificate will not be checked for validity. - // This makes the HTTPS connections insecure. - InsecureSkipTLSVerify bool `json:"insecureSkipTLSVerify"` + // PlainHttp indicates that the repository endpoint should be accessed using plain http + PlainHttp bool `json:"plain_http"` } // GetOciEndpoint returns the configured endpoint of the HelmRepositoryData with the OCI-protocol @@ -122,15 +121,15 @@ func getHelmRepositoryFromConfigMap(configMapClient corev1.ConfigMapInterface) ( } // TODO Test the parsing - const configMapInsecureSkipTLSVerify = "insecureSkipTLSVerify" - insecureSkipTLSVerify, err := strconv.ParseBool(configMap.Data[configMapInsecureSkipTLSVerify]) + const configMapPlainHttp = "plain_http" + plainHttp, err := strconv.ParseBool(configMap.Data[configMapPlainHttp]) if err != nil { - return nil, fmt.Errorf("failed to parse field %s", configMapInsecureSkipTLSVerify) + return nil, fmt.Errorf("failed to parse field %s", configMapPlainHttp) } return &HelmRepositoryData{ - Endpoint: configMap.Data["endpoint"], - InsecureSkipTLSVerify: insecureSkipTLSVerify, + Endpoint: configMap.Data["endpoint"], + PlainHttp: plainHttp, }, nil } diff --git a/pkg/controllers/mock_componentEcosystemInterface_test.go b/pkg/controllers/mock_componentEcosystemInterface_test.go index a30373c..d38dc8e 100644 --- a/pkg/controllers/mock_componentEcosystemInterface_test.go +++ b/pkg/controllers/mock_componentEcosystemInterface_test.go @@ -26,6 +26,8 @@ import ( certificatesv1 "k8s.io/client-go/kubernetes/typed/certificates/v1" + certificatesv1alpha1 "k8s.io/client-go/kubernetes/typed/certificates/v1alpha1" + certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" coordinationv1 "k8s.io/client-go/kubernetes/typed/coordination/v1" @@ -78,8 +80,6 @@ import ( rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1" - resourcev1alpha1 "k8s.io/client-go/kubernetes/typed/resource/v1alpha1" - schedulingv1 "k8s.io/client-go/kubernetes/typed/scheduling/v1" schedulingv1alpha1 "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1" @@ -96,6 +96,8 @@ import ( v1alpha1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1" + v1alpha2 "k8s.io/client-go/kubernetes/typed/resource/v1alpha2" + v1beta1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1" v1beta2 "k8s.io/client-go/kubernetes/typed/apps/v1beta2" @@ -896,6 +898,49 @@ func (_c *mockComponentEcosystemInterface_CertificatesV1_Call) RunAndReturn(run return _c } +// CertificatesV1alpha1 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) CertificatesV1alpha1() certificatesv1alpha1.CertificatesV1alpha1Interface { + ret := _m.Called() + + var r0 certificatesv1alpha1.CertificatesV1alpha1Interface + if rf, ok := ret.Get(0).(func() certificatesv1alpha1.CertificatesV1alpha1Interface); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(certificatesv1alpha1.CertificatesV1alpha1Interface) + } + } + + return r0 +} + +// mockComponentEcosystemInterface_CertificatesV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CertificatesV1alpha1' +type mockComponentEcosystemInterface_CertificatesV1alpha1_Call struct { + *mock.Call +} + +// CertificatesV1alpha1 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) CertificatesV1alpha1() *mockComponentEcosystemInterface_CertificatesV1alpha1_Call { + return &mockComponentEcosystemInterface_CertificatesV1alpha1_Call{Call: _e.mock.On("CertificatesV1alpha1")} +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_CertificatesV1alpha1_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1alpha1_Call) Return(_a0 certificatesv1alpha1.CertificatesV1alpha1Interface) *mockComponentEcosystemInterface_CertificatesV1alpha1_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockComponentEcosystemInterface_CertificatesV1alpha1_Call) RunAndReturn(run func() certificatesv1alpha1.CertificatesV1alpha1Interface) *mockComponentEcosystemInterface_CertificatesV1alpha1_Call { + _c.Call.Return(run) + return _c +} + // CertificatesV1beta1 provides a mock function with given fields: func (_m *mockComponentEcosystemInterface) CertificatesV1beta1() certificatesv1beta1.CertificatesV1beta1Interface { ret := _m.Called() @@ -2057,45 +2102,45 @@ func (_c *mockComponentEcosystemInterface_RbacV1beta1_Call) RunAndReturn(run fun return _c } -// ResourceV1alpha1 provides a mock function with given fields: -func (_m *mockComponentEcosystemInterface) ResourceV1alpha1() resourcev1alpha1.ResourceV1alpha1Interface { +// ResourceV1alpha2 provides a mock function with given fields: +func (_m *mockComponentEcosystemInterface) ResourceV1alpha2() v1alpha2.ResourceV1alpha2Interface { ret := _m.Called() - var r0 resourcev1alpha1.ResourceV1alpha1Interface - if rf, ok := ret.Get(0).(func() resourcev1alpha1.ResourceV1alpha1Interface); ok { + var r0 v1alpha2.ResourceV1alpha2Interface + if rf, ok := ret.Get(0).(func() v1alpha2.ResourceV1alpha2Interface); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(resourcev1alpha1.ResourceV1alpha1Interface) + r0 = ret.Get(0).(v1alpha2.ResourceV1alpha2Interface) } } return r0 } -// mockComponentEcosystemInterface_ResourceV1alpha1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ResourceV1alpha1' -type mockComponentEcosystemInterface_ResourceV1alpha1_Call struct { +// mockComponentEcosystemInterface_ResourceV1alpha2_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ResourceV1alpha2' +type mockComponentEcosystemInterface_ResourceV1alpha2_Call struct { *mock.Call } -// ResourceV1alpha1 is a helper method to define mock.On call -func (_e *mockComponentEcosystemInterface_Expecter) ResourceV1alpha1() *mockComponentEcosystemInterface_ResourceV1alpha1_Call { - return &mockComponentEcosystemInterface_ResourceV1alpha1_Call{Call: _e.mock.On("ResourceV1alpha1")} +// ResourceV1alpha2 is a helper method to define mock.On call +func (_e *mockComponentEcosystemInterface_Expecter) ResourceV1alpha2() *mockComponentEcosystemInterface_ResourceV1alpha2_Call { + return &mockComponentEcosystemInterface_ResourceV1alpha2_Call{Call: _e.mock.On("ResourceV1alpha2")} } -func (_c *mockComponentEcosystemInterface_ResourceV1alpha1_Call) Run(run func()) *mockComponentEcosystemInterface_ResourceV1alpha1_Call { +func (_c *mockComponentEcosystemInterface_ResourceV1alpha2_Call) Run(run func()) *mockComponentEcosystemInterface_ResourceV1alpha2_Call { _c.Call.Run(func(args mock.Arguments) { run() }) return _c } -func (_c *mockComponentEcosystemInterface_ResourceV1alpha1_Call) Return(_a0 resourcev1alpha1.ResourceV1alpha1Interface) *mockComponentEcosystemInterface_ResourceV1alpha1_Call { +func (_c *mockComponentEcosystemInterface_ResourceV1alpha2_Call) Return(_a0 v1alpha2.ResourceV1alpha2Interface) *mockComponentEcosystemInterface_ResourceV1alpha2_Call { _c.Call.Return(_a0) return _c } -func (_c *mockComponentEcosystemInterface_ResourceV1alpha1_Call) RunAndReturn(run func() resourcev1alpha1.ResourceV1alpha1Interface) *mockComponentEcosystemInterface_ResourceV1alpha1_Call { +func (_c *mockComponentEcosystemInterface_ResourceV1alpha2_Call) RunAndReturn(run func() v1alpha2.ResourceV1alpha2Interface) *mockComponentEcosystemInterface_ResourceV1alpha2_Call { _c.Call.Return(run) return _c } diff --git a/pkg/helm/client.go b/pkg/helm/client.go index b8ffc76..514d79d 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -56,8 +56,6 @@ func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug if err != nil { return nil, fmt.Errorf("failed to create helm client: %w", err) } - // TODO Check if this is still needed after applying the http-plain patch - helmClient.(*helmclient.HelmClient).Settings.KubeInsecureSkipTLSVerify = helmRepoData.InsecureSkipTLSVerify clientGetter := helmclient.NewRESTClientGetter(namespace, nil, opt.RestConfig) actionConfig := new(action.Configuration) @@ -98,6 +96,7 @@ func (c *Client) InstallOrUpgrade(ctx context.Context, component *k8sv1.Componen chartSpec := component.GetHelmChartSpec(endpoint) + // TODO add plainHttp to GenericHelmOptions of mittwald _, err = c.helmClient.InstallOrUpgradeChart(ctx, chartSpec, nil) if err != nil { return fmt.Errorf("error while installing/upgrading component %s: %w", component, err) @@ -152,13 +151,12 @@ func (c *Client) getChart(ctx context.Context, component *k8sv1.Component, spec // We need this installAction because it sets the registryClient in ChartPathOptions which is a private field. install := action.NewInstall(c.actionConfig) install.Version = component.Spec.Version - install.InsecureSkipTLSverify = c.helmRepoData.InsecureSkipTLSVerify - install.ChartPathOptions.InsecureSkipTLSverify = c.helmRepoData.InsecureSkipTLSVerify + install.PlainHTTP = c.helmRepoData.PlainHttp logger.Info("Trying to get chart with options", "chart", spec.ChartName, "version", component.Spec.Version, - "tls insecure", c.helmRepoData.InsecureSkipTLSVerify) + "plain http", c.helmRepoData.PlainHttp) logger.Info("----- andere Logausgaben hier? -------------------") From 45d9e0e7335c6e3c2c64cbac37a6399e397201cc Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Mon, 21 Aug 2023 08:01:28 +0200 Subject: [PATCH 15/47] #15 Parse experimental plainHTTP config, fix some test errors --- pkg/config/config.go | 9 ++- pkg/config/config_test.go | 2 +- .../componentInstallManager_test.go | 6 +- .../componentUpgradeManager_test.go | 6 +- pkg/controllers/requeableErrors_test.go | 76 +++++++------------ pkg/helm/client_test.go | 27 ++++++- 6 files changed, 61 insertions(+), 65 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index 7ccff31..f2ccf81 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -107,16 +107,17 @@ func GetHelmRepositoryData(configMapClient corev1.ConfigMapInterface) (*HelmRepo if runtime == runtimeLocal { return getHelmRepositoryDataFromFile() - } else { - return getHelmRepositoryFromConfigMap(configMapClient) } + + return getHelmRepositoryFromConfigMap(configMapClient) } func getHelmRepositoryFromConfigMap(configMapClient corev1.ConfigMapInterface) (*HelmRepositoryData, error) { configMap, err := configMapClient.Get(context.TODO(), helmRepositoryConfigMapName, metav1.GetOptions{}) if errors.IsNotFound(err) { return nil, fmt.Errorf("helm repository configMap %s not found: %w", helmRepositoryConfigMapName, err) - } else if err != nil { + } + if err != nil { return nil, fmt.Errorf("failed to get helm repository configMap %s: %w", helmRepositoryConfigMapName, err) } @@ -124,7 +125,7 @@ func getHelmRepositoryFromConfigMap(configMapClient corev1.ConfigMapInterface) ( const configMapPlainHttp = "plain_http" plainHttp, err := strconv.ParseBool(configMap.Data[configMapPlainHttp]) if err != nil { - return nil, fmt.Errorf("failed to parse field %s", configMapPlainHttp) + return nil, fmt.Errorf("failed to parse field %s from configMap %s", configMapPlainHttp, helmRepositoryConfigMapName) } return &HelmRepositoryData{ diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index f2cb684..ae13dd2 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -86,7 +86,7 @@ func TestGetHelmRepositoryData(t *testing.T) { mockConfigMapInterface := external.NewMockConfigMapInterface(t) configMap := &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{Name: "component-operator-helm-repository"}, - Data: map[string]string{"endpoint": "endpoint"}, + Data: map[string]string{"endpoint": "endpoint", "plain_http": "false"}, } mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(configMap, nil) diff --git a/pkg/controllers/componentInstallManager_test.go b/pkg/controllers/componentInstallManager_test.go index d833312..07ef429 100644 --- a/pkg/controllers/componentInstallManager_test.go +++ b/pkg/controllers/componentInstallManager_test.go @@ -50,7 +50,7 @@ func Test_componentInstallManager_Install(t *testing.T) { mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(assert.AnError) mockRecorder := newMockEventRecorder(t) - mockRecorder.EXPECT().Eventf(component, "Warning", "Installation", "One or more dependencies are not satisfied: %s", assert.AnError.Error()).Return() + mockRecorder.EXPECT().Eventf(component, "Warning", "Installation", "Dependency check failed: %s", assert.AnError.Error()).Return() sut := componentInstallManager{ componentClient: mockComponentClient, @@ -64,9 +64,7 @@ func Test_componentInstallManager_Install(t *testing.T) { // then require.Error(t, err) assert.ErrorIs(t, err, assert.AnError) - var expectedRequeueableErr *dependencyUnsatisfiedError - assert.ErrorAs(t, err, &expectedRequeueableErr) - assert.ErrorContains(t, err, "one or more dependencies are not satisfied") + assert.ErrorContains(t, err, "failed to check dependencies") }) t.Run("failed to update installing status", func(t *testing.T) { diff --git a/pkg/controllers/componentUpgradeManager_test.go b/pkg/controllers/componentUpgradeManager_test.go index 5b6c268..f6b1cd0 100644 --- a/pkg/controllers/componentUpgradeManager_test.go +++ b/pkg/controllers/componentUpgradeManager_test.go @@ -59,7 +59,7 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(assert.AnError) mockRecorder := newMockEventRecorder(t) - mockRecorder.EXPECT().Eventf(component, "Warning", "Upgrade", "One or more dependencies are not satisfied: %s", assert.AnError.Error()).Return() + mockRecorder.EXPECT().Eventf(component, "Warning", "Upgrade", "Dependency check failed: %s", assert.AnError.Error()).Return() sut := componentUpgradeManager{ componentClient: mockComponentClient, @@ -73,9 +73,7 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { // then require.Error(t, err) assert.ErrorIs(t, err, assert.AnError) - var expectedRequeueableErr *dependencyUnsatisfiedError - assert.ErrorAs(t, err, &expectedRequeueableErr) - assert.ErrorContains(t, err, "one or more dependencies are not satisfied") + assert.ErrorContains(t, err, "failed to check dependencies") }) t.Run("should fail to upgrade component on error while setting upgrading status", func(t *testing.T) { diff --git a/pkg/controllers/requeableErrors_test.go b/pkg/controllers/requeableErrors_test.go index 2b0111f..d58025a 100644 --- a/pkg/controllers/requeableErrors_test.go +++ b/pkg/controllers/requeableErrors_test.go @@ -2,60 +2,12 @@ package controllers import ( "errors" - "testing" - "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "testing" + "time" ) -func Test_dependencyUnsatisfiedError_GetRequeueTime(t *testing.T) { - type args struct { - requeueTime time.Duration - } - tests := []struct { - name string - args args - want time.Duration - }{ - // double the value until the threshold jumps in - {"1st interval", args{0 * time.Second}, 15 * time.Second}, - {"2nd interval", args{15 * time.Second}, 30 * time.Second}, - {"3rd interval", args{30 * time.Second}, 1 * time.Minute}, - {"11th interval", args{128 * time.Minute}, 256 * time.Minute}, - {"cutoff interval ", args{256 * time.Minute}, 6 * time.Hour}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - due := &dependencyUnsatisfiedError{} - assert.Equalf(t, tt.want, due.GetRequeueTime(tt.args.requeueTime), "getRequeueTime(%v)", tt.args.requeueTime) - }) - } -} - -func Test_dependencyUnsatisfiedError_Unwrap(t *testing.T) { - testErr1 := assert.AnError - testErr2 := errors.New("test") - inputErr := errors.Join(testErr1, testErr2) - - sut := &dependencyUnsatisfiedError{inputErr} - - // when - actualErr := sut.Unwrap() - - // then - require.Error(t, sut) - require.Error(t, actualErr) - assert.ErrorIs(t, actualErr, testErr1) - assert.ErrorIs(t, actualErr, testErr2) -} - -func Test_dependencyUnsatisfiedError_Error(t *testing.T) { - sut := &dependencyUnsatisfiedError{assert.AnError} - expected := "one or more dependencies are not satisfied: assert.AnError general error for testing" - assert.Equal(t, expected, sut.Error()) -} - func Test_genericRequeueableError_Unwrap(t *testing.T) { testErr1 := assert.AnError testErr2 := errors.New("test") @@ -78,3 +30,27 @@ func Test_genericRequeueableError_Error(t *testing.T) { expected := "oh noez: " + assert.AnError.Error() assert.Equal(t, expected, sut.Error()) } + +func Test_genericRequeueableError_GetRequeueTime(t *testing.T) { + type args struct { + requeueTime time.Duration + } + tests := []struct { + name string + args args + want time.Duration + }{ + // double the value until the threshold jumps in + {"1st interval", args{0 * time.Second}, 15 * time.Second}, + {"2nd interval", args{15 * time.Second}, 30 * time.Second}, + {"3rd interval", args{30 * time.Second}, 1 * time.Minute}, + {"11th interval", args{128 * time.Minute}, 256 * time.Minute}, + {"cutoff interval ", args{256 * time.Minute}, 6 * time.Hour}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + due := &genericRequeueableError{} + assert.Equalf(t, tt.want, due.GetRequeueTime(tt.args.requeueTime), "getRequeueTime(%v)", tt.args.requeueTime) + }) + } +} diff --git a/pkg/helm/client_test.go b/pkg/helm/client_test.go index 3628e90..9c0a409 100644 --- a/pkg/helm/client_test.go +++ b/pkg/helm/client_test.go @@ -2,10 +2,10 @@ package helm import ( "context" - "testing" - + "errors" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" "github.com/cloudogu/k8s-component-operator/pkg/config" + "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -190,3 +190,26 @@ func TestClient_ListDeployedReleases(t *testing.T) { assert.ErrorIs(t, err, assert.AnError) }) } + +func Test_dependencyUnsatisfiedError_Unwrap(t *testing.T) { + testErr1 := assert.AnError + testErr2 := errors.New("test") + inputErr := errors.Join(testErr1, testErr2) + + sut := &dependencyUnsatisfiedError{inputErr} + + // when + actualErr := sut.Unwrap() + + // then + require.Error(t, sut) + require.Error(t, actualErr) + assert.ErrorIs(t, actualErr, testErr1) + assert.ErrorIs(t, actualErr, testErr2) +} + +func Test_dependencyUnsatisfiedError_Error(t *testing.T) { + sut := &dependencyUnsatisfiedError{assert.AnError} + expected := "one or more dependencies are not satisfied: assert.AnError general error for testing" + assert.Equal(t, expected, sut.Error()) +} From f8a71da9fb1f5013e9efaa98b0c6e726557c24cd Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Mon, 21 Aug 2023 08:22:24 +0200 Subject: [PATCH 16/47] #15 Fix shared manager mock after upgrade to experimental k8s library --- main_internal_test.go | 5 +-- pkg/mocks/external/Manager.go | 59 +++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/main_internal_test.go b/main_internal_test.go index fa3f06b..01fb68c 100644 --- a/main_internal_test.go +++ b/main_internal_test.go @@ -6,6 +6,7 @@ import ( "fmt" v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" "os" + "sigs.k8s.io/controller-runtime/pkg/config" "testing" "github.com/cloudogu/k8s-component-operator/pkg/mocks/external" @@ -18,7 +19,6 @@ import ( clientgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/config/v1alpha1" "sigs.k8s.io/controller-runtime/pkg/manager" ) @@ -94,9 +94,10 @@ func Test_startDoguOperator(t *testing.T) { "AddHealthzCheck": {Arguments: []interface{}{mock.Anything, mock.Anything}, ReturnValue: nil}, "AddReadyzCheck": {Arguments: []interface{}{mock.Anything, mock.Anything}, ReturnValue: nil}, "Start": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, - "GetControllerOptions": {ReturnValue: v1alpha1.ControllerConfigurationSpec{}}, + "GetControllerOptions": {ReturnValue: config.Controller{}}, "SetFields": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, "GetEventRecorderFor": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, + "GetCache": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, } t.Run("Error on missing namespace environment variable", func(t *testing.T) { diff --git a/pkg/mocks/external/Manager.go b/pkg/mocks/external/Manager.go index 5606ea5..0d89302 100644 --- a/pkg/mocks/external/Manager.go +++ b/pkg/mocks/external/Manager.go @@ -3,39 +3,44 @@ package external import ( - cache "sigs.k8s.io/controller-runtime/pkg/cache" - client "sigs.k8s.io/controller-runtime/pkg/client" - context "context" - - healthz "sigs.k8s.io/controller-runtime/pkg/healthz" - http "net/http" logr "github.com/go-logr/logr" - - manager "sigs.k8s.io/controller-runtime/pkg/manager" - - meta "k8s.io/apimachinery/pkg/api/meta" - mock "github.com/stretchr/testify/mock" - record "k8s.io/client-go/tools/record" - - rest "k8s.io/client-go/rest" - + meta "k8s.io/apimachinery/pkg/api/meta" runtime "k8s.io/apimachinery/pkg/runtime" - - v1alpha1 "sigs.k8s.io/controller-runtime/pkg/config/v1alpha1" - + rest "k8s.io/client-go/rest" + record "k8s.io/client-go/tools/record" + cache "sigs.k8s.io/controller-runtime/pkg/cache" + client "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/config" + healthz "sigs.k8s.io/controller-runtime/pkg/healthz" + manager "sigs.k8s.io/controller-runtime/pkg/manager" webhook "sigs.k8s.io/controller-runtime/pkg/webhook" ) -// Manager is an autogenerated mock type for the Manager type +// Manager was an autogenerated mock type for the Manager type but must somehow maintained manually. type Manager struct { mock.Mock } +func (_m *Manager) GetHTTPClient() *http.Client { + ret := _m.Called() + + var r0 *http.Client + if rf, ok := ret.Get(0).(func() *http.Client); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*http.Client) + } + } + + return r0 +} + // Add provides a mock function with given fields: _a0 func (_m *Manager) Add(_a0 manager.Runnable) error { ret := _m.Called(_a0) @@ -173,14 +178,14 @@ func (_m *Manager) GetConfig() *rest.Config { } // GetControllerOptions provides a mock function with given fields: -func (_m *Manager) GetControllerOptions() v1alpha1.ControllerConfigurationSpec { +func (_m *Manager) GetControllerOptions() config.Controller { ret := _m.Called() - var r0 v1alpha1.ControllerConfigurationSpec - if rf, ok := ret.Get(0).(func() v1alpha1.ControllerConfigurationSpec); ok { + var r0 config.Controller + if rf, ok := ret.Get(0).(func() config.Controller); ok { r0 = rf() } else { - r0 = ret.Get(0).(v1alpha1.ControllerConfigurationSpec) + r0 = ret.Get(0).(config.Controller) } return r0 @@ -265,15 +270,15 @@ func (_m *Manager) GetScheme() *runtime.Scheme { } // GetWebhookServer provides a mock function with given fields: -func (_m *Manager) GetWebhookServer() *webhook.Server { +func (_m *Manager) GetWebhookServer() webhook.Server { ret := _m.Called() - var r0 *webhook.Server - if rf, ok := ret.Get(0).(func() *webhook.Server); ok { + var r0 webhook.Server + if rf, ok := ret.Get(0).(func() webhook.Server); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*webhook.Server) + r0 = ret.Get(0).(webhook.Server) } } From c7c3954f839b9852bec24c9252c699641bad4d6b Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Mon, 21 Aug 2023 08:27:22 +0200 Subject: [PATCH 17/47] #15 Fix shared manager mock after upgrade to experimental k8s library --- main_internal_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/main_internal_test.go b/main_internal_test.go index 01fb68c..6bbe72e 100644 --- a/main_internal_test.go +++ b/main_internal_test.go @@ -95,7 +95,6 @@ func Test_startDoguOperator(t *testing.T) { "AddReadyzCheck": {Arguments: []interface{}{mock.Anything, mock.Anything}, ReturnValue: nil}, "Start": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, "GetControllerOptions": {ReturnValue: config.Controller{}}, - "SetFields": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, "GetEventRecorderFor": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, "GetCache": {Arguments: []interface{}{mock.Anything}, ReturnValue: nil}, } From 2981c4d081ed2089d220df79335cde7ef509b10b Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Mon, 21 Aug 2023 08:39:39 +0200 Subject: [PATCH 18/47] #15 I have no idea how this test harness is any beneficial to us --- main_internal_test.go | 1 - pkg/helm/client.go | 2 -- 2 files changed, 3 deletions(-) diff --git a/main_internal_test.go b/main_internal_test.go index 6bbe72e..23a9bec 100644 --- a/main_internal_test.go +++ b/main_internal_test.go @@ -144,7 +144,6 @@ func Test_startDoguOperator(t *testing.T) { "AddHealthzCheck", "AddReadyzCheck", "Start", - "SetFields", } for _, mockDefinitionName := range mockDefinitionsThatCanFail { diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 514d79d..a38d375 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -158,8 +158,6 @@ func (c *Client) getChart(ctx context.Context, component *k8sv1.Component, spec "version", component.Spec.Version, "plain http", c.helmRepoData.PlainHttp) - logger.Info("----- andere Logausgaben hier? -------------------") - componentChart, _, err := c.helmClient.GetChart(spec.ChartName, &install.ChartPathOptions) if err != nil { return nil, fmt.Errorf("error while getting chart for %s:%s: %w", component.Spec.Name, component.Spec.Version, err) From 30e69db13efaec9c559a85f70f47cb0713316e36 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Mon, 21 Aug 2023 10:44:06 +0200 Subject: [PATCH 19/47] #15 support plain HTTP helm registries This is done by using the unreleased helm plain HTTP feature. Co-authored-by: Philipp Pixel --- go.mod | 7 ++++++- go.sum | 4 ++-- pkg/helm/client.go | 3 +-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index e133480..0c0eb2a 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,12 @@ require ( sigs.k8s.io/controller-runtime v0.15.1 ) -replace google.golang.org/grpc => google.golang.org/grpc v1.57.0 +replace ( + // replace mittwald client with our own until mittwald supports plain HTTP helm registries + // this should be released in helm v3.13 which is scheduled in September 23 + github.com/mittwald/go-helm-client v0.12.3 => github.com/cloudogu/go-helm-client v0.0.0-20230821082439-086faec15c22 + google.golang.org/grpc => google.golang.org/grpc v1.57.0 +) require ( github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect diff --git a/go.sum b/go.sum index 9cab267..cebdf01 100644 --- a/go.sum +++ b/go.sum @@ -656,6 +656,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cloudogu/cesapp-lib v0.12.0 h1:+yRVk65DljGtJj/gNpgBRhvIJHfGy7kr4/iEw1LJugg= github.com/cloudogu/cesapp-lib v0.12.0/go.mod h1:PTQqI3xs1ReJMXYE6BGTF33yAfmS4J7P8UiE4AwDMDY= +github.com/cloudogu/go-helm-client v0.0.0-20230821082439-086faec15c22 h1:hGFLpuVIEy6TcSfMTePAN7wOxSQ0zkFSI0IU0nR/xd4= +github.com/cloudogu/go-helm-client v0.0.0-20230821082439-086faec15c22/go.mod h1:b1jCbr7z27zWDtVPp3IjXDMwe7GrHxg/L8jOC5jW9Ls= github.com/cloudogu/k8s-apply-lib v0.4.2 h1:D5hTYvIZya+tAyGCUGaZ1T83otvpQwzrZXz5JPHQQ5M= github.com/cloudogu/k8s-apply-lib v0.4.2/go.mod h1:jR/+7q47O5gb++4gVsmEElT8/EJoi+Msw2dVzArTPW0= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= @@ -994,8 +996,6 @@ github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTS github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mittwald/go-helm-client v0.12.3 h1:WlXhuMTT5HUdiYeiYMxlvi3XBxTKoGCNHcSsirLi8ug= -github.com/mittwald/go-helm-client v0.12.3/go.mod h1:lC1Sn912rgRkGQZBUntJO7TOlqa1kK3Idwr3yo1Tco0= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= diff --git a/pkg/helm/client.go b/pkg/helm/client.go index a38d375..c1963ee 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -96,8 +96,7 @@ func (c *Client) InstallOrUpgrade(ctx context.Context, component *k8sv1.Componen chartSpec := component.GetHelmChartSpec(endpoint) - // TODO add plainHttp to GenericHelmOptions of mittwald - _, err = c.helmClient.InstallOrUpgradeChart(ctx, chartSpec, nil) + _, err = c.helmClient.InstallOrUpgradeChart(ctx, chartSpec, &helmclient.GenericHelmOptions{PlainHttp: c.helmRepoData.PlainHttp}) if err != nil { return fmt.Errorf("error while installing/upgrading component %s: %w", component, err) } From 7271476bb11973a3b864c35799dcb78fd7f7bf88 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 10:39:21 +0200 Subject: [PATCH 20/47] #15 fix plain HTTP registry configuration Co-authored-by: Philipp Pixel --- go.mod | 2 +- go.sum | 4 ++-- pkg/helm/client.go | 12 +++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 0c0eb2a..ab5ec6c 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( replace ( // replace mittwald client with our own until mittwald supports plain HTTP helm registries // this should be released in helm v3.13 which is scheduled in September 23 - github.com/mittwald/go-helm-client v0.12.3 => github.com/cloudogu/go-helm-client v0.0.0-20230821082439-086faec15c22 + github.com/mittwald/go-helm-client v0.12.3 => github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d google.golang.org/grpc => google.golang.org/grpc v1.57.0 ) diff --git a/go.sum b/go.sum index cebdf01..e41822a 100644 --- a/go.sum +++ b/go.sum @@ -656,8 +656,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cloudogu/cesapp-lib v0.12.0 h1:+yRVk65DljGtJj/gNpgBRhvIJHfGy7kr4/iEw1LJugg= github.com/cloudogu/cesapp-lib v0.12.0/go.mod h1:PTQqI3xs1ReJMXYE6BGTF33yAfmS4J7P8UiE4AwDMDY= -github.com/cloudogu/go-helm-client v0.0.0-20230821082439-086faec15c22 h1:hGFLpuVIEy6TcSfMTePAN7wOxSQ0zkFSI0IU0nR/xd4= -github.com/cloudogu/go-helm-client v0.0.0-20230821082439-086faec15c22/go.mod h1:b1jCbr7z27zWDtVPp3IjXDMwe7GrHxg/L8jOC5jW9Ls= +github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d h1:wORDIdIYkMpsHrNUXbyhllPYpM8fbXIYqv0jvrcIj6I= +github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d/go.mod h1:b1jCbr7z27zWDtVPp3IjXDMwe7GrHxg/L8jOC5jW9Ls= github.com/cloudogu/k8s-apply-lib v0.4.2 h1:D5hTYvIZya+tAyGCUGaZ1T83otvpQwzrZXz5JPHQQ5M= github.com/cloudogu/k8s-apply-lib v0.4.2/go.mod h1:jR/+7q47O5gb++4gVsmEElT8/EJoi+Msw2dVzArTPW0= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= diff --git a/pkg/helm/client.go b/pkg/helm/client.go index c1963ee..f479f03 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -47,11 +47,11 @@ func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug Debug: debug, DebugLog: debugLog, Linting: true, + PlainHttp: helmRepoData.PlainHttp, }, RestConfig: ctrl.GetConfigOrDie(), } - opt.RestConfig.Insecure = true helmClient, err := helmclient.NewClientFromRestConf(opt) if err != nil { return nil, fmt.Errorf("failed to create helm client: %w", err) @@ -70,10 +70,16 @@ func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug return nil, err } - helmRegistryClient, err := registry.NewClient( + clientOpts := []registry.ClientOption{ registry.ClientOptDebug(debug), registry.ClientOptCredentialsFile(helmRegistryConfigFile), - ) + } + + if helmRepoData.PlainHttp { + clientOpts = append(clientOpts, registry.ClientOptPlainHTTP()) + } + + helmRegistryClient, err := registry.NewClient(clientOpts...) if err != nil { return nil, err } From b5ba93ea9307fde037d8bd5ce78febc23714187d Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 10:45:13 +0200 Subject: [PATCH 21/47] boyscouting: update grpc lib and remove go mod replace Co-authored-by: Philipp Pixel --- go.mod | 11 +- go.sum | 1325 +------------------------------------------------------- 2 files changed, 18 insertions(+), 1318 deletions(-) diff --git a/go.mod b/go.mod index ab5ec6c..e122eca 100644 --- a/go.mod +++ b/go.mod @@ -21,12 +21,9 @@ require ( sigs.k8s.io/controller-runtime v0.15.1 ) -replace ( - // replace mittwald client with our own until mittwald supports plain HTTP helm registries - // this should be released in helm v3.13 which is scheduled in September 23 - github.com/mittwald/go-helm-client v0.12.3 => github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d - google.golang.org/grpc => google.golang.org/grpc v1.57.0 -) +// replace mittwald client with our own until mittwald supports plain HTTP helm registries +// this should be released in helm v3.13 which is scheduled in September 23 +replace github.com/mittwald/go-helm-client v0.12.3 => github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d require ( github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect @@ -142,7 +139,7 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 // indirect - google.golang.org/grpc v1.54.0 // indirect + google.golang.org/grpc v1.57.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/go.sum b/go.sum index e41822a..07f0c23 100644 --- a/go.sum +++ b/go.sum @@ -1,598 +1,4 @@ -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= -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.44.3/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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -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.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -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/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -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/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -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= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= @@ -600,9 +6,7 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg6 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -617,17 +21,8 @@ github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA4 github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/hcsshim v0.10.0-rc.8 h1:YSZVvlIIDD1UxQpJp0h+dnpLUw+TrY0cx8obKsp3bek= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= @@ -637,16 +32,11 @@ 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/bombsimon/logrusr/v2 v2.0.1 h1:1VgxVNQMCvjirZIYaT9JYn6sAVGVEcNtRE0y4mvaOAM= github.com/bombsimon/logrusr/v2 v2.0.1/go.mod h1:ByVAX+vHdLGAfdroiMg6q0zgq2FODY2lc5YJvzmOJio= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= @@ -654,20 +44,13 @@ github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHe 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/cloudogu/cesapp-lib v0.12.0 h1:+yRVk65DljGtJj/gNpgBRhvIJHfGy7kr4/iEw1LJugg= github.com/cloudogu/cesapp-lib v0.12.0/go.mod h1:PTQqI3xs1ReJMXYE6BGTF33yAfmS4J7P8UiE4AwDMDY= github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d h1:wORDIdIYkMpsHrNUXbyhllPYpM8fbXIYqv0jvrcIj6I= github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d/go.mod h1:b1jCbr7z27zWDtVPp3IjXDMwe7GrHxg/L8jOC5jW9Ls= github.com/cloudogu/k8s-apply-lib v0.4.2 h1:D5hTYvIZya+tAyGCUGaZ1T83otvpQwzrZXz5JPHQQ5M= github.com/cloudogu/k8s-apply-lib v0.4.2/go.mod h1:jR/+7q47O5gb++4gVsmEElT8/EJoi+Msw2dVzArTPW0= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -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/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/containerd v1.7.3 h1:cKwYKkP1eTj54bP3wCdXXBymmKRQMrWjkLSWZZJDa8o= github.com/containerd/containerd v1.7.3/go.mod h1:32FOM4/O0RkNg7AjQj3hDzN9cUGtu+HMvaKUNiqCZB8= @@ -697,19 +80,12 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= @@ -719,30 +95,17 @@ github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSY github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -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-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= 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-logr/logr v1.0.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -761,8 +124,6 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -773,33 +134,16 @@ github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0 github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XEWlY= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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= @@ -807,87 +151,32 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -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/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.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/martian/v3 v3.3.2/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-20201218002935-b9804c9f04c2/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 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -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/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/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/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -896,24 +185,16 @@ github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -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.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= @@ -928,27 +209,16 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.7/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/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -963,9 +233,6 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= @@ -973,21 +240,17 @@ github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.1.25 h1:dFwPR6SfLtrSwgDcIq2bcU/gVutB4sNApq2HBdqcakg= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -1036,17 +299,10 @@ github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVn github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= @@ -1058,8 +314,6 @@ github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lF 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_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1071,21 +325,14 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -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/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rubenv/sql-migrate v1.5.2 h1:bMDqOnrJVV/6JQgQ/MxOpU+AdO8uzYYA/TxFUBzFtS0= github.com/rubenv/sql-migrate v1.5.2/go.mod h1:H38GW8Vqf8F0Su5XignRyaRcbXbJunSWxs+kmzlg0Is= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= @@ -1094,9 +341,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= @@ -1111,14 +355,12 @@ github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 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/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/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1130,36 +372,19 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.starlark.net v0.0.0-20230814145427-12f4cb8177e4 h1:Ydko8M6UfXgvSpGOnbAjRMQDIvBheUsjBjkm6Azcpf4= go.starlark.net v0.0.0-20230814145427-12f4cb8177e4/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= @@ -1168,593 +393,124 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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-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-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -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/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/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-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/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-20201224014010-6772e930b67b/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-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/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/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-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/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= 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/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +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-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-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-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-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-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/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-20210423185535-09eb48e85fd7/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-20210608053332-aa57babbf139/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-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-20210816183151-1e6c022a8912/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-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-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-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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-20190114222345-bf090417da8b/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-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-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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -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-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-20190927191325-030b2cf1153e/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-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-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-20201124115921-2c860bdd6e78/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.0.0-20210108195828-e2f9c7f1fc8e/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/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -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.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +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.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-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-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -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-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-20210108203827-ffc7fda8c3d7/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-20210226172003-ab064af71705/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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -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-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -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-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -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= @@ -1763,23 +519,15 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi 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/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -1787,7 +535,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.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.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1801,13 +548,7 @@ gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= helm.sh/helm/v3 v3.12.0-dev.1.0.20230817154107-a749b663101d h1:6J+y+NmyX17vulRO05myRL0BzQwmzZ3bNs+h0ZUiAE4= helm.sh/helm/v3 v3.12.0-dev.1.0.20230817154107-a749b663101d/go.mod h1:bmvO+xB/gCRkjlpIFBHGEDI4tCwmTU+tcOGqd4C4RqU= 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.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= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.28.0 h1:3j3VPWmN9tTDI68NETBWlDiA9qOiGJ7sdKeufehBYsM= k8s.io/api v0.28.0/go.mod h1:0l8NZJzB0i/etuWnIXcwfIv+xnDOhL3lLW919AWYDuY= k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= @@ -1830,46 +571,8 @@ k8s.io/kubectl v0.28.0 h1:qhfju0OaU+JGeBlToPeeIg2UJUWP++QwTkpio6nlPKg= k8s.io/kubectl v0.28.0/go.mod h1:1We+E5nSX3/TVoSQ6y5Bzld5OhTBHZHlKEYl7g/NaTk= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= oras.land/oras-go v1.2.3 h1:v8PJl+gEAntI1pJ/LCrDgsuk+1PKVavVEPsYIHFE5uY= oras.land/oras-go v1.2.3/go.mod h1:M/uaPdYklze0Vf3AakfarnpoEckvw0ESbRdN8Z1vdJg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -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/controller-runtime v0.15.1 h1:9UvgKD4ZJGcj24vefUFgZFP3xej/3igL9BsOUTb/+4c= sigs.k8s.io/controller-runtime v0.15.1/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= From 6fc610a7b69542a8211aa665002f01330ab43162 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 14:10:22 +0200 Subject: [PATCH 22/47] #15 make plainHttp config optional add missing yaml tags test helm repo data fetching --- pkg/config/config.go | 16 +++--- pkg/config/config_test.go | 56 +++++++++++++++++-- pkg/config/testdata/helm-repository.yaml | 3 +- .../testdata/invalid-helm-repository.yaml | 1 + 4 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 pkg/config/testdata/invalid-helm-repository.yaml diff --git a/pkg/config/config.go b/pkg/config/config.go index f2ccf81..2f51761 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -44,9 +44,9 @@ var ( // HelmRepositoryData contains all necessary data for the helm repository. type HelmRepositoryData struct { // Endpoint contains the Helm registry endpoint URL. - Endpoint string `json:"endpoint"` + Endpoint string `json:"endpoint" yaml:"endpoint"` // PlainHttp indicates that the repository endpoint should be accessed using plain http - PlainHttp bool `json:"plain_http"` + PlainHttp bool `json:"plainHttp,omitempty" yaml:"plainHttp,omitempty"` } // GetOciEndpoint returns the configured endpoint of the HelmRepositoryData with the OCI-protocol @@ -121,11 +121,13 @@ func getHelmRepositoryFromConfigMap(configMapClient corev1.ConfigMapInterface) ( return nil, fmt.Errorf("failed to get helm repository configMap %s: %w", helmRepositoryConfigMapName, err) } - // TODO Test the parsing - const configMapPlainHttp = "plain_http" - plainHttp, err := strconv.ParseBool(configMap.Data[configMapPlainHttp]) - if err != nil { - return nil, fmt.Errorf("failed to parse field %s from configMap %s", configMapPlainHttp, helmRepositoryConfigMapName) + plainHttp := false + const configMapPlainHttp = "plainHttp" + if plainHttpStr, exists := configMap.Data[configMapPlainHttp]; exists { + plainHttp, err = strconv.ParseBool(plainHttpStr) + if err != nil { + return nil, fmt.Errorf("failed to parse field %s from configMap %s", configMapPlainHttp, helmRepositoryConfigMapName) + } } return &HelmRepositoryData{ diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index ae13dd2..177f2d6 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -46,14 +46,18 @@ func TestGetHelmRepositoryData(t *testing.T) { t.Setenv("RUNTIME", "local") t.Run("success from file", func(t *testing.T) { // given - devHelmRepoDataPath = "../../k8s/helm-repository.yaml" + devHelmRepoDataPath = "testdata/helm-repository.yaml" + expected := &HelmRepositoryData{ + Endpoint: "http://192.168.56.3:30100", + PlainHttp: true, + } // when result, err := GetHelmRepositoryData(nil) // then require.NoError(t, err) - assert.Equal(t, "http://192.168.56.3:30100", result.Endpoint) + assert.Equal(t, expected, result) }) t.Run("should throw error because the file does not exists", func(t *testing.T) { @@ -70,7 +74,7 @@ func TestGetHelmRepositoryData(t *testing.T) { t.Run("should throw error because wrong yaml format", func(t *testing.T) { // given - devHelmRepoDataPath = "testdata/helm-repository.yaml" + devHelmRepoDataPath = "testdata/invalid-helm-repository.yaml" // when _, err := GetHelmRepositoryData(nil) @@ -86,16 +90,58 @@ func TestGetHelmRepositoryData(t *testing.T) { mockConfigMapInterface := external.NewMockConfigMapInterface(t) configMap := &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{Name: "component-operator-helm-repository"}, - Data: map[string]string{"endpoint": "endpoint", "plain_http": "false"}, + Data: map[string]string{"endpoint": "endpoint", "plainHttp": "false"}, } mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(configMap, nil) + expected := &HelmRepositoryData{ + Endpoint: "endpoint", + PlainHttp: false, + } // when result, err := GetHelmRepositoryData(mockConfigMapInterface) // then require.NoError(t, err) - assert.Equal(t, "endpoint", result.Endpoint) + assert.Equal(t, expected, result) + }) + + t.Run("success with plainHttp not existing", func(t *testing.T) { + // given + mockConfigMapInterface := external.NewMockConfigMapInterface(t) + configMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: "component-operator-helm-repository"}, + Data: map[string]string{"endpoint": "endpoint"}, + } + mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(configMap, nil) + expected := &HelmRepositoryData{ + Endpoint: "endpoint", + PlainHttp: false, + } + + // when + result, err := GetHelmRepositoryData(mockConfigMapInterface) + + // then + require.NoError(t, err) + assert.Equal(t, expected, result) + }) + + t.Run("should fail to parse plainHttp", func(t *testing.T) { + // given + mockConfigMapInterface := external.NewMockConfigMapInterface(t) + configMap := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: "component-operator-helm-repository"}, + Data: map[string]string{"endpoint": "endpoint", "plainHttp": "not-a-bool"}, + } + mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(configMap, nil) + + // when + _, err := GetHelmRepositoryData(mockConfigMapInterface) + + // then + require.Error(t, err) + assert.ErrorContains(t, err, "failed to parse field plainHttp from configMap component-operator-helm-repository") }) t.Run("should return not found error if no secret was found", func(t *testing.T) { diff --git a/pkg/config/testdata/helm-repository.yaml b/pkg/config/testdata/helm-repository.yaml index 4768a0c..41d0537 100644 --- a/pkg/config/testdata/helm-repository.yaml +++ b/pkg/config/testdata/helm-repository.yaml @@ -1 +1,2 @@ -endpointtt http://192.168.56.3:30100 \ No newline at end of file +endpoint: http://192.168.56.3:30100 +plainHttp: true \ No newline at end of file diff --git a/pkg/config/testdata/invalid-helm-repository.yaml b/pkg/config/testdata/invalid-helm-repository.yaml new file mode 100644 index 0000000..4768a0c --- /dev/null +++ b/pkg/config/testdata/invalid-helm-repository.yaml @@ -0,0 +1 @@ +endpointtt http://192.168.56.3:30100 \ No newline at end of file From 8aa4cc6ec9e9b545c43d803f0f8eb34bd65959c9 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 14:16:21 +0200 Subject: [PATCH 23/47] #15 set static "secret" helm driver --- pkg/helm/client.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index f479f03..3380a51 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -3,8 +3,6 @@ package helm import ( "context" "fmt" - "os" - k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" "github.com/cloudogu/k8s-component-operator/pkg/config" @@ -62,8 +60,7 @@ func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug err = actionConfig.Init( clientGetter, namespace, - // TODO PhilippPixel/ move to place of central configuration - os.Getenv("HELM_DRIVER"), + "secret", debugLog, ) if err != nil { From 87575ec8eb64647f372ba0b0828359d4c747cff3 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 14:25:07 +0200 Subject: [PATCH 24/47] #15 extract action config creation --- pkg/helm/client.go | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 3380a51..0d670e2 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -5,6 +5,7 @@ import ( "fmt" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" "github.com/cloudogu/k8s-component-operator/pkg/config" + "k8s.io/client-go/rest" helmclient "github.com/mittwald/go-helm-client" "helm.sh/helm/v3/pkg/action" @@ -55,16 +56,30 @@ func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug return nil, fmt.Errorf("failed to create helm client: %w", err) } - clientGetter := helmclient.NewRESTClientGetter(namespace, nil, opt.RestConfig) + actionConfig, err := createActionConfig(namespace, helmRepoData.PlainHttp, debug, debugLog, opt.RestConfig) + if err != nil { + return nil, fmt.Errorf("failed to create helm client: %w", err) + } + + return &Client{ + helmClient: helmClient, + helmRepoData: helmRepoData, + actionConfig: actionConfig, + dependencyChecker: &installedDependencyChecker{}, + }, nil +} + +func createActionConfig(namespace string, plainHttp bool, debug bool, debugLog action.DebugLog, restConfig *rest.Config) (*action.Configuration, error) { actionConfig := new(action.Configuration) - err = actionConfig.Init( + clientGetter := helmclient.NewRESTClientGetter(namespace, nil, restConfig) + err := actionConfig.Init( clientGetter, namespace, "secret", debugLog, ) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to init actionConfig: %w", err) } clientOpts := []registry.ClientOption{ @@ -72,22 +87,17 @@ func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug registry.ClientOptCredentialsFile(helmRegistryConfigFile), } - if helmRepoData.PlainHttp { + if plainHttp { clientOpts = append(clientOpts, registry.ClientOptPlainHTTP()) } helmRegistryClient, err := registry.NewClient(clientOpts...) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to create helm registry client: %w", err) } - actionConfig.RegistryClient = helmRegistryClient - return &Client{ - helmClient: helmClient, - helmRepoData: helmRepoData, - actionConfig: actionConfig, - dependencyChecker: &installedDependencyChecker{}, - }, nil + actionConfig.RegistryClient = helmRegistryClient + return actionConfig, nil } // InstallOrUpgrade takes a component and applies the corresponding helmChart. From 6bcd609342344b518a050817ccbce5c815ea994e Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 15:23:58 +0200 Subject: [PATCH 25/47] #15 fix compile + test errors after merge --- pkg/config/config.go | 4 + pkg/controllers/componentInstallManager.go | 2 +- .../componentInstallManager_test.go | 13 ++- pkg/controllers/componentUpgradeManager.go | 2 +- .../componentUpgradeManager_test.go | 10 +-- pkg/controllers/component_manager.go | 42 ---------- pkg/controllers/interfaces.go | 11 +-- pkg/controllers/mock_HelmClient_test.go | 0 pkg/controllers/mock_helmClient_test.go | 70 ++++++++-------- pkg/helm/client.go | 62 +++++++------- pkg/helm/client_test.go | 3 +- pkg/helm/mock_OciRepositoryConfig_test.go | 84 ------------------- 12 files changed, 90 insertions(+), 213 deletions(-) delete mode 100644 pkg/controllers/mock_HelmClient_test.go delete mode 100644 pkg/helm/mock_OciRepositoryConfig_test.go diff --git a/pkg/config/config.go b/pkg/config/config.go index 52da368..b959dce 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -62,6 +62,10 @@ func (hrd *HelmRepositoryData) GetOciEndpoint() (string, error) { return "", fmt.Errorf("error creating oci-endpoint from '%s': wrong format", hrd.Endpoint) } +func (hrd *HelmRepositoryData) IsPlainHttp() bool { + return hrd.PlainHttp +} + // OperatorConfig contains all configurable values for the dogu operator. type OperatorConfig struct { // Namespace specifies the namespace that the operator is deployed to. diff --git a/pkg/controllers/componentInstallManager.go b/pkg/controllers/componentInstallManager.go index 42597ef..4ed5908 100644 --- a/pkg/controllers/componentInstallManager.go +++ b/pkg/controllers/componentInstallManager.go @@ -32,7 +32,7 @@ func NewComponentInstallManager(componentClient componentInterface, helmClient h func (cim *componentInstallManager) Install(ctx context.Context, component *k8sv1.Component) error { logger := log.FromContext(ctx) - err := cim.helmClient.SatisfiesDependencies(ctx, component) + err := cim.helmClient.SatisfiesDependencies(ctx, component.GetHelmChartSpec()) if err != nil { cim.recorder.Eventf(component, corev1.EventTypeWarning, InstallEventReason, "Dependency check failed: %s", err.Error()) return &genericRequeueableError{errMsg: "failed to check dependencies", err: err} diff --git a/pkg/controllers/componentInstallManager_test.go b/pkg/controllers/componentInstallManager_test.go index 9588866..dc61359 100644 --- a/pkg/controllers/componentInstallManager_test.go +++ b/pkg/controllers/componentInstallManager_test.go @@ -2,7 +2,6 @@ package controllers import ( "testing" - "context" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -28,7 +27,7 @@ func Test_componentInstallManager_Install(t *testing.T) { mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(component, nil) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(testCtx, component.GetHelmChartSpec()).Return(nil) sut := componentInstallManager{ @@ -48,7 +47,7 @@ func Test_componentInstallManager_Install(t *testing.T) { mockComponentClient := newMockComponentInterface(t) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(assert.AnError) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(assert.AnError) mockRecorder := newMockEventRecorder(t) mockRecorder.EXPECT().Eventf(component, "Warning", "Installation", "Dependency check failed: %s", assert.AnError.Error()).Return() @@ -74,7 +73,7 @@ func Test_componentInstallManager_Install(t *testing.T) { mockComponentClient.EXPECT().UpdateStatusInstalling(testCtx, component).Return(nil, assert.AnError) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) sut := componentInstallManager{ componentClient: mockComponentClient, @@ -97,7 +96,7 @@ func Test_componentInstallManager_Install(t *testing.T) { mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(nil, assert.AnError) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) sut := componentInstallManager{ componentClient: mockComponentClient, @@ -120,7 +119,7 @@ func Test_componentInstallManager_Install(t *testing.T) { mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(component, nil) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(testCtx, component.GetHelmChartSpec()).Return(assert.AnError) sut := componentInstallManager{ @@ -145,7 +144,7 @@ func Test_componentInstallManager_Install(t *testing.T) { mockComponentClient.EXPECT().AddFinalizer(testCtx, component, "component-finalizer").Return(component, nil) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(testCtx, component.GetHelmChartSpec()).Return(nil) sut := componentInstallManager{ diff --git a/pkg/controllers/componentUpgradeManager.go b/pkg/controllers/componentUpgradeManager.go index 55eecd8..86ff657 100644 --- a/pkg/controllers/componentUpgradeManager.go +++ b/pkg/controllers/componentUpgradeManager.go @@ -32,7 +32,7 @@ func NewComponentUpgradeManager(componentClient componentInterface, helmClient h func (cum *componentUpgradeManager) Upgrade(ctx context.Context, component *k8sv1.Component) error { logger := log.FromContext(ctx) - err := cum.helmClient.SatisfiesDependencies(ctx, component) + err := cum.helmClient.SatisfiesDependencies(ctx, component.GetHelmChartSpec()) if err != nil { cum.recorder.Eventf(component, corev1.EventTypeWarning, UpgradeEventReason, "Dependency check failed: %s", err.Error()) return &genericRequeueableError{errMsg: "failed to check dependencies", err: err} diff --git a/pkg/controllers/componentUpgradeManager_test.go b/pkg/controllers/componentUpgradeManager_test.go index cba31d2..99e2e45 100644 --- a/pkg/controllers/componentUpgradeManager_test.go +++ b/pkg/controllers/componentUpgradeManager_test.go @@ -39,7 +39,7 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { mockComponentClient.EXPECT().UpdateStatusInstalled(ctx, component).Return(component, nil) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(ctx, component.GetHelmChartSpec()).Return(nil) manager := &componentUpgradeManager{ @@ -56,7 +56,7 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { mockComponentClient := newMockComponentInterface(t) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(assert.AnError) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(assert.AnError) mockRecorder := newMockEventRecorder(t) mockRecorder.EXPECT().Eventf(component, "Warning", "Upgrade", "Dependency check failed: %s", assert.AnError.Error()).Return() @@ -91,7 +91,7 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { mockComponentClient.EXPECT().UpdateStatusUpgrading(ctx, component).Return(component, assert.AnError) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) manager := &componentUpgradeManager{ componentClient: mockComponentClient, @@ -118,7 +118,7 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { mockComponentClient.EXPECT().UpdateStatusUpgrading(ctx, component).Return(component, nil) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(ctx, component.GetHelmChartSpec()).Return(assert.AnError) manager := &componentUpgradeManager{ @@ -147,7 +147,7 @@ func Test_componentUpgradeManager_Upgrade(t *testing.T) { mockComponentClient.EXPECT().UpdateStatusInstalled(ctx, component).Return(component, assert.AnError) mockHelmClient := newMockHelmClient(t) - mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component).Return(nil) + mockHelmClient.EXPECT().SatisfiesDependencies(testCtx, component.GetHelmChartSpec()).Return(nil) mockHelmClient.EXPECT().InstallOrUpgrade(ctx, component.GetHelmChartSpec()).Return(nil) manager := &componentUpgradeManager{ diff --git a/pkg/controllers/component_manager.go b/pkg/controllers/component_manager.go index 91f4545..9ca512f 100644 --- a/pkg/controllers/component_manager.go +++ b/pkg/controllers/component_manager.go @@ -3,54 +3,12 @@ package controllers import ( "context" - "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" - helmclient "github.com/cloudogu/go-helm-client" - "helm.sh/helm/v3/pkg/release" - corev1 "k8s.io/api/core/v1" "k8s.io/client-go/tools/record" ) -// InstallManager includes functionality to install components in the cluster. -type InstallManager interface { - // Install installs a component resource. - Install(ctx context.Context, component *k8sv1.Component) error -} - -// DeleteManager includes functionality to delete components in the cluster. -type DeleteManager interface { - // Delete deletes a component resource. - Delete(ctx context.Context, component *k8sv1.Component) error -} - -// UpgradeManager includes functionality to upgrade components in the cluster. -type UpgradeManager interface { - // Upgrade upgrades a component resource. - Upgrade(ctx context.Context, component *k8sv1.Component) error -} - -// HelmClient is an interface for managing components with helm. -type HelmClient interface { - // InstallOrUpgrade takes a helmChart and applies it. - InstallOrUpgrade(ctx context.Context, chart *helmclient.ChartSpec) error - // Uninstall removes the helmRelease for the given name - Uninstall(releaseName string) error - // ListDeployedReleases returns all deployed helm releases - ListDeployedReleases() ([]*release.Release, error) -} - -// ComponentClient embeds the ecosystem.ComponentInterface interface for usage in this package. -type ComponentClient interface { - ecosystem.ComponentInterface -} - -// EventRecorder embeds the record.EventRecorder interface for usage in this package. -type EventRecorder interface { - record.EventRecorder -} - // componentManager is a central unit in the process of handling component custom resources. // The componentManager creates, updates and deletes components. type componentManager struct { diff --git a/pkg/controllers/interfaces.go b/pkg/controllers/interfaces.go index 5578486..244e978 100644 --- a/pkg/controllers/interfaces.go +++ b/pkg/controllers/interfaces.go @@ -4,6 +4,7 @@ import ( "context" "time" + helmclient "github.com/mittwald/go-helm-client" "helm.sh/helm/v3/pkg/release" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" @@ -32,16 +33,16 @@ type upgradeManager interface { // helmClient is an interface for managing components with helm. type helmClient interface { - // InstallOrUpgrade takes a component and applies the corresponding helmChart. - InstallOrUpgrade(ctx context.Context, component *k8sv1.Component) error - // Uninstall removes the helmChart of the given component - Uninstall(component *k8sv1.Component) error + // InstallOrUpgrade takes a helmChart and applies it. + InstallOrUpgrade(ctx context.Context, chart *helmclient.ChartSpec) error + // Uninstall removes the helmRelease for the given name + Uninstall(releaseName string) error // ListDeployedReleases returns all deployed helm releases ListDeployedReleases() ([]*release.Release, error) // SatisfiesDependencies validates that all dependencies are installed in the required version. A nil error // indicates that all dependencies (if any) meet the requirements, so that the client may conduct an installation or // upgrade. - SatisfiesDependencies(ctx context.Context, component *k8sv1.Component) error + SatisfiesDependencies(ctx context.Context, chart *helmclient.ChartSpec) error } // eventRecorder embeds the record.EventRecorder interface for usage in this package. diff --git a/pkg/controllers/mock_HelmClient_test.go b/pkg/controllers/mock_HelmClient_test.go deleted file mode 100644 index e69de29..0000000 diff --git a/pkg/controllers/mock_helmClient_test.go b/pkg/controllers/mock_helmClient_test.go index 5ebcd5e..abd6254 100644 --- a/pkg/controllers/mock_helmClient_test.go +++ b/pkg/controllers/mock_helmClient_test.go @@ -5,10 +5,10 @@ package controllers import ( context "context" + helmclient "github.com/mittwald/go-helm-client" mock "github.com/stretchr/testify/mock" - release "helm.sh/helm/v3/pkg/release" - v1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + release "helm.sh/helm/v3/pkg/release" ) // mockHelmClient is an autogenerated mock type for the helmClient type @@ -24,13 +24,13 @@ func (_m *mockHelmClient) EXPECT() *mockHelmClient_Expecter { return &mockHelmClient_Expecter{mock: &_m.Mock} } -// InstallOrUpgrade provides a mock function with given fields: ctx, component -func (_m *mockHelmClient) InstallOrUpgrade(ctx context.Context, component *v1.Component) error { - ret := _m.Called(ctx, component) +// InstallOrUpgrade provides a mock function with given fields: ctx, chart +func (_m *mockHelmClient) InstallOrUpgrade(ctx context.Context, chart *helmclient.ChartSpec) error { + ret := _m.Called(ctx, chart) var r0 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) error); ok { - r0 = rf(ctx, component) + if rf, ok := ret.Get(0).(func(context.Context, *helmclient.ChartSpec) error); ok { + r0 = rf(ctx, chart) } else { r0 = ret.Error(0) } @@ -45,14 +45,14 @@ type mockHelmClient_InstallOrUpgrade_Call struct { // InstallOrUpgrade is a helper method to define mock.On call // - ctx context.Context -// - component *v1.Component -func (_e *mockHelmClient_Expecter) InstallOrUpgrade(ctx interface{}, component interface{}) *mockHelmClient_InstallOrUpgrade_Call { - return &mockHelmClient_InstallOrUpgrade_Call{Call: _e.mock.On("InstallOrUpgrade", ctx, component)} +// - chart *helmclient.ChartSpec +func (_e *mockHelmClient_Expecter) InstallOrUpgrade(ctx interface{}, chart interface{}) *mockHelmClient_InstallOrUpgrade_Call { + return &mockHelmClient_InstallOrUpgrade_Call{Call: _e.mock.On("InstallOrUpgrade", ctx, chart)} } -func (_c *mockHelmClient_InstallOrUpgrade_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockHelmClient_InstallOrUpgrade_Call { +func (_c *mockHelmClient_InstallOrUpgrade_Call) Run(run func(ctx context.Context, chart *helmclient.ChartSpec)) *mockHelmClient_InstallOrUpgrade_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component)) + run(args[0].(context.Context), args[1].(*helmclient.ChartSpec)) }) return _c } @@ -62,7 +62,7 @@ func (_c *mockHelmClient_InstallOrUpgrade_Call) Return(_a0 error) *mockHelmClien return _c } -func (_c *mockHelmClient_InstallOrUpgrade_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *mockHelmClient_InstallOrUpgrade_Call { +func (_c *mockHelmClient_InstallOrUpgrade_Call) RunAndReturn(run func(context.Context, *helmclient.ChartSpec) error) *mockHelmClient_InstallOrUpgrade_Call { _c.Call.Return(run) return _c } @@ -120,13 +120,13 @@ func (_c *mockHelmClient_ListDeployedReleases_Call) RunAndReturn(run func() ([]* return _c } -// SatisfiesDependencies provides a mock function with given fields: ctx, component -func (_m *mockHelmClient) SatisfiesDependencies(ctx context.Context, component *v1.Component) error { - ret := _m.Called(ctx, component) +// SatisfiesDependencies provides a mock function with given fields: ctx, chart +func (_m *mockHelmClient) SatisfiesDependencies(ctx context.Context, chart *helmclient.ChartSpec) error { + ret := _m.Called(ctx, chart) var r0 error - if rf, ok := ret.Get(0).(func(context.Context, *v1.Component) error); ok { - r0 = rf(ctx, component) + if rf, ok := ret.Get(0).(func(context.Context, *helmclient.ChartSpec) error); ok { + r0 = rf(ctx, chart) } else { r0 = ret.Error(0) } @@ -141,14 +141,14 @@ type mockHelmClient_SatisfiesDependencies_Call struct { // SatisfiesDependencies is a helper method to define mock.On call // - ctx context.Context -// - component *v1.Component -func (_e *mockHelmClient_Expecter) SatisfiesDependencies(ctx interface{}, component interface{}) *mockHelmClient_SatisfiesDependencies_Call { - return &mockHelmClient_SatisfiesDependencies_Call{Call: _e.mock.On("SatisfiesDependencies", ctx, component)} +// - chart *helmclient.ChartSpec +func (_e *mockHelmClient_Expecter) SatisfiesDependencies(ctx interface{}, chart interface{}) *mockHelmClient_SatisfiesDependencies_Call { + return &mockHelmClient_SatisfiesDependencies_Call{Call: _e.mock.On("SatisfiesDependencies", ctx, chart)} } -func (_c *mockHelmClient_SatisfiesDependencies_Call) Run(run func(ctx context.Context, component *v1.Component)) *mockHelmClient_SatisfiesDependencies_Call { +func (_c *mockHelmClient_SatisfiesDependencies_Call) Run(run func(ctx context.Context, chart *helmclient.ChartSpec)) *mockHelmClient_SatisfiesDependencies_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*v1.Component)) + run(args[0].(context.Context), args[1].(*helmclient.ChartSpec)) }) return _c } @@ -158,18 +158,18 @@ func (_c *mockHelmClient_SatisfiesDependencies_Call) Return(_a0 error) *mockHelm return _c } -func (_c *mockHelmClient_SatisfiesDependencies_Call) RunAndReturn(run func(context.Context, *v1.Component) error) *mockHelmClient_SatisfiesDependencies_Call { +func (_c *mockHelmClient_SatisfiesDependencies_Call) RunAndReturn(run func(context.Context, *helmclient.ChartSpec) error) *mockHelmClient_SatisfiesDependencies_Call { _c.Call.Return(run) return _c } -// Uninstall provides a mock function with given fields: component -func (_m *mockHelmClient) Uninstall(component *v1.Component) error { - ret := _m.Called(component) +// Uninstall provides a mock function with given fields: releaseName +func (_m *mockHelmClient) Uninstall(releaseName string) error { + ret := _m.Called(releaseName) var r0 error - if rf, ok := ret.Get(0).(func(*v1.Component) error); ok { - r0 = rf(component) + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(releaseName) } else { r0 = ret.Error(0) } @@ -183,14 +183,14 @@ type mockHelmClient_Uninstall_Call struct { } // Uninstall is a helper method to define mock.On call -// - component *v1.Component -func (_e *mockHelmClient_Expecter) Uninstall(component interface{}) *mockHelmClient_Uninstall_Call { - return &mockHelmClient_Uninstall_Call{Call: _e.mock.On("Uninstall", component)} +// - releaseName string +func (_e *mockHelmClient_Expecter) Uninstall(releaseName interface{}) *mockHelmClient_Uninstall_Call { + return &mockHelmClient_Uninstall_Call{Call: _e.mock.On("Uninstall", releaseName)} } -func (_c *mockHelmClient_Uninstall_Call) Run(run func(component *v1.Component)) *mockHelmClient_Uninstall_Call { +func (_c *mockHelmClient_Uninstall_Call) Run(run func(releaseName string)) *mockHelmClient_Uninstall_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*v1.Component)) + run(args[0].(string)) }) return _c } @@ -200,7 +200,7 @@ func (_c *mockHelmClient_Uninstall_Call) Return(_a0 error) *mockHelmClient_Unins return _c } -func (_c *mockHelmClient_Uninstall_Call) RunAndReturn(run func(*v1.Component) error) *mockHelmClient_Uninstall_Call { +func (_c *mockHelmClient_Uninstall_Call) RunAndReturn(run func(string) error) *mockHelmClient_Uninstall_Call { _c.Call.Return(run) return _c } diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 4009e68..0e06c27 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -5,16 +5,13 @@ import ( "fmt" "strings" - k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" - "github.com/cloudogu/k8s-component-operator/pkg/config" - helmclient "github.com/mittwald/go-helm-client" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/registry" "helm.sh/helm/v3/pkg/release" - ctrl "sigs.k8s.io/controller-runtime" "k8s.io/client-go/rest" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -29,21 +26,22 @@ type HelmClient interface { helmclient.Client } -// OciRepositoryConfig can get an OCI-Endpoint for a helm-repository. -type OciRepositoryConfig interface { +// ociRepositoryConfig can get an OCI-Endpoint for a helm-repository. +type ociRepositoryConfig interface { GetOciEndpoint() (string, error) + IsPlainHttp() bool } // Client wraps the HelmClient with config.HelmRepositoryData type Client struct { helmClient HelmClient - helmRepoData OciRepositoryConfig + helmRepoData ociRepositoryConfig actionConfig *action.Configuration dependencyChecker dependencyChecker } // NewClient create a new instance of the helm client. -func NewClient(namespace string, helmRepoData OciRepositoryConfig, debug bool, debugLog action.DebugLog) (*Client, error) { +func NewClient(namespace string, helmRepoData ociRepositoryConfig, debug bool, debugLog action.DebugLog) (*Client, error) { opt := &helmclient.RestConfClientOptions{ Options: &helmclient.Options{ Namespace: namespace, @@ -53,7 +51,7 @@ func NewClient(namespace string, helmRepoData OciRepositoryConfig, debug bool, d Debug: debug, DebugLog: debugLog, Linting: true, - PlainHttp: helmRepoData.PlainHttp, + PlainHttp: helmRepoData.IsPlainHttp(), }, RestConfig: ctrl.GetConfigOrDie(), } @@ -63,7 +61,7 @@ func NewClient(namespace string, helmRepoData OciRepositoryConfig, debug bool, d return nil, fmt.Errorf("failed to create helm client: %w", err) } - actionConfig, err := createActionConfig(namespace, helmRepoData.PlainHttp, debug, debugLog, opt.RestConfig) + actionConfig, err := createActionConfig(namespace, helmRepoData.IsPlainHttp(), debug, debugLog, opt.RestConfig) if err != nil { return nil, fmt.Errorf("failed to create helm client: %w", err) } @@ -110,7 +108,7 @@ func createActionConfig(namespace string, plainHttp bool, debug bool, debugLog a // InstallOrUpgrade takes a helmChart and applies it. func (c *Client) InstallOrUpgrade(ctx context.Context, chart *helmclient.ChartSpec) error { // This helm-client currently only works with OCI-Helm-Repositories. - // Therefore the chartName has to include the FQDN of the repository (e.g. "oci://my.repo/...") + // Therefore, the chartName has to include the FQDN of the repository (e.g. "oci://my.repo/...") // If in the future non-oci-repositories need to be used, this should be done here... err := c.patchOciEndpoint(chart) if err != nil { @@ -126,20 +124,18 @@ func (c *Client) InstallOrUpgrade(ctx context.Context, chart *helmclient.ChartSp } // SatisfiesDependencies checks if all dependencies are satisfied in terms of installation and version. -func (c *Client) SatisfiesDependencies(ctx context.Context, component *k8sv1.Component) error { +func (c *Client) SatisfiesDependencies(ctx context.Context, chart *helmclient.ChartSpec) error { logger := log.FromContext(ctx) - logger.Info("Checking if components dependencies are satisfied", "component", component.Name) + logger.Info("Checking if components dependencies are satisfied", "component", chart.ChartName) - endpoint, err := c.getOciEndpoint(component) + err := c.patchOciEndpoint(chart) if err != nil { - return err + return fmt.Errorf("error while patching chart '%s': %w", chart.ChartName, err) } - chartSpec := component.GetHelmChartSpec(endpoint) - - componentChart, err := c.getChart(ctx, component, chartSpec) + componentChart, err := c.getChart(ctx, chart) if err != nil { - return fmt.Errorf("failed to get chart for component %s: %w", component, err) + return fmt.Errorf("failed to get chart %s: %w", chart.ChartName, err) } dependencies := componentChart.Metadata.Dependencies @@ -156,28 +152,32 @@ func (c *Client) SatisfiesDependencies(ctx context.Context, component *k8sv1.Com return nil } -func (c *Client) getChart(ctx context.Context, component *k8sv1.Component, spec *helmclient.ChartSpec) (*chart.Chart, error) { +func (c *Client) getChart(ctx context.Context, chartSpec *helmclient.ChartSpec) (*chart.Chart, error) { logger := log.FromContext(ctx) - // TODO extract into helper method - // We need this installAction because it sets the registryClient in ChartPathOptions which is a private field. - install := action.NewInstall(c.actionConfig) - install.Version = component.Spec.Version - install.PlainHTTP = c.helmRepoData.PlainHttp - logger.Info("Trying to get chart with options", - "chart", spec.ChartName, - "version", component.Spec.Version, - "plain http", c.helmRepoData.PlainHttp) + "chart", chartSpec.ChartName, + "version", chartSpec.Version, + "plain http", c.helmRepoData.IsPlainHttp()) - componentChart, _, err := c.helmClient.GetChart(spec.ChartName, &install.ChartPathOptions) + pathOptions := createChartPathOptions(c.actionConfig, chartSpec, c.helmRepoData.IsPlainHttp()) + componentChart, _, err := c.helmClient.GetChart(chartSpec.ChartName, pathOptions) if err != nil { - return nil, fmt.Errorf("error while getting chart for %s:%s: %w", component.Spec.Name, component.Spec.Version, err) + return nil, fmt.Errorf("error while getting chart for %s:%s: %w", chartSpec.ChartName, chartSpec.Version, err) } return componentChart, nil } +func createChartPathOptions(config *action.Configuration, chartSpec *helmclient.ChartSpec, plainHttp bool) *action.ChartPathOptions { + // We need this installAction because it sets the registryClient in ChartPathOptions which is a private field. + install := action.NewInstall(config) + install.Version = chartSpec.Version + install.PlainHTTP = plainHttp + + return &install.ChartPathOptions +} + // Uninstall removes the helmRelease for the given name func (c *Client) Uninstall(releaseName string) error { if err := c.helmClient.UninstallReleaseByName(releaseName); err != nil { diff --git a/pkg/helm/client_test.go b/pkg/helm/client_test.go index b07efc1..e9ab24a 100644 --- a/pkg/helm/client_test.go +++ b/pkg/helm/client_test.go @@ -5,15 +5,14 @@ import ( "errors" "testing" - k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" "github.com/cloudogu/k8s-component-operator/pkg/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + helmclient "github.com/mittwald/go-helm-client" "helm.sh/helm/v3/pkg/release" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" ) diff --git a/pkg/helm/mock_OciRepositoryConfig_test.go b/pkg/helm/mock_OciRepositoryConfig_test.go deleted file mode 100644 index d0cd3ba..0000000 --- a/pkg/helm/mock_OciRepositoryConfig_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package helm - -import mock "github.com/stretchr/testify/mock" - -// MockOciRepositoryConfig is an autogenerated mock type for the OciRepositoryConfig type -type MockOciRepositoryConfig struct { - mock.Mock -} - -type MockOciRepositoryConfig_Expecter struct { - mock *mock.Mock -} - -func (_m *MockOciRepositoryConfig) EXPECT() *MockOciRepositoryConfig_Expecter { - return &MockOciRepositoryConfig_Expecter{mock: &_m.Mock} -} - -// GetOciEndpoint provides a mock function with given fields: -func (_m *MockOciRepositoryConfig) GetOciEndpoint() (string, error) { - ret := _m.Called() - - var r0 string - var r1 error - if rf, ok := ret.Get(0).(func() (string, error)); ok { - return rf() - } - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockOciRepositoryConfig_GetOciEndpoint_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOciEndpoint' -type MockOciRepositoryConfig_GetOciEndpoint_Call struct { - *mock.Call -} - -// GetOciEndpoint is a helper method to define mock.On call -func (_e *MockOciRepositoryConfig_Expecter) GetOciEndpoint() *MockOciRepositoryConfig_GetOciEndpoint_Call { - return &MockOciRepositoryConfig_GetOciEndpoint_Call{Call: _e.mock.On("GetOciEndpoint")} -} - -func (_c *MockOciRepositoryConfig_GetOciEndpoint_Call) Run(run func()) *MockOciRepositoryConfig_GetOciEndpoint_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *MockOciRepositoryConfig_GetOciEndpoint_Call) Return(_a0 string, _a1 error) *MockOciRepositoryConfig_GetOciEndpoint_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockOciRepositoryConfig_GetOciEndpoint_Call) RunAndReturn(run func() (string, error)) *MockOciRepositoryConfig_GetOciEndpoint_Call { - _c.Call.Return(run) - return _c -} - -type mockConstructorTestingTNewMockOciRepositoryConfig interface { - mock.TestingT - Cleanup(func()) -} - -// NewMockOciRepositoryConfig creates a new instance of MockOciRepositoryConfig. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockOciRepositoryConfig(t mockConstructorTestingTNewMockOciRepositoryConfig) *MockOciRepositoryConfig { - mock := &MockOciRepositoryConfig{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From 2077817cd27fe0824b92205c6cd825ebdb8c5df2 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 15:44:22 +0200 Subject: [PATCH 26/47] #15 correct copy-paste error in error message --- pkg/helm/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 0e06c27..2109483 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -63,7 +63,7 @@ func NewClient(namespace string, helmRepoData ociRepositoryConfig, debug bool, d actionConfig, err := createActionConfig(namespace, helmRepoData.IsPlainHttp(), debug, debugLog, opt.RestConfig) if err != nil { - return nil, fmt.Errorf("failed to create helm client: %w", err) + return nil, fmt.Errorf("failed to create action config: %w", err) } return &Client{ From 1427805888b97acb4516e68367ba319613167a66 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 17:17:22 +0200 Subject: [PATCH 27/47] #15 test dependency check of helm client --- pkg/helm/client_test.go | 206 ++++++++++++++++++++-- pkg/helm/mock_dependencyChecker_test.go | 81 +++++++++ pkg/helm/mock_ociRepositoryConfig_test.go | 125 +++++++++++++ 3 files changed, 397 insertions(+), 15 deletions(-) create mode 100644 pkg/helm/mock_dependencyChecker_test.go create mode 100644 pkg/helm/mock_ociRepositoryConfig_test.go diff --git a/pkg/helm/client_test.go b/pkg/helm/client_test.go index e9ab24a..4364a06 100644 --- a/pkg/helm/client_test.go +++ b/pkg/helm/client_test.go @@ -12,11 +12,15 @@ import ( "github.com/stretchr/testify/require" helmclient "github.com/mittwald/go-helm-client" + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/release" "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" ) +var testCtx = context.TODO() + func TestNew(t *testing.T) { t.Run("should create new client", func(t *testing.T) { namespace := "ecosystem" @@ -37,49 +41,45 @@ func TestNew(t *testing.T) { func TestClient_InstallOrUpgrade(t *testing.T) { t.Run("should install or upgrade chart", func(t *testing.T) { - chart := &helmclient.ChartSpec{ + chartSpec := &helmclient.ChartSpec{ ReleaseName: "testComponent", ChartName: "testing/testComponent", Namespace: "testNS", Version: "0.1.1", } - ctx := context.TODO() - helmRepoData := &config.HelmRepositoryData{Endpoint: "https://staging.cloudogu.com"} mockHelmClient := NewMockHelmClient(t) - mockHelmClient.EXPECT().InstallOrUpgradeChart(ctx, chart, mock.Anything).Return(nil, nil) + mockHelmClient.EXPECT().InstallOrUpgradeChart(testCtx, chartSpec, mock.Anything).Return(nil, nil) client := &Client{helmClient: mockHelmClient, helmRepoData: helmRepoData} - err := client.InstallOrUpgrade(ctx, chart) + err := client.InstallOrUpgrade(testCtx, chartSpec) require.NoError(t, err) }) t.Run("should install or upgrade chart with oci-endpoint in chart-name", func(t *testing.T) { - chart := &helmclient.ChartSpec{ + chartSpec := &helmclient.ChartSpec{ ReleaseName: "testComponent", ChartName: "oci://some.where/testing/testComponent", Namespace: "testNS", Version: "0.1.1", } - ctx := context.TODO() - helmRepoData := &config.HelmRepositoryData{Endpoint: "https://staging.cloudogu.com"} mockHelmClient := NewMockHelmClient(t) - mockHelmClient.EXPECT().InstallOrUpgradeChart(ctx, chart, mock.Anything).Return(nil, nil) + mockHelmClient.EXPECT().InstallOrUpgradeChart(testCtx, chartSpec, mock.Anything).Return(nil, nil) client := &Client{helmClient: mockHelmClient, helmRepoData: helmRepoData} - err := client.InstallOrUpgrade(ctx, chart) + err := client.InstallOrUpgrade(testCtx, chartSpec) require.NoError(t, err) }) t.Run("should fail to install or upgrade chart for error in helmRepoData", func(t *testing.T) { - chart := &helmclient.ChartSpec{ + chartSpec := &helmclient.ChartSpec{ ReleaseName: "testComponent", ChartName: "testing/testComponent", Namespace: "testNS", @@ -92,14 +92,14 @@ func TestClient_InstallOrUpgrade(t *testing.T) { client := &Client{helmClient: mockHelmClient, helmRepoData: helmRepoData} - err := client.InstallOrUpgrade(ctx, chart) + err := client.InstallOrUpgrade(ctx, chartSpec) require.Error(t, err) assert.ErrorContains(t, err, "error while patching chart 'testing/testComponent': error while getting oci endpoint: error creating oci-endpoint from '': wrong format") }) t.Run("should fail to install or upgrade chart for error in helmClient", func(t *testing.T) { - chart := &helmclient.ChartSpec{ + chartSpec := &helmclient.ChartSpec{ ReleaseName: "testComponent", ChartName: "testing/testComponent", Namespace: "testNS", @@ -109,11 +109,11 @@ func TestClient_InstallOrUpgrade(t *testing.T) { helmRepoData := &config.HelmRepositoryData{Endpoint: "https://staging.cloudogu.com"} mockHelmClient := NewMockHelmClient(t) - mockHelmClient.EXPECT().InstallOrUpgradeChart(ctx, chart, mock.Anything).Return(nil, assert.AnError) + mockHelmClient.EXPECT().InstallOrUpgradeChart(ctx, chartSpec, mock.Anything).Return(nil, assert.AnError) client := &Client{helmClient: mockHelmClient, helmRepoData: helmRepoData} - err := client.InstallOrUpgrade(ctx, chart) + err := client.InstallOrUpgrade(ctx, chartSpec) require.Error(t, err) assert.ErrorIs(t, err, assert.AnError) @@ -204,3 +204,179 @@ func Test_dependencyUnsatisfiedError_Error(t *testing.T) { expected := "one or more dependencies are not satisfied: assert.AnError general error for testing" assert.Equal(t, expected, sut.Error()) } + +func TestClient_SatisfiesDependencies(t *testing.T) { + t.Run("should fail to get oci endpoint", func(t *testing.T) { + // given + mockRepoConfig := newMockOciRepositoryConfig(t) + mockRepoConfig.EXPECT().GetOciEndpoint().Return("", assert.AnError) + chartSpec := &helmclient.ChartSpec{ + ReleaseName: "testComponent", + ChartName: "testComponent", + Namespace: "testNS", + Version: "0.1.1", + } + sut := &Client{ + helmRepoData: mockRepoConfig, + } + + // when + err := sut.SatisfiesDependencies(testCtx, chartSpec) + + // then + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + assert.ErrorContains(t, err, "error while patching chart 'testComponent': error while getting oci endpoint") + }) + + t.Run("should fail to get chart", func(t *testing.T) { + // given + mockRepoConfig := newMockOciRepositoryConfig(t) + mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) + mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + + mockHelmClient := NewMockHelmClient(t) + mockHelmClient.EXPECT().GetChart("oci://some.where/testing/testComponent", mock.Anything).Return(nil, "", assert.AnError) + + chartSpec := &helmclient.ChartSpec{ + ReleaseName: "testComponent", + ChartName: "testComponent", + Namespace: "testNS", + Version: "0.1.1", + } + + sut := &Client{ + helmClient: mockHelmClient, + helmRepoData: mockRepoConfig, + actionConfig: new(action.Configuration), + } + + // when + err := sut.SatisfiesDependencies(testCtx, chartSpec) + + // then + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + assert.ErrorContains(t, err, "failed to get chart oci://some.where/testing/testComponent: error while getting chart for oci://some.where/testing/testComponent:0.1.1") + }) + + t.Run("should fail to list deployed releases", func(t *testing.T) { + // given + mockRepoConfig := newMockOciRepositoryConfig(t) + mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) + mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + + helmChart := &chart.Chart{Metadata: &chart.Metadata{ + Dependencies: []*chart.Dependency{{ + Name: "k8s-etcd", + Version: "3.*.*", + }}, + }} + mockHelmClient := NewMockHelmClient(t) + mockHelmClient.EXPECT().GetChart("oci://some.where/testing/testComponent", mock.Anything).Return(helmChart, "myPath", nil) + mockHelmClient.EXPECT().ListDeployedReleases().Return(nil, assert.AnError) + + chartSpec := &helmclient.ChartSpec{ + ReleaseName: "testComponent", + ChartName: "testComponent", + Namespace: "testNS", + Version: "0.1.1", + } + + sut := &Client{ + helmClient: mockHelmClient, + helmRepoData: mockRepoConfig, + actionConfig: new(action.Configuration), + } + + // when + err := sut.SatisfiesDependencies(testCtx, chartSpec) + + // then + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + assert.ErrorContains(t, err, "failed to list deployed releases") + }) + + t.Run("should return unsatisfied error", func(t *testing.T) { + // given + mockRepoConfig := newMockOciRepositoryConfig(t) + mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) + mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + + dependencies := []*chart.Dependency{createDependency("k8s-etcd", "3.2.1")} + helmChart := &chart.Chart{Metadata: &chart.Metadata{ + Dependencies: dependencies, + }} + mockHelmClient := NewMockHelmClient(t) + mockHelmClient.EXPECT().GetChart("oci://some.where/testing/testComponent", mock.Anything).Return(helmChart, "myPath", nil) + var deployedReleases []*release.Release + mockHelmClient.EXPECT().ListDeployedReleases().Return(deployedReleases, nil) + + mockDepChecker := newMockDependencyChecker(t) + mockDepChecker.EXPECT().CheckSatisfied(dependencies, deployedReleases).Return(assert.AnError) + + chartSpec := &helmclient.ChartSpec{ + ReleaseName: "testComponent", + ChartName: "testComponent", + Namespace: "testNS", + Version: "0.1.1", + } + + sut := &Client{ + helmClient: mockHelmClient, + helmRepoData: mockRepoConfig, + actionConfig: new(action.Configuration), + dependencyChecker: mockDepChecker, + } + + // when + err := sut.SatisfiesDependencies(testCtx, chartSpec) + + // then + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + targetErr := &dependencyUnsatisfiedError{} + assert.ErrorAs(t, err, &targetErr) + assert.ErrorContains(t, err, "one or more dependencies are not satisfied") + }) + + t.Run("should succeed", func(t *testing.T) { + // given + mockRepoConfig := newMockOciRepositoryConfig(t) + mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) + mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + + dependencies := []*chart.Dependency{createDependency("k8s-etcd", "3.2.1")} + helmChart := &chart.Chart{Metadata: &chart.Metadata{ + Dependencies: dependencies, + }} + mockHelmClient := NewMockHelmClient(t) + mockHelmClient.EXPECT().GetChart("oci://some.where/testing/testComponent", mock.Anything).Return(helmChart, "myPath", nil) + deployedReleases := []*release.Release{createRelease("k8s-etcd", "3.2.1")} + mockHelmClient.EXPECT().ListDeployedReleases().Return(deployedReleases, nil) + + mockDepChecker := newMockDependencyChecker(t) + mockDepChecker.EXPECT().CheckSatisfied(dependencies, deployedReleases).Return(nil) + + chartSpec := &helmclient.ChartSpec{ + ReleaseName: "testComponent", + ChartName: "testComponent", + Namespace: "testNS", + Version: "0.1.1", + } + + sut := &Client{ + helmClient: mockHelmClient, + helmRepoData: mockRepoConfig, + actionConfig: new(action.Configuration), + dependencyChecker: mockDepChecker, + } + + // when + err := sut.SatisfiesDependencies(testCtx, chartSpec) + + // then + require.NoError(t, err) + }) +} diff --git a/pkg/helm/mock_dependencyChecker_test.go b/pkg/helm/mock_dependencyChecker_test.go new file mode 100644 index 0000000..8bc1cc1 --- /dev/null +++ b/pkg/helm/mock_dependencyChecker_test.go @@ -0,0 +1,81 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package helm + +import ( + mock "github.com/stretchr/testify/mock" + chart "helm.sh/helm/v3/pkg/chart" + + release "helm.sh/helm/v3/pkg/release" +) + +// mockDependencyChecker is an autogenerated mock type for the dependencyChecker type +type mockDependencyChecker struct { + mock.Mock +} + +type mockDependencyChecker_Expecter struct { + mock *mock.Mock +} + +func (_m *mockDependencyChecker) EXPECT() *mockDependencyChecker_Expecter { + return &mockDependencyChecker_Expecter{mock: &_m.Mock} +} + +// CheckSatisfied provides a mock function with given fields: dependencies, deployedReleases +func (_m *mockDependencyChecker) CheckSatisfied(dependencies []*chart.Dependency, deployedReleases []*release.Release) error { + ret := _m.Called(dependencies, deployedReleases) + + var r0 error + if rf, ok := ret.Get(0).(func([]*chart.Dependency, []*release.Release) error); ok { + r0 = rf(dependencies, deployedReleases) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockDependencyChecker_CheckSatisfied_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CheckSatisfied' +type mockDependencyChecker_CheckSatisfied_Call struct { + *mock.Call +} + +// CheckSatisfied is a helper method to define mock.On call +// - dependencies []*chart.Dependency +// - deployedReleases []*release.Release +func (_e *mockDependencyChecker_Expecter) CheckSatisfied(dependencies interface{}, deployedReleases interface{}) *mockDependencyChecker_CheckSatisfied_Call { + return &mockDependencyChecker_CheckSatisfied_Call{Call: _e.mock.On("CheckSatisfied", dependencies, deployedReleases)} +} + +func (_c *mockDependencyChecker_CheckSatisfied_Call) Run(run func(dependencies []*chart.Dependency, deployedReleases []*release.Release)) *mockDependencyChecker_CheckSatisfied_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]*chart.Dependency), args[1].([]*release.Release)) + }) + return _c +} + +func (_c *mockDependencyChecker_CheckSatisfied_Call) Return(_a0 error) *mockDependencyChecker_CheckSatisfied_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockDependencyChecker_CheckSatisfied_Call) RunAndReturn(run func([]*chart.Dependency, []*release.Release) error) *mockDependencyChecker_CheckSatisfied_Call { + _c.Call.Return(run) + return _c +} + +type mockConstructorTestingTnewMockDependencyChecker interface { + mock.TestingT + Cleanup(func()) +} + +// newMockDependencyChecker creates a new instance of mockDependencyChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockDependencyChecker(t mockConstructorTestingTnewMockDependencyChecker) *mockDependencyChecker { + mock := &mockDependencyChecker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/pkg/helm/mock_ociRepositoryConfig_test.go b/pkg/helm/mock_ociRepositoryConfig_test.go new file mode 100644 index 0000000..95e4c8a --- /dev/null +++ b/pkg/helm/mock_ociRepositoryConfig_test.go @@ -0,0 +1,125 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package helm + +import mock "github.com/stretchr/testify/mock" + +// mockOciRepositoryConfig is an autogenerated mock type for the ociRepositoryConfig type +type mockOciRepositoryConfig struct { + mock.Mock +} + +type mockOciRepositoryConfig_Expecter struct { + mock *mock.Mock +} + +func (_m *mockOciRepositoryConfig) EXPECT() *mockOciRepositoryConfig_Expecter { + return &mockOciRepositoryConfig_Expecter{mock: &_m.Mock} +} + +// GetOciEndpoint provides a mock function with given fields: +func (_m *mockOciRepositoryConfig) GetOciEndpoint() (string, error) { + ret := _m.Called() + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func() (string, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockOciRepositoryConfig_GetOciEndpoint_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOciEndpoint' +type mockOciRepositoryConfig_GetOciEndpoint_Call struct { + *mock.Call +} + +// GetOciEndpoint is a helper method to define mock.On call +func (_e *mockOciRepositoryConfig_Expecter) GetOciEndpoint() *mockOciRepositoryConfig_GetOciEndpoint_Call { + return &mockOciRepositoryConfig_GetOciEndpoint_Call{Call: _e.mock.On("GetOciEndpoint")} +} + +func (_c *mockOciRepositoryConfig_GetOciEndpoint_Call) Run(run func()) *mockOciRepositoryConfig_GetOciEndpoint_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockOciRepositoryConfig_GetOciEndpoint_Call) Return(_a0 string, _a1 error) *mockOciRepositoryConfig_GetOciEndpoint_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockOciRepositoryConfig_GetOciEndpoint_Call) RunAndReturn(run func() (string, error)) *mockOciRepositoryConfig_GetOciEndpoint_Call { + _c.Call.Return(run) + return _c +} + +// IsPlainHttp provides a mock function with given fields: +func (_m *mockOciRepositoryConfig) IsPlainHttp() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// mockOciRepositoryConfig_IsPlainHttp_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsPlainHttp' +type mockOciRepositoryConfig_IsPlainHttp_Call struct { + *mock.Call +} + +// IsPlainHttp is a helper method to define mock.On call +func (_e *mockOciRepositoryConfig_Expecter) IsPlainHttp() *mockOciRepositoryConfig_IsPlainHttp_Call { + return &mockOciRepositoryConfig_IsPlainHttp_Call{Call: _e.mock.On("IsPlainHttp")} +} + +func (_c *mockOciRepositoryConfig_IsPlainHttp_Call) Run(run func()) *mockOciRepositoryConfig_IsPlainHttp_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *mockOciRepositoryConfig_IsPlainHttp_Call) Return(_a0 bool) *mockOciRepositoryConfig_IsPlainHttp_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockOciRepositoryConfig_IsPlainHttp_Call) RunAndReturn(run func() bool) *mockOciRepositoryConfig_IsPlainHttp_Call { + _c.Call.Return(run) + return _c +} + +type mockConstructorTestingTnewMockOciRepositoryConfig interface { + mock.TestingT + Cleanup(func()) +} + +// newMockOciRepositoryConfig creates a new instance of mockOciRepositoryConfig. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockOciRepositoryConfig(t mockConstructorTestingTnewMockOciRepositoryConfig) *mockOciRepositoryConfig { + mock := &mockOciRepositoryConfig{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} From c4f31d80ebb28d6e78d04c5f0a634b66c1479ddd Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Tue, 22 Aug 2023 17:40:28 +0200 Subject: [PATCH 28/47] #15 fix compile errors of integration test --- pkg/controllers/componentController_int_test.go | 12 ++++++------ pkg/controllers/suite_int_test.go | 11 +++++------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/pkg/controllers/componentController_int_test.go b/pkg/controllers/componentController_int_test.go index 56bc53f..1bcce07 100644 --- a/pkg/controllers/componentController_int_test.go +++ b/pkg/controllers/componentController_int_test.go @@ -47,9 +47,9 @@ var _ = Describe("Dogu Upgrade Tests", func() { It("Should install component in cluster", func() { By("Creating component resource") - *helmClientMock = MockHelmClient{} + *helmClientMock = mockHelmClient{} helmClientMock.EXPECT().InstallOrUpgrade(mock.Anything, mock.Anything).Return(nil) - *recorderMock = MockEventRecorder{} + *recorderMock = mockEventRecorder{} recorderMock.EXPECT().Event(mock.Anything, "Normal", "Installation", "Starting installation...") recorderMock.EXPECT().Event(mock.Anything, "Normal", "Installation", "Installation successful") @@ -77,10 +77,10 @@ var _ = Describe("Dogu Upgrade Tests", func() { It("Should upgrade component in cluster", func() { By("Updating component resource") - *helmClientMock = MockHelmClient{} + *helmClientMock = mockHelmClient{} helmClientMock.EXPECT().ListDeployedReleases().Return([]*release.Release{{Name: installComponent.Spec.Name, Namespace: installComponent.Namespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.1.0"}}}}, nil) helmClientMock.EXPECT().InstallOrUpgrade(mock.Anything, mock.Anything).Return(nil) - *recorderMock = MockEventRecorder{} + *recorderMock = mockEventRecorder{} recorderMock.EXPECT().Event(mock.Anything, "Normal", "Upgrade", "Starting upgrade...") recorderMock.EXPECT().Event(mock.Anything, "Normal", "Upgrade", "Upgrade successful") @@ -119,12 +119,12 @@ var _ = Describe("Dogu Upgrade Tests", func() { It("Should delete component in cluster", func() { By("Delete component resource") - *helmClientMock = MockHelmClient{} + *helmClientMock = mockHelmClient{} helmClientMock.EXPECT().Uninstall(mock.Anything).Return(nil) helmClientMock.EXPECT().ListDeployedReleases().Return([]*release.Release{{ Name: "k8s-dogu-operator", }}, nil) - *recorderMock = MockEventRecorder{} + *recorderMock = mockEventRecorder{} recorderMock.EXPECT().Event(mock.Anything, "Normal", "Deinstallation", "Starting deinstallation...") recorderMock.EXPECT().Event(mock.Anything, "Normal", "Deinstallation", "Deinstallation successful") diff --git a/pkg/controllers/suite_int_test.go b/pkg/controllers/suite_int_test.go index e812737..e0f54e9 100644 --- a/pkg/controllers/suite_int_test.go +++ b/pkg/controllers/suite_int_test.go @@ -34,8 +34,8 @@ var cancel context.CancelFunc // Used in other integration tests var ( componentClient ecosystem.ComponentInterface - helmClientMock *MockHelmClient - recorderMock *MockEventRecorder + helmClientMock *mockHelmClient + recorderMock *mockEventRecorder namespace = "default" ) @@ -94,8 +94,8 @@ var _ = ginkgo.BeforeSuite(func() { }) gomega.Expect(err).ToNot(gomega.HaveOccurred()) t := &testing.T{} - helmClientMock = NewMockHelmClient(t) - recorderMock = NewMockEventRecorder(t) + helmClientMock = newMockHelmClient(t) + recorderMock = newMockEventRecorder(t) clientSet, err := kubernetes.NewForConfig(cfg) gomega.Expect(err).ToNot(gomega.HaveOccurred()) @@ -103,8 +103,7 @@ var _ = ginkgo.BeforeSuite(func() { componentClientSet, err := ecosystem.NewComponentClientset(k8sManager.GetConfig(), clientSet) gomega.Expect(err).ToNot(gomega.HaveOccurred()) - componentClient = componentClientSet.EcosystemV1Alpha1().Components(namespace) - reconciler := NewComponentReconciler(componentClient, helmClientMock, recorderMock) + reconciler := NewComponentReconciler(componentClientSet, helmClientMock, recorderMock, namespace) err = reconciler.SetupWithManager(k8sManager) gomega.Expect(err).ToNot(gomega.HaveOccurred()) From 4c89ee9189305a8d30669558ded640ebeca4c15e Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Wed, 23 Aug 2023 09:26:39 +0200 Subject: [PATCH 29/47] #15 fix integration tests --- pkg/controllers/componentController_int_test.go | 16 +++++++++------- pkg/controllers/suite_int_test.go | 10 +++++----- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/pkg/controllers/componentController_int_test.go b/pkg/controllers/componentController_int_test.go index 1bcce07..f3c80a9 100644 --- a/pkg/controllers/componentController_int_test.go +++ b/pkg/controllers/componentController_int_test.go @@ -48,17 +48,18 @@ var _ = Describe("Dogu Upgrade Tests", func() { It("Should install component in cluster", func() { By("Creating component resource") *helmClientMock = mockHelmClient{} + helmClientMock.EXPECT().SatisfiesDependencies(mock.Anything, mock.Anything).Return(nil) helmClientMock.EXPECT().InstallOrUpgrade(mock.Anything, mock.Anything).Return(nil) *recorderMock = mockEventRecorder{} recorderMock.EXPECT().Event(mock.Anything, "Normal", "Installation", "Starting installation...") recorderMock.EXPECT().Event(mock.Anything, "Normal", "Installation", "Installation successful") - _, err := componentClient.Create(ctx, installComponent, metav1.CreateOptions{}) + _, err := componentClientSet.ComponentV1Alpha1().Components(namespace).Create(ctx, installComponent, metav1.CreateOptions{}) Expect(err).Should(Succeed()) By("Expect created component") Eventually(func() bool { - get, err := componentClient.Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) + get, err := componentClientSet.ComponentV1Alpha1().Components(namespace).Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) if err != nil { return false } @@ -78,20 +79,21 @@ var _ = Describe("Dogu Upgrade Tests", func() { It("Should upgrade component in cluster", func() { By("Updating component resource") *helmClientMock = mockHelmClient{} + helmClientMock.EXPECT().SatisfiesDependencies(mock.Anything, mock.Anything).Return(nil) helmClientMock.EXPECT().ListDeployedReleases().Return([]*release.Release{{Name: installComponent.Spec.Name, Namespace: installComponent.Namespace, Chart: &chart.Chart{Metadata: &chart.Metadata{AppVersion: "0.1.0"}}}}, nil) helmClientMock.EXPECT().InstallOrUpgrade(mock.Anything, mock.Anything).Return(nil) *recorderMock = mockEventRecorder{} recorderMock.EXPECT().Event(mock.Anything, "Normal", "Upgrade", "Starting upgrade...") recorderMock.EXPECT().Event(mock.Anything, "Normal", "Upgrade", "Upgrade successful") - upgradeComponent, err := componentClient.Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) + upgradeComponent, err := componentClientSet.ComponentV1Alpha1().Components(namespace).Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) Expect(err).Should(Succeed()) upgradeComponent.Spec.Version = "0.2.0" - _, err = componentClient.Update(ctx, upgradeComponent, metav1.UpdateOptions{}) + _, err = componentClientSet.ComponentV1Alpha1().Components(namespace).Update(ctx, upgradeComponent, metav1.UpdateOptions{}) Expect(err).Should(Succeed()) Eventually(func() bool { - comp, err := componentClient.Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) + comp, err := componentClientSet.ComponentV1Alpha1().Components(namespace).Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) if err != nil { return false } @@ -128,11 +130,11 @@ var _ = Describe("Dogu Upgrade Tests", func() { recorderMock.EXPECT().Event(mock.Anything, "Normal", "Deinstallation", "Starting deinstallation...") recorderMock.EXPECT().Event(mock.Anything, "Normal", "Deinstallation", "Deinstallation successful") - err := componentClient.Delete(ctx, "k8s-dogu-operator", metav1.DeleteOptions{}) + err := componentClientSet.ComponentV1Alpha1().Components(namespace).Delete(ctx, "k8s-dogu-operator", metav1.DeleteOptions{}) Expect(err).Should(Succeed()) Eventually(func() bool { - _, err := componentClient.Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) + _, err := componentClientSet.ComponentV1Alpha1().Components(namespace).Get(ctx, "k8s-dogu-operator", metav1.GetOptions{}) return errors.IsNotFound(err) }, TimeoutInterval, PollingInterval).Should(BeTrue()) diff --git a/pkg/controllers/suite_int_test.go b/pkg/controllers/suite_int_test.go index e0f54e9..e808539 100644 --- a/pkg/controllers/suite_int_test.go +++ b/pkg/controllers/suite_int_test.go @@ -33,10 +33,10 @@ var cancel context.CancelFunc // Used in other integration tests var ( - componentClient ecosystem.ComponentInterface - helmClientMock *mockHelmClient - recorderMock *mockEventRecorder - namespace = "default" + componentClientSet ecosystem.ComponentEcosystemInterface + helmClientMock *mockHelmClient + recorderMock *mockEventRecorder + namespace = "default" ) const TimeoutInterval = time.Second * 10 @@ -100,7 +100,7 @@ var _ = ginkgo.BeforeSuite(func() { clientSet, err := kubernetes.NewForConfig(cfg) gomega.Expect(err).ToNot(gomega.HaveOccurred()) - componentClientSet, err := ecosystem.NewComponentClientset(k8sManager.GetConfig(), clientSet) + componentClientSet, err = ecosystem.NewComponentClientset(k8sManager.GetConfig(), clientSet) gomega.Expect(err).ToNot(gomega.HaveOccurred()) reconciler := NewComponentReconciler(componentClientSet, helmClientMock, recorderMock, namespace) From 91372b65aaf741f1735bf214413a405417b22311 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Wed, 23 Aug 2023 15:11:40 +0200 Subject: [PATCH 30/47] #15 Delete obsolete TODO from manager.yaml --- config/manager/manager.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index 78a6fdd..fc6e3b3 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -55,8 +55,6 @@ spec: port: 8081 initialDelaySeconds: 5 periodSeconds: 10 - # TODO(user): Configure the resources accordingly based on the project requirements. - # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ resources: limits: cpu: 500m From 5e8992f8c07f1575d3603b6179a5eb37b8de41b1 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Wed, 23 Aug 2023 16:33:07 +0200 Subject: [PATCH 31/47] #15 Describe operations --- .../development/developing_the_operator_de.md | 32 ++++-- docs/operations/managing_components_de.md | 95 +++++++++------- docs/operations/managing_components_en.md | 106 +++++++++++------- 3 files changed, 145 insertions(+), 88 deletions(-) diff --git a/docs/development/developing_the_operator_de.md b/docs/development/developing_the_operator_de.md index 4817700..437a486 100644 --- a/docs/development/developing_the_operator_de.md +++ b/docs/development/developing_the_operator_de.md @@ -5,9 +5,11 @@ Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten ## Vorbereitungen ### Helm-Repository konfigurieren + - Die Datei `.env` aus dem Template `.env.template` erstellen - - Wichtig sind die Variablen HELM_REPO_ENDPOINT (bspw. https://registry.domain.test), HELM_REPO_USERNAME und HELM_REPO_PASSWORD - - Außerdem sollte NAMESPACE korrekt gesetzt sein + - Wichtig sind die Variablen HELM_REPO_ENDPOINT (bspw. https://registry.domain.test), HELM_REPO_USERNAME und + HELM_REPO_PASSWORD + - Außerdem sollte NAMESPACE korrekt gesetzt sein - Credentials im Cluster ablegen: `make helm-repo-config` ### Den Komponenten-Operator lokal debuggen @@ -26,15 +28,25 @@ Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten - STAGE=production;NAMESPACE=ecosystem;KUBECONFIG=/pfad/zur/kubeconfig/.kube/k3ces.local ### Komponenten-Operator installieren + - Operator bauen und im Cluster installieren: `make k8s-helm-apply` ### Komponente für Test vorbereiten + - Repository der Komponente öffnen, bspw. k8s-etcd - Helm-Chart erstellen: `make k8s-helm-package-release` - - Generiert ein Paket nach dem Schema KOMPONENTENNAME-VERSION.tgz + - Generiert ein Paket nach dem Schema KOMPONENTENNAME-VERSION.tgz - An der Helm-Registry anmelden: bspw. `helm registry login registry.domain.test` -- Helm-Chart in Registry pushen: bspw. `helm push target/make/k8s/helm/k8s-etcd-3.5.9-1.tgz oci://registry.domain.test/testing/` - - `testing` ist hier der Namespace der Komponente in der Helm-Registry und kann angepasst werden, falls nötig +- Helm-Chart in Registry pushen: + bspw. `helm push target/make/k8s/helm/k8s-etcd-3.5.9-1.tgz oci://registry.domain.test/testing/` + - `testing` ist hier der Namespace der Komponente in der Helm-Registry und kann angepasst werden, falls nötig + +### + +Wie entwickeln, wenn alle Komponenten aus dem Internet kommen sollen, aber eine zu testende Komponente aus der +cluster-lokalen Registry kommen soll? + +- ja, nun bitte dokumentieren xD ## Komponenten verwalten @@ -47,11 +59,15 @@ apiVersion: v2 name: k8s-dogu-operator ... dependencies: -- name: k8s/k8s-etcd - version: 3.*.* - condition: false + - name: k8s/k8s-etcd + version: 3.*.* + condition: false ``` +Abhängige Versionen können so gestaltet werden, dass sie nicht auf eine einzige Version fixiert werden, sondern +unterschiedliche Versionsbereiche abdecken. Dies ermöglicht den Betrieb von Komponenten, selbst wenn +Komponentenversionen mit kleineren Änderungen oder Fehlerbehebungen ausgebracht wurden. + Versionsmöglichkeiten und evtl. best practices oder Empfehlungen hier beschreiben ## Den Komponenten-Operator mit anderen Komponenten lokal testen diff --git a/docs/operations/managing_components_de.md b/docs/operations/managing_components_de.md index 1cd06ca..c5ef39c 100644 --- a/docs/operations/managing_components_de.md +++ b/docs/operations/managing_components_de.md @@ -1,89 +1,108 @@ # Verwendung von `k8s-component-operator` -Der Komponenten-Operator `k8s-component-operator` ist eine Komponente für die Kubernetes-Version des Cloudogu EcoSystems. Dieser Operator ermöglicht es, Komponenten auf einfache Weise zu installieren, zu aktualisieren oder zu löschen. Diese Komponenten stellen ihrerseits erforderliche Dienste für das EcoSystem bereit. +Der Komponenten-Operator `k8s-component-operator` ist eine Komponente für die Kubernetes-Version des Cloudogu EcoSystems (K8s-CES). Dieser Operator ermöglicht es, Komponenten auf einfache Weise zu installieren, zu aktualisieren oder zu löschen. Diese Komponenten stellen ihrerseits erforderliche Dienste für das EcoSystem bereit. ## Installation des Komponenten-Operators ### Helm-Repository konfigurieren +Um initial den Komponenten-Operator zu installieren, muss die Cloudogu Helm-Registry bekannt gemacht werden. + ```bash -$ helm repo add oci://registry.cloudogu.com/k8s ???? +$ helm registry login -u myuser registry.cloudogu.com +Password: ************************ +Login succeeded ``` +Für spätere K8s-CES-Komponenten ist dieses Helm-Repository unnötig, da der Komponenten-Operator über seine eigene Konfiguration verfügt. Siehe hierzu den nächsten Abschnitt [Zugangsdaten konfigurieren](#Zugangsdaten-konfigurieren). + ### Zugangsdaten konfigurieren -Gegebenenfalls für das Helm-Repository Zugangsdaten anlegen. +Der Komponenten-Operator verfügt über seine eigene Konfiguration hinsichtlich Endpunkt und Zugangsdaten. Wenn die K8s-CES-Instanz auf das Internet zugreifen kann, so sind Endpunkt und Zugangsdaten identisch mit denen der Dogu-Registry: +- Endpunkt: `oci://registry.cloudogu.com` +- Zugangsdaten: Der gleiche Benutzer/Passwort, wie die aus dem Secret `k8s-dogu-operator-dogu-registry` -siehe make helm-repo-config +Diese Konfiguration kann für den Cluster-Namespace `ecosystem` wie folgt manuell erzeugt werden: ```bash -$ kubectl add secret ???? +$ kubectl -n ecosystem create configmap component-operator-helm-repository --from-literal=endpoint="${HELM_REPO_ENDPOINT}" +$ kubectl -n ecosystem create secret generic component-operator-helm-registry \ + --from-literal=config.json='{"auths": {"${HELM_REPO_ENDPOINT}": {"auth": "$(shell printf "%s:%s" "${HELM_REPO_USERNAME}" "${HELM_REPO_PASSWORD}" | base64 -w0)"}}}' ``` ### Komponenten-Operator installieren -setup hinweis - -bei fehlern +Normalerweise wird der Komponenten-Operator vom `k8s-ces-setup` installiert. Manuell geschieht dies für den Cluster-Namespace `ecosystem` und den Helm-Registry-Namespace `k8s` wie folgt: -Entweder mittels Helm-Client installieren oder aktualisieren +```bash +$ helm install -n ecosystem k8s-component-operator oci://${HELM_REPO_ENDPOINT}/k8s/k8s-component-operator --version ${DESIRED_VERSION} +``` -- An der Helm-Registry anmelden: bspw. `helm registry login registry.domain.test` - - oder helm registry login -u myuser localhost:5000**** -- Helm-Chart in Registry pushen: bspw. `helm push target/make/k8s/helm/k8s-etcd-3.5.9-1.tgz oci://registry.domain.test/testing/` +### Komponenten-Operator deinstallieren ```bash -$ helm install k8s-component-operator oci://registry.domain.test/testing/k8s-component-operator --version 0.2.0 +$ helm uninstall -n ecosystem k8s-component-operator ``` -## Komponente installieren oder aktualisieren +## Komponenten installieren oder aktualisieren -Um Komponenten zu installieren oder zu aktualisieren, muss jeweils eine _Custom Resource_ (CR) für die gewünschte Komponente existieren. +Um Komponenten zu installieren oder zu aktualisieren, muss jeweils eine _Custom Resource_ (CR) für die gewünschte Komponente auf den Cluster im korrekten Cluster-Namespace angewendet werden. -Beispiel einer Komponenten-Ressource (z. B. als `k8s-etcd.yaml`): +Beispiel einer Komponenten-Ressource (z. B. als `k8s-dogu-operator.yaml` und aus dem Helm-Registry-Namespace `k8s`): ```yaml apiVersion: k8s.cloudogu.com/v1 kind: Component metadata: - name: k8s-etcd + name: k8s-dogu-operator spec: - name: k8s-etcd + name: k8s-dogu-operator namespace: k8s - version: 3.5.9-1 + version: 0.35.0 +``` + +Diese CR kann dann auf den Cluster angewendet werden: + +```bash +kubectl -n ecosystem apply -f k8s-dogu-operator.yaml ``` -Diese CR kann dann auf den Cluster angewendet werden: `kubectl apply -f k8s-etcd.yaml` -- Der Komponenten-Operator beginnt nun mit der Installation der Komponente -- Abhängigkeiten zu anderen k8s-CES-Komponenten und deren Versionen müssen erfüllt sein (siehe hierzu [Abhängigkeiten zu anderen Komponenten](#Abhängigkeiten-zu-anderen-Komponenten)) +Der Komponenten-Operator beginnt nun mit der Installation der Komponente. Abhängigkeiten zu anderen k8s-CES-Komponenten und deren Versionen müssen erfüllt sein (dies überprüft der Komponenten-Operator). Weitere Informationen zu diesem Thema befinden sich im Abschnitt [Abhängigkeiten zu anderen Komponenten](#Abhängigkeiten-zu-anderen-Komponenten). -Weitere Beispiele von Komponenten-Ressourcen befinden sich im [config/samples-Verzeichnis](../../config/samples) +Beispiele von Komponenten-Ressourcen befinden sich im [config/samples-Verzeichnis](../../config/samples) ### Felder und deren Bedeutung: +Ein Komponenten-CR besteht aus unterschiedlichen Feldern. Dieser Abschnitt erläutert diese: + - `.metadata.name`: Der Komponentenname der Kubernetes-Resource. Dieser muss identisch mit `.spec.name` sein. -- `.spec.name`: Der Komponentenname wie er in der Komponenten-Registry lautet. Dieser muss identisch mit `.spec.name` sein. -- `.spec.namespace`: Der Namespace der Komponente in der Komponenten-Registry. +- `.spec.name`: Der Komponentenname, wie er in der Helm-Registry lautet. Dieser muss identisch mit `.metadata.name` sein. +- `.spec.namespace`: Der Namespace der Komponente in der Helm-Registry. - Mittels unterschiedlicher Komponenten-Namespaces können unterschiedliche Versionen ausgebracht werden (z. B. zu Debugging-Zwecken). - Es handelt sich hierbei _nicht_ um den Cluster-Namespace. -- `.spec.version`: Die Version der Komponente in der Komponenten-Registry. - +- `.spec.version`: Die Version der Komponente in der Helm-Registry. -## Komponente deinstallieren +## Komponenten deinstallieren -- Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete -f etcd.yaml` -- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente +> [!WARNING] +> Löschen von Komponenten, die einen Zustand besitzen, kann die Stabilität der K8s-CES-Installation betriebsverhindernd stören. +> Dies gilt insbesondere (aber nicht ausschließlich) für die Komponente `k8s-etcd`. -```bash -$ kubectl api-resources --verbs=list -o name \ - | sort | xargs -t -n 1 \ - kubectl delete --ignore-not-found -l app.kubernetes.io/name: k8s-component-operator -n ecosystem -``` +- Löschen der Komponenten-CR aus dem Cluster kann auf zwei Arten erfolgen: + 1. durch Anwendung einer existierenden Komponenten-CR-Datei, z. B. `kubectl -n ecosystem delete -f k8s-dogu-operator.yaml` + 2. durch Angabe von `.metadata.name` der Komponenten, z. B. `kubectl -n ecosystem delete component k8s-dogu-operator` +- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente ## Abhängigkeiten zu anderen Komponenten -K8s-CES-Komponenten können von anderen k8s-CES-Komponenten abhängen. Um sicherzustellen, dass eine Komponente voll funktionsfähig ist, wird während der Installation bzw. Aktualisierung geprüft, ob Komponenten vorhanden sind und eine korrekte Version aufweisen. +K8s-CES-Komponenten können von anderen k8s-CES-Komponenten abhängen. Um sicherzustellen, dass eine Komponente voll funktionsfähig ist, wird während der Installation bzw. Aktualisierung geprüft, ob Komponentenabhängigkeiten vorhanden sind und diese eine korrekte Version aufweisen. + +Sollte eine oder mehrere Komponenten fehlen oder nicht in der richtigen Version vorhanden sein, so wird ein Event an der betroffenen Komponenten-Resource angefügt. Fehler wie diese können durch ein `kubectl describe` an der jeweiligen Komponten-Resource erkannt werden: + +```bash +$ kubectl -n ecosystem describe component k8s-dogu-operator +``` -Sollte eine oder mehrere Komponenten fehlen oder nicht in der richtigen Version vorhanden sein, so müssen diese manuell [nachinstalliert](#Komponente-installieren-oder-aktualisieren) bzw. aktualisiert werden. +In diesem Fall müssen die betroffenen Komponenten manuell [nachinstalliert oder aktualisiert](#Komponenten-installieren-oder-aktualisieren) werden. -Die Versionen zu Abhängigkeiten werden während der Komponentenentwicklung im Helm-Chart hinterlegt. Abhängige Versionen können so gestaltet werden, dass sie nicht auf eine einzige Version fixiert werden, sondern unterschiedliche Versionsbereiche abdecken. Dies ermöglicht den Betrieb von Komponenten, selbst wenn Komponentenversionen mit kleineren Änderungen oder Fehlerbehebungen ausgebracht wurden. \ No newline at end of file +Die Versionen zu Abhängigkeiten werden während der Komponentenentwicklung im Helm-Chart hinterlegt. Diese können i. d. R. nicht zum Installationszeitpunkt geändert werden. diff --git a/docs/operations/managing_components_en.md b/docs/operations/managing_components_en.md index b7f6016..08f6acb 100644 --- a/docs/operations/managing_components_en.md +++ b/docs/operations/managing_components_en.md @@ -1,86 +1,108 @@ # Using `k8s-component-operator` -The component operator `k8s-component-operator` is a component for the Kubernetes version of the Cloudogu EcoSystem. This operator enables you to install, update, or delete components in an easy fashion. These components in turn provide necessary services specific to the EcoSystem. +The component operator `k8s-component-operator` is a component for the Kubernetes version of the Cloudogu EcoSystem (K8s-CES). This operator allows to easily install, upgrade or delete components. These components in turn provide required services to the EcoSystem. -## Installation of the component operator +## Installing the component operator -### Configure a Helm repository +### Configure helm repository + +To initially install the component operator, a log-in to the Cloudogu Helm registry is required. ```bash -$ helm repo add oci://registry.cloudogu.com/k8s ???? +$ helm registry login -u myuser registry.cloudogu.com +Password: ************************ +Login succeeded ``` +For later K8s CES components, this helm repository log-in is unnecessary, since the component operator has its own configuration. See the next section [Configure credentials](#configure-credentials). + ### Configure credentials -Gegebenenfalls für das Helm-Repository Zugangsdaten anlegen. +The component operator has its own configuration regarding endpoint and credentials. When the K8s-CES instance is able to access the internet, the endpoint and credentials are identical to those of the Dogu registry: +- Endpoint: `oci://registry.cloudogu.com` +- Credentials: The same user/password as those from the secret `k8s-dogu-operator-dogu-registry` + +This configuration can be manually created for the cluster namespace `ecosystem` as follows: ```bash -$ kubectl add secret ???? +$ kubectl -n ecosystem create configmap component-operator-helm-repository --from-literal=endpoint="${HELM_REPO_ENDPOINT}" +$ kubectl -n ecosystem create secret generic component-operator-helm-registry \ + --from-literal=config.json='{"auths": {"${HELM_REPO_ENDPOINT}": {"auth": "$(shell printf "%s:%s" "${HELM_REPO_USERNAME}" "${HELM_REPO_PASSWORD}" | base64 -w0)"}}}' ``` -### Install the component operator +### Install component operator -Entweder mittels Helm-Client installieren oder aktualisieren +Normally the component operator is installed by `k8s-ces-setup`. This can be achieved in a manual way for the cluster namespace `ecosystem` and the helm registry namespace `k8s` as follows: ```bash -$ helm install chart.tgz??? +$ helm install -n ecosystem k8s-component-operator oci://${HELM_REPO_ENDPOINT}/k8s/k8s-component-operator --version ${DESIRED_VERSION} ``` -oder mittels `helm template` und einem darauf folgenden `kubectl`-Aufruf - +### Uninstall component operator ```bash -$ helm template chart.tgz??? +$ helm uninstall -n ecosystem k8s-component-operator ``` -## Komponente installieren oder aktualisieren +## Install or upgrade components -Um Komponenten zu installieren oder zu aktualisieren, muss jeweils eine _Custom Resource_ (CR) für die gewünschte Komponente existieren. +To install or upgrade components, a _Custom Resource_ (CR) for each desired component must be applied to the cluster in the correct cluster namespace. -Beispiel einer Komponenten-Ressource (z. B. als `k8s-etcd.yaml`): +Example of a component resource (e.g. as `k8s-dogu-operator.yaml` and from the Helm registry namespace `k8s`): ```yaml apiVersion: k8s.cloudogu.com/v1 kind: Component metadata: - name: k8s-etcd + name: k8s-dogu-operator spec: - name: k8s-etcd + name: k8s-dogu-operator namespace: k8s - version: 3.5.9-1 + version: 0.35.0 ``` -Diese CR kann dann auf den Cluster angewendet werden: `kubectl apply -f k8s-etcd.yaml` -- Der Komponenten-Operator beginnt nun mit der Installation der Komponente -- Abhängigkeiten zu anderen k8s-CES-Komponenten und deren Versionen müssen erfüllt sein (siehe hierzu [Abhängigkeiten zu anderen Komponenten](#Abhängigkeiten-zu-anderen-Komponenten)) +CRs like this can then be applied to the cluster: -Weitere Beispiele von Komponenten-Ressourcen befinden sich im [config/samples-Verzeichnis](../../config/samples) +```bash +kubectl -n ecosystem apply -f k8s-dogu-operator.yaml +``` -### Felder und deren Bedeutung: +The component operator now starts installing the component. Dependencies to other k8s-CES components and their versions must be fulfilled (this is checked by the component operator). For more information on this topic can be found in the section [Dependencies to other components](#Dependencies-to-other-components). -- `.metadata.name`: Der Komponentenname der Kubernetes-Resource. Dieser muss identisch mit `.spec.name` sein. -- `.spec.name`: Der Komponentenname wie er in der Komponenten-Registry lautet. Dieser muss identisch mit `.spec.name` sein. -- `.spec.namespace`: Der Namespace der Komponente in der Komponenten-Registry. - - Mittels unterschiedlicher Komponenten-Namespaces können unterschiedliche Versionen ausgebracht werden (z. B. zu Debugging-Zwecken). - - Es handelt sich hierbei _nicht_ um den Cluster-Namespace. -- `.spec.version`: Die Version der Komponente in der Komponenten-Registry. - +Examples of component resources are located in the [config/samples directory](../../config/samples) -## Komponente deinstallieren +### Fields and their meaning: -- Löschen der Komponenten-CR aus dem Cluster: bspw. `kubectl delete -f etcd.yaml` -- Der Komponenten-Operator beginnt nun mit der Deinstallation der Komponente +A component CR consists of various fields. This section describes these: -```bash -$ kubectl api-resources --verbs=list -o name \ - | sort | xargs -t -n 1 \ - kubectl delete --ignore-not-found -l app.kubernetes.io/name: k8s-component-operator -n ecosystem -``` +- `.metadata.name`: The component name of the Kubernetes resource. This must be identical to `.spec.name`. +- `.spec.name`: The component name as it appears in the Helm registry. This must be identical to `.metadata.name`. +- `.spec.namespace`: The component namespace in the helm registry. + - Using different component namespaces, different versions could be deployed (e.g. for debugging purposes). + - This is _not_ the cluster namespace. +- `.spec.version`: The version of the component in the helm registry. -## Abhängigkeiten zu anderen Komponenten +## Uninstall components -K8s-CES-Komponenten können von anderen k8s-CES-Komponenten abhängen. Um sicherzustellen, dass eine Komponente voll funktionsfähig ist, wird während der Installation bzw. Aktualisierung geprüft, ob Komponenten vorhanden sind und eine korrekte Version aufweisen. +> [!WARNING] +> Deleting components that maintain a state may jeopardize the stability of the K8s-CES installation. +> This is especially (but not exclusively) true for the component `k8s-etcd`. + +- Deleting a component CR from the cluster can be done in two ways: + 1. by deleting a component from an existing component CR file, e.g. `kubectl -n ecosystem delete -f k8s-dogu-operator.yaml`. + 2. by specifying `.metadata.name` of the components, e.g. `kubectl -n ecosystem delete component k8s-dogu-operator`. +- The component operator will now start uninstalling the component + +## Dependencies to other components + +K8s-CES components may depend on other k8s-CES components. To ensure that a component is fully functional, the component operator checks any dependency requirements during the installation/upgrade process to see if such component dependencies are present and that they have the correct version. + +If one or more components are missing or do not have the correct version, a corresponding event will be written to the component resource. Such errors can be discovered by `kubectl describe`ing the component resource, like so: + +```bash +$ kubectl -n ecosystem describe component k8s-dogu-operator +``` -Sollte eine oder mehrere Komponenten fehlen oder nicht in der richtigen Version vorhanden sein, so müssen diese manuell [nachinstalliert](#Komponente-installieren-oder-aktualisieren) bzw. aktualisiert werden. +In that case, the components in question must be manually [installed or upgraded](#Install-or-upgrade-components). -Die Versionen zu Abhängigkeiten werden während der Komponentenentwicklung im Helm-Chart hinterlegt. Abhängige Versionen können so gestaltet werden, dass sie nicht auf eine einzige Version fixiert werden, sondern unterschiedliche Versionsbereiche abdecken. Dies ermöglicht den Betrieb von Komponenten, selbst wenn Kompoentenversionen mit kleineren Änderungen oder Fehlerbehebungen ausgebracht wurden. \ No newline at end of file +The versions to dependencies are declared in the helm chart during the component development. These can usually not be changed at the time of installation. From f2dda969e7c993e41de68cb551cf9c499158fa7d Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 09:49:08 +0200 Subject: [PATCH 32/47] #15 update makefiles for added helm functionality Co-authored-by: Jeremias Weber --- Makefile | 2 +- build/make/k8s-controller.mk | 2 +- build/make/k8s-dogu.tpl | 2 +- build/make/k8s.mk | 85 ++++++++++++++++++++++++++---------- 4 files changed, 64 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index 10a2927..2bce6b2 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ VERSION=0.0.3 IMAGE_DEV=${K3CES_REGISTRY_URL_PREFIX}/${ARTIFACT_ID}:${VERSION} IMAGE=cloudogu/${ARTIFACT_ID}:${VERSION} GOTAG?=1.20.3 -MAKEFILES_VERSION=7.10.0 +MAKEFILES_VERSION=7.12.0 LINT_VERSION?=v1.52.1 STAGE?=production diff --git a/build/make/k8s-controller.mk b/build/make/k8s-controller.mk index 5735f00..d7129ad 100644 --- a/build/make/k8s-controller.mk +++ b/build/make/k8s-controller.mk @@ -38,7 +38,7 @@ K8S_INTEGRATION_TEST_DIR=${TARGET_DIR}/k8s-integration-test ##@ K8s - EcoSystem .PHONY: build -build: image-import k8s-apply ## Builds a new version of the dogu and deploys it into the K8s-EcoSystem. +build: k8s-helm-apply ## Builds a new version of the dogu and deploys it into the K8s-EcoSystem. ##@ Release diff --git a/build/make/k8s-dogu.tpl b/build/make/k8s-dogu.tpl index 44cd9cf..296da65 100644 --- a/build/make/k8s-dogu.tpl +++ b/build/make/k8s-dogu.tpl @@ -3,7 +3,7 @@ kind: Dogu metadata: name: NAME labels: - dogu: NAME + app: ces spec: name: NAMESPACE/NAME version: VERSION \ No newline at end of file diff --git a/build/make/k8s.mk b/build/make/k8s.mk index 6a48c18..6000f80 100644 --- a/build/make/k8s.mk +++ b/build/make/k8s.mk @@ -8,6 +8,11 @@ endif BINARY_YQ = $(UTILITY_BIN_PATH)/yq BINARY_HELM = $(UTILITY_BIN_PATH)/helm +BINARY_HELM_VERSION?=v3.12.0-dev.1.0.20230817154107-a749b663101d +BINARY_HELM_ADDITIONAL_PUSH_ARGS?=--plain-http +BINARY_HELM_ADDITIONAL_PACK_ARGS?= +BINARY_HELM_ADDITIONAL_UNINST_ARGS?= +BINARY_HELM_ADDITIONAL_UPGR_ARGS?= # The productive tag of the image IMAGE ?= @@ -23,6 +28,7 @@ K8S_RESOURCE_TEMP_YAML ?= $(K8S_RESOURCE_TEMP_FOLDER)/$(ARTIFACT_ID)_$(VERSION). K8S_HELM_TARGET ?= $(K8S_RESOURCE_TEMP_FOLDER)/helm K8S_HELM_RESSOURCES ?= k8s/helm K8S_HELM_RELEASE_TGZ=${K8S_HELM_TARGET}/${ARTIFACT_ID}-${VERSION}.tgz +K8S_HELM_TARGET_DEP_DIR=charts ##@ K8s - Variables @@ -80,9 +86,9 @@ k8s-apply: k8s-generate $(K8S_POST_GENERATE_TARGETS) ## Applies all generated K8 @kubectl apply -f $(K8S_RESOURCE_TEMP_YAML) --namespace=${NAMESPACE} ##@ K8s - Helm general - -${K8S_HELM_RESSOURCES}/Chart.yaml: ${BINARY_HELM} ## Creates the Chart.yaml-template if missing - @echo "Create Chart.yaml..." +.PHONY: k8s-helm-init-chart +k8s-helm-init-chart: ${BINARY_HELM} ## Creates a Chart.yaml-template with zero values + @echo "Initialize ${K8S_HELM_RESSOURCES}/Chart.yaml..." @mkdir -p ${K8S_HELM_RESSOURCES}/tmp/ @${BINARY_HELM} create ${K8S_HELM_RESSOURCES}/tmp/${ARTIFACT_ID} @cp ${K8S_HELM_RESSOURCES}/tmp/${ARTIFACT_ID}/Chart.yaml ${K8S_HELM_RESSOURCES}/ @@ -91,19 +97,19 @@ ${K8S_HELM_RESSOURCES}/Chart.yaml: ${BINARY_HELM} ## Creates the Chart.yaml-temp @sed -i 's/version: .*/version: 0.0.0-replaceme/' ${K8S_HELM_RESSOURCES}/Chart.yaml .PHONY: k8s-helm-delete -k8s-helm-delete: ${BINARY_HELM} ## Uninstalls the current helm chart. +k8s-helm-delete: ${BINARY_HELM} check-k8s-namespace-env-var ## Uninstalls the current helm chart. @echo "Uninstall helm chart" - @${BINARY_HELM} uninstall ${ARTIFACT_ID} + @${BINARY_HELM} uninstall ${ARTIFACT_ID} --namespace=${NAMESPACE} ${BINARY_HELM_ADDITIONAL_UNINST_ARGS} || true .PHONY: k8s-helm-generate-chart -k8s-helm-generate-chart: ${K8S_HELM_TARGET}/Chart.yaml +k8s-helm-generate-chart: ${K8S_HELM_TARGET}/Chart.yaml ## Generates the final helm chart. -${K8S_HELM_TARGET}/Chart.yaml: ${K8S_HELM_RESSOURCES}/Chart.yaml $(K8S_RESOURCE_TEMP_FOLDER) ## Generates the final helm chart. +${K8S_HELM_TARGET}/Chart.yaml: $(K8S_RESOURCE_TEMP_FOLDER) @echo "Generate helm chart..." - @rm -drf ${K8S_HELM_TARGET} # delete folder, so Chart.yaml is newly created from template + @rm -drf ${K8S_HELM_TARGET} # delete folder, so the chart is newly created. @mkdir -p ${K8S_HELM_TARGET}/templates @cp $(K8S_RESOURCE_TEMP_YAML) ${K8S_HELM_TARGET}/templates - @cp ${K8S_HELM_RESSOURCES}/Chart.yaml ${K8S_HELM_TARGET} + @cp -r ${K8S_HELM_RESSOURCES}/** ${K8S_HELM_TARGET} @sed -i 's/appVersion: "0.0.0-replaceme"/appVersion: "${VERSION}"/' ${K8S_HELM_TARGET}/Chart.yaml @sed -i 's/version: 0.0.0-replaceme/version: ${VERSION}/' ${K8S_HELM_TARGET}/Chart.yaml @@ -113,9 +119,9 @@ ${K8S_HELM_TARGET}/Chart.yaml: ${K8S_HELM_RESSOURCES}/Chart.yaml $(K8S_RESOURCE_ k8s-helm-generate: k8s-generate k8s-helm-generate-chart ## Generates the final helm chart with dev-urls. .PHONY: k8s-helm-apply -k8s-helm-apply: ${BINARY_HELM} image-import k8s-helm-generate $(K8S_POST_GENERATE_TARGETS) ## Generates and installs the helm chart. +k8s-helm-apply: ${BINARY_HELM} check-k8s-namespace-env-var image-import k8s-helm-generate $(K8S_POST_GENERATE_TARGETS) ## Generates and installs the helm chart. @echo "Apply generated helm chart" - @${BINARY_HELM} upgrade -i ${ARTIFACT_ID} ${K8S_HELM_TARGET} + @${BINARY_HELM} upgrade -i ${ARTIFACT_ID} ${K8S_HELM_TARGET} ${BINARY_HELM_ADDITIONAL_UPGR_ARGS} --namespace ${NAMESPACE} .PHONY: k8s-helm-reinstall k8s-helm-reinstall: k8s-helm-delete k8s-helm-apply ## Uninstalls the current helm chart and reinstalls it. @@ -123,17 +129,55 @@ k8s-helm-reinstall: k8s-helm-delete k8s-helm-apply ## Uninstalls the current hel ##@ K8s - Helm release targets .PHONY: k8s-helm-generate-release -k8s-helm-generate-release: ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml +k8s-helm-generate-release: ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml ## Generates the final helm chart with release urls. -${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml: $(K8S_PRE_GENERATE_TARGETS) ${K8S_HELM_TARGET}/Chart.yaml ## Generates the final helm chart with release urls. +${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml: $(K8S_PRE_GENERATE_TARGETS) ${K8S_HELM_TARGET}/Chart.yaml @sed -i "s/'{{ .Namespace }}'/'{{ .Release.Namespace }}'/" ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml .PHONY: k8s-helm-package-release -k8s-helm-package-release: ${K8S_HELM_RELEASE_TGZ} +k8s-helm-package-release: ${BINARY_HELM} k8s-helm-delete-existing-tgz ${K8S_HELM_RELEASE_TGZ} k8s-helm-delete-temp-dependencies k8s-helm-remove-dependency-charts ## Generates and packages the helm chart with release urls. + +.PHONY: k8s-helm-delete-existing-tgz +k8s-helm-delete-existing-tgz: ## Remove an existing Helm package. +# remove + @rm -f ${K8S_HELM_RELEASE_TGZ}* -${K8S_HELM_RELEASE_TGZ}: ${BINARY_HELM} ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml $(K8S_POST_GENERATE_TARGETS) ## Generates and packages the helm chart with release urls. +${K8S_HELM_RELEASE_TGZ}: ${BINARY_HELM} ${K8S_HELM_TARGET}/templates/$(ARTIFACT_ID)_$(VERSION).yaml k8s-helm-create-temp-dependencies $(K8S_POST_GENERATE_TARGETS) ## Generates and packages the helm chart with release urls. @echo "Package generated helm chart" - ${BINARY_HELM} package ${K8S_HELM_TARGET} -d ${K8S_HELM_TARGET} + @${BINARY_HELM} package ${K8S_HELM_TARGET} -d ${K8S_HELM_TARGET} ${BINARY_HELM_ADDITIONAL_PACK_ARGS} + +.PHONY: k8s-helm-create-temp-dependencies +k8s-helm-create-temp-dependencies: k8s-helm-generate-chart +# we use helm dependencies internally but never use them as "official" dependency because the namespace may differ +# instead we create empty dependencies to satisfy the helm package call and delete the whole directory from the chart.tgz later-on. + @echo "Create helm temp dependencies (if they exist)" + @for dep in `yq -e '.dependencies[].name // ""' ${K8S_HELM_TARGET}/Chart.yaml`; do \ + mkdir -p ${K8S_HELM_TARGET}/${K8S_HELM_TARGET_DEP_DIR}/$${dep} ; \ + sed "s|replaceme|$${dep}|g" $(BUILD_DIR)/make/k8s-helm-temp-chart.yaml > ${K8S_HELM_TARGET}/${K8S_HELM_TARGET_DEP_DIR}/$${dep}/Chart.yaml ; \ + done + +.PHONY: k8s-helm-delete-temp-dependencies +k8s-helm-delete-temp-dependencies: + @echo "Delete helm temp dependencies (if they exist)" + @rm -rf ${K8S_HELM_TARGET}/${K8S_HELM_TARGET_DEP_DIR} + +.PHONY: k8s-helm-remove-dependency-charts +k8s-helm-remove-dependency-charts: ${K8S_HELM_RELEASE_TGZ} +# deleting dirs from a .tgz is hard so un-tar,remove dir,re-tar is a good alternative +# but only if any dependency directory actually exists + @if tar -tf ${K8S_HELM_RELEASE_TGZ} ${ARTIFACT_ID}/${K8S_HELM_TARGET_DEP_DIR} > /dev/null 2>&1; then \ + echo "Remove dependency files from ${K8S_HELM_RELEASE_TGZ}" ; \ + gzip --to-stdout --decompress ${K8S_HELM_RELEASE_TGZ} | \ + tar --to-stdout --delete "${ARTIFACT_ID}/${K8S_HELM_TARGET_DEP_DIR}" -f - | \ + gzip > ${K8S_HELM_RELEASE_TGZ}.temp ; \ + rm ${K8S_HELM_RELEASE_TGZ} && mv ${K8S_HELM_RELEASE_TGZ}.temp ${K8S_HELM_RELEASE_TGZ} ; \ + fi + +.PHONY: chart-import +chart-import: check-all-vars check-k8s-artifact-id k8s-helm-generate-chart k8s-helm-package-release image-import ## Imports the currently available image into the cluster-local registry. + @echo "Import ${K8S_HELM_RELEASE_TGZ} into K8s cluster ${K3CES_REGISTRY_URL_PREFIX}..." + @${BINARY_HELM} push ${K8S_HELM_RELEASE_TGZ} oci://${K3CES_REGISTRY_URL_PREFIX}/k8s ${BINARY_HELM_ADDITIONAL_PUSH_ARGS} + @echo "Done." ##@ K8s - Docker @@ -160,13 +204,6 @@ image-import: check-all-vars check-k8s-artifact-id docker-dev-tag ## Imports the @docker push ${IMAGE_DEV} @echo "Done." -.PHONY: chart-import -chart-import: check-all-vars check-k8s-artifact-id k8s-helm-generate-chart k8s-helm-package-release image-import ## Imports the currently available image into the cluster-local registry. - @echo "Import ${K8S_HELM_RELEASE_TGZ} into K8s cluster ${K3CES_REGISTRY_URL_PREFIX}..." - @helm push --kube-insecure-skip-tls-verify ${K8S_HELM_RELEASE_TGZ} oci://${K3CES_REGISTRY_URL_PREFIX}/k8s - - @echo "Done." - ## Functions # Check that given variables are set and all have non-empty values, @@ -186,4 +223,4 @@ ${BINARY_YQ}: $(UTILITY_BIN_PATH) ## Download yq locally if necessary. $(call go-get-tool,$(BINARY_YQ),github.com/mikefarah/yq/v4@v4.25.1) ${BINARY_HELM}: $(UTILITY_BIN_PATH) ## Download helm locally if necessary. - $(call go-get-tool,$(BINARY_HELM),helm.sh/helm/v3/cmd/helm@latest) + $(call go-get-tool,$(BINARY_HELM),helm.sh/helm/v3/cmd/helm@${BINARY_HELM_VERSION}) From 5de72ecb3cd42b489d99ec3b88d69f53ee50363c Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 10:34:04 +0200 Subject: [PATCH 33/47] #15 describe developing the component operator and components Co-authored-by: Jeremias Weber --- .../development/developing_the_operator_de.md | 71 ++++++++-------- .../development/developing_the_operator_en.md | 80 ++++++++++++------- 2 files changed, 82 insertions(+), 69 deletions(-) diff --git a/docs/development/developing_the_operator_de.md b/docs/development/developing_the_operator_de.md index 437a486..dd8f468 100644 --- a/docs/development/developing_the_operator_de.md +++ b/docs/development/developing_the_operator_de.md @@ -1,31 +1,30 @@ -# Komponenten mit dem Komponenten-Operator verwalten +# Komponenten-Operator und Komponenten entwickeln -Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten im Cluster installiert und löscht. +Dieses Dokument beschreibt sowohl, wie man den Komponenten-Operator entwickelt als auch Komponenten-spezifische Eigenheiten. ## Vorbereitungen ### Helm-Repository konfigurieren - Die Datei `.env` aus dem Template `.env.template` erstellen - - Wichtig sind die Variablen HELM_REPO_ENDPOINT (bspw. https://registry.domain.test), HELM_REPO_USERNAME und - HELM_REPO_PASSWORD - - Außerdem sollte NAMESPACE korrekt gesetzt sein + - Wichtig sind die Variablen + - `HELM_REPO_ENDPOINT` (bspw. https://registry.cloudogu.com) + - `HELM_REPO_USERNAME` + - `HELM_REPO_PASSWORD` + - `NAMESPACE` - Credentials im Cluster ablegen: `make helm-repo-config` ### Den Komponenten-Operator lokal debuggen 1. Befolgen Sie die Installationsanweisungen von k8s-ecosystem -2. Bearbeiten Sie Ihre `/etc/hosts` und fügen Sie ein Mapping von localhost zu etcd hinzu - - `127.0.0.1 localhost etcd docker-registry.ecosystem.svc.cluster.local` -3. Öffnen Sie die Datei `.env.template` und folgen Sie den Anweisungen um eine +2. Öffnen Sie die Datei `.env.template` und folgen Sie den Anweisungen um eine Umgebungsvariablendatei mit persönlichen Informationen anzulegen -4. Erzeugen Sie einen etcd Port-Forward - - `kubectl -n=ecosystem port-forward docker-registry 30099:30099` -5. Löschen Sie eventuelle Dogu-Operator-Deployments im Cluster, um Parallelisierungsfehler auszuschließen - - `kubectl delete deployment k8s-dogu-operator` -6. Legen Sie eine neue Debug-Konfiguration (z. B. in IntelliJ) ans, um den Operator lokal auszuführen +3. Löschen Sie eventuelle Komponenten-Operator-Deployments im Cluster, um Parallelisierungsfehler auszuschließen + - `kubectl -n ecosystem delete deployment k8s-component-operator` +4. Legen Sie eine neue Debug-Konfiguration (z. B. in IntelliJ) ans, um den Operator lokal auszuführen - mit diesen Umgebungsvariablen: - STAGE=production;NAMESPACE=ecosystem;KUBECONFIG=/pfad/zur/kubeconfig/.kube/k3ces.local +5. Breakpoints setzen und ggf. ein Komponenten-CR auf den Cluster anwenden ### Komponenten-Operator installieren @@ -33,43 +32,37 @@ Hier wird beschrieben, wie man mit dem Komponenten-Operator k8s-CES-Komponenten ### Komponente für Test vorbereiten -- Repository der Komponente öffnen, bspw. k8s-etcd -- Helm-Chart erstellen: `make k8s-helm-package-release` - - Generiert ein Paket nach dem Schema KOMPONENTENNAME-VERSION.tgz -- An der Helm-Registry anmelden: bspw. `helm registry login registry.domain.test` -- Helm-Chart in Registry pushen: - bspw. `helm push target/make/k8s/helm/k8s-etcd-3.5.9-1.tgz oci://registry.domain.test/testing/` - - `testing` ist hier der Namespace der Komponente in der Helm-Registry und kann angepasst werden, falls nötig - -### - -Wie entwickeln, wenn alle Komponenten aus dem Internet kommen sollen, aber eine zu testende Komponente aus der -cluster-lokalen Registry kommen soll? - -- ja, nun bitte dokumentieren xD - -## Komponenten verwalten - -Siehe hierzu die Anmerkungen im [Operations-Dokument](../operations/managing_components_de.md) +Am Beispiel von `k8s-dogu-operator` + +1. Repository der Komponente öffnen +2. Ggf. im Verzeichnis `k8s/helm` ein `Chart.yaml` mit `make k8s-helm-init-chart` anlegen +3. Helm-Package erstellen: `make k8s-helm-package-release` + - generiert ein Paket nach dem Schema KOMPONENTENNAME-VERSION.tgz +4. ggf. alle nötigen Nicht-Test-Komponenten [installieren](../operations/managing_components_de.md#komponenten-installieren-oder-aktualisieren) + `kubectl -n ecosystem apply -f yourComponentCR.yaml` +5. Test-Komponente pushen: + - `make chart-import` +6. die ConfigMap `component-operator-helm-repository` auf die cluster-lokale Registry richten + - `kubectl -n ecosystem patch configmap component-operator-helm-repository -p '{"data": {"endpoint": "oci://k3ces.local:30099","plainHttp": "true"}}'` +7. YAML der Test-Komponente überprüfen und [installieren](../operations/managing_components_de.md#komponenten-installieren-oder-aktualisieren) + `kubectl -n ecosystem apply -f k8s-dogu-operator.yaml` ## Abhängigkeiten in Komponenten darstellen +Komponenten müssen nicht unbedingt für sich alleine stehen, sondern können auch andere Komponenten erfordern. Dies wird als Abhängigkeit im Helm-Chart definiert: + ```yaml apiVersion: v2 name: k8s-dogu-operator ... dependencies: - - name: k8s/k8s-etcd + - name: k8s/k8s-dogu-operator version: 3.*.* condition: false ``` -Abhängige Versionen können so gestaltet werden, dass sie nicht auf eine einzige Version fixiert werden, sondern -unterschiedliche Versionsbereiche abdecken. Dies ermöglicht den Betrieb von Komponenten, selbst wenn -Komponentenversionen mit kleineren Änderungen oder Fehlerbehebungen ausgebracht wurden. - -Versionsmöglichkeiten und evtl. best practices oder Empfehlungen hier beschreiben +Abhängigkeitsversionen sollten so gestaltet werden, dass sie nicht auf eine einzige Version fixiert werden, sondern unterschiedliche Versionsbereiche abdecken. Dies ermöglicht den Betrieb von Komponenten, selbst wenn Komponentenversionen mit kleineren Änderungen oder Fehlerbehebungen ausgebracht wurden. -## Den Komponenten-Operator mit anderen Komponenten lokal testen +Die Bibliothek [Masterminds/semver](https://github.com/Masterminds/semver#checking-version-constraints) beschreibt genauer, welche Versionseinschränkungen möglich sind. -irgendwelche Magie mit der cluster-lokalen Registry... \ No newline at end of file +Da wir die Abhängigkeitsdeklaration im Helm-Chart nur nutzen, um Abhängigkeiten für den Komponenten-Operator darzustellen, muss das Feld `.dependencies.[].condition` zwingend auf `false` gesetzt werden. Würde dieses Feld `true` sein, würde Helm die Abhängigkeit automatisch installieren und der Komponenten-Operator würde in seiner eigenen Tätigkeit gestört werden. diff --git a/docs/development/developing_the_operator_en.md b/docs/development/developing_the_operator_en.md index 99c34c7..f385131 100644 --- a/docs/development/developing_the_operator_en.md +++ b/docs/development/developing_the_operator_en.md @@ -1,47 +1,67 @@ -# Manage components with the component operator +# Developing both the component operator and components -Here we describe how to install and delete k8s-CES components in the cluster using the component operator. +This document describes both how to develop the component operator and component-specific features. ## Preparations -### Configure helm repository +### Configure Helm repository + - Create the file `.env` from the template `.env.template` - - The variables HELM_REPO_ENDPOINT (e.g. https://registry.domain.test), HELM_REPO_USERNAME and HELM_REPO_PASSWORD are important. - - In addition, NAMESPACE should be set correctly. -- Store credentials in the cluster: `make helm-repo-config`. + - Important are the variables + - `HELM_REPO_ENDPOINT` (e.g. https://registry.cloudogu.com) + - `HELM_REPO_USERNAME` + - `HELM_REPO_PASSWORD` + - `NAMESPACE` +- Store credentials in the cluster: `make helm-repo-config` + +### Debugging the component operator locally + +1. follow the installation instructions of k8s-ecosystem +2. open the file `.env.template` and follow the instructions to create an environment variables (see above) +3. delete any component operator deployments in the cluster to avoid parallelization errors + - `kubectl -n ecosystem delete deployment k8s-component-operator` +4. create a new debug configuration (e.g. in IntelliJ) to run the operator locally + - with these environment variables: + - STAGE=production;NAMESPACE=ecosystem;KUBECONFIG=/path/to/kubeconfig/.kube/k3ces.local +5. set breakpoints and apply a component CR to the cluster if necessary. ### Install component operator + - Build operator and install in cluster: `make k8s-helm-apply` ### Prepare component for test -- Open repository of component, e.g. k8s-etcd -- Create helm chart: `make k8s-helm-package-release`. - - Generates a package according to the scheme COMPONENTNAME-VERSION.tgz -- Log in to the helm registry: e.g. `helm registry login registry.domain.test`. -- Push helm chart to registry: e.g. `helm push target/make/k8s/helm/k8s-etcd-3.5.9-1.tgz oci://registry.domain.test/testing/` - - `testing` here is the namespace of the component in the helm registry and can be modified if necessary -## Installing the component -- Write custom resource (CR) for component. Example: +Using `k8s-dogu-operator` as an example + +1. open the repository of the component +2. if necessary, create a `chart.yaml` with `make k8s-helm-init-chart` in the `k8s/helm` directory +3. create Helm package: `make k8s-helm-package-release`. + - generates a package according to the scheme COMPONENT-NAME-VERSION.tgz +4. if necessary [install](../operations/managing_components_en.md#install-or-upgrade-components) all necessary non-test components + `kubectl -n ecosystem apply -f yourComponentCR.yaml` +5. push test component: + - `make chart-import` +6. direct the ConfigMap `component-operator-helm-repository` to the cluster-local registry + - `kubectl -n ecosystem patch configmap component-operator-helm-repository -p '{"data": {"endpoint": "oci://k3ces.local:30099","plainHttp": "true"}}'` +7. revise YAML of test component and [install](../operations/managing_components_en.md#install-or-upgrade-components) + `kubectl -n ecosystem apply -f k8s-dogu-operator.yaml` + +## Manage dependencies in components + +Components do not necessarily have to stand alone, but can also require other components. This is defined as a dependency in the Helm chart: ```yaml -apiVersion: k8s.cloudogu.com/v1 -kind: Component -metadata: - name: k8s-etcd -spec: - name: k8s-etcd - namespace: testing - version: 3.5.9-1 +apiVersion: v2 +name: k8s-dogu-operator +... +dependencies: + - name: k8s/k8s-dogu-operator + version: 3.*.* + condition: false ``` -- `namespace` here is the namespace of the component in the helm registry (see above) -- More examples can be found at config/samples - -- Apply the CR to the cluster: e.g. `kubectl apply -f etcd.yaml`. -- The component operator will now start installing the component +Dependency versions should be declared in such a way that they are not fixed to a single version, but cover different version ranges. This allows components to be run even if component versions with minor changes or bug fixes have been deployed. -## Uninstalling the component +The [Masterminds/semver](https://github.com/Masterminds/semver#checking-version-constraints) library describes in more detail which version constraints are possible. -- Delete the component CR from the cluster: e.g. `kubectl delete -f etcd.yaml` -- The component operator will now start uninstalling the component \ No newline at end of file +Since we use the dependency declaration in the Helm chart only to represent dependencies for the component operator, the `.dependencies.[].condition` field must necessarily be set to `false`. If this field were `true`, Helm would automatically install the dependency and the component operator would be disturbed in its own activity. From 06b31275889c21a65e303ceba75ee1bd527cd5dc Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 11:13:01 +0200 Subject: [PATCH 34/47] #15 update CHANGELOG.md Co-authored-by: Jeremias Weber --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cea9132..1f3eca0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added - [#15] Check if component dependencies are installed and if their version is appropriate - - you can find more information about components in the [operations docs]() + - you can find more information about components in the [operations docs](docs/operations/managing_components_en.md) ## [v0.0.3] - 2023-08-21 ### Changed From bd1e0be7aacb4c849e3566e6edee5ac60a5af9d9 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 11:13:42 +0200 Subject: [PATCH 35/47] #15 fix typo in CHANGELOG.md Co-authored-by: Jeremias Weber --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f3eca0..d2f731d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [v0.0.2] - 2023-07-14 ### Added - [#12] Add upgrade of components and self-upgrade of component-operator -- Add documentation for component operator usage in a devlepment environment +- Add documentation for component operator usage in a development environment ### Fixed - Operator finishes uninstallation steps even if component has been uninstalled already From 42651103640c7d1d534bfc3499d0d124285745b8 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 11:14:40 +0200 Subject: [PATCH 36/47] #15 silence make target Co-authored-by: Jeremias Weber --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2bce6b2..6561d3c 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ kill-operator-pod: .PHONY: helm-repo-config helm-repo-config: ## Creates a configMap and a secret for the helm repo connection from env vars HELM_REPO_USERNAME, HELM_REPO_PASSWORD, HELM_REPO_ENDPOINT. @kubectl create configmap component-operator-helm-repository --from-literal=endpoint=${HELM_REPO_ENDPOINT} - kubectl create secret generic component-operator-helm-registry --from-literal=config.json='{"auths": {"${HELM_REPO_ENDPOINT}": {"auth": "$(shell printf "%s:%s" "${HELM_REPO_USERNAME}" "${HELM_REPO_PASSWORD}" | base64 -w0)"}}}' + @kubectl create secret generic component-operator-helm-registry --from-literal=config.json='{"auths": {"${HELM_REPO_ENDPOINT}": {"auth": "$(shell printf "%s:%s" "${HELM_REPO_USERNAME}" "${HELM_REPO_PASSWORD}" | base64 -w0)"}}}' ##@ Debug From b7940282da1aca8b75861c41120ff09c6ab2a12d Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 11:37:18 +0200 Subject: [PATCH 37/47] #15 generate labels to CRD according our label policy Co-authored-by: Jeremias Weber --- config/crd/bases/k8s.cloudogu.com_components.yaml | 1 + config/manager/kustomization.yaml | 14 +++++++------- pkg/api/v1/ces_component_types.go | 1 + pkg/api/v1/k8s.cloudogu.com_components.yaml | 3 +++ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/config/crd/bases/k8s.cloudogu.com_components.yaml b/config/crd/bases/k8s.cloudogu.com_components.yaml index f89c8f3..a4f510b 100644 --- a/config/crd/bases/k8s.cloudogu.com_components.yaml +++ b/config/crd/bases/k8s.cloudogu.com_components.yaml @@ -4,6 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.3 + creationTimestamp: null labels: app: ces app.kubernetes.io/name: k8s-component-operator diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index 6f58b7c..be88892 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -1,14 +1,14 @@ resources: - - manager.yaml +- manager.yaml generatorOptions: disableNameSuffixHash: true configMapGenerator: - - files: - - controller_manager_config.yaml - name: manager-config +- files: + - controller_manager_config.yaml + name: manager-config apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - - name: controller - newName: cloudogu/k8s-component-operator - newTag: 0.0.3 +- name: controller + newName: cloudogu/k8s-component-operator + newTag: 0.0.3 diff --git a/pkg/api/v1/ces_component_types.go b/pkg/api/v1/ces_component_types.go index 42b04b2..853e812 100644 --- a/pkg/api/v1/ces_component_types.go +++ b/pkg/api/v1/ces_component_types.go @@ -53,6 +53,7 @@ type ComponentStatus struct { // +kubebuilder:object:root=true // +kubebuilder:subresource:status +// +kubebuilder:metadata:labels=app=ces;app.kubernetes.io/name=k8s-component-operator // Component is the Schema for the ces component API type Component struct { diff --git a/pkg/api/v1/k8s.cloudogu.com_components.yaml b/pkg/api/v1/k8s.cloudogu.com_components.yaml index e96cd16..a4f510b 100644 --- a/pkg/api/v1/k8s.cloudogu.com_components.yaml +++ b/pkg/api/v1/k8s.cloudogu.com_components.yaml @@ -5,6 +5,9 @@ metadata: annotations: controller-gen.kubebuilder.io/version: v0.11.3 creationTimestamp: null + labels: + app: ces + app.kubernetes.io/name: k8s-component-operator name: components.k8s.cloudogu.com spec: group: k8s.cloudogu.com From 29633e4c64deb37d03f26eff464145d39ae21db8 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 11:55:16 +0200 Subject: [PATCH 38/47] #15 Remove go dependency to cesapp-lib Co-authored-by: Jeremias Weber --- go.mod | 1 - pkg/config/config.go | 9 +++-- pkg/config/config_test.go | 2 +- pkg/controllers/componentController.go | 11 +++--- pkg/logging/logger.go | 7 ---- pkg/logging/logger_test.go | 47 ++------------------------ 6 files changed, 14 insertions(+), 63 deletions(-) diff --git a/go.mod b/go.mod index e122eca..6625ae1 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.20 require ( github.com/Masterminds/semver/v3 v3.2.1 github.com/bombsimon/logrusr/v2 v2.0.1 - github.com/cloudogu/cesapp-lib v0.12.0 github.com/cloudogu/k8s-apply-lib v0.4.2 github.com/go-logr/logr v1.2.4 github.com/mittwald/go-helm-client v0.12.3 diff --git a/pkg/config/config.go b/pkg/config/config.go index b959dce..b75c144 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -7,8 +7,7 @@ import ( "strconv" "strings" - "github.com/cloudogu/cesapp-lib/core" - + "github.com/Masterminds/semver/v3" "gopkg.in/yaml.v3" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -71,7 +70,7 @@ type OperatorConfig struct { // Namespace specifies the namespace that the operator is deployed to. Namespace string `json:"namespace"` // Version contains the current version of the operator - Version *core.Version `json:"version"` + Version *semver.Version `json:"version"` // HelmRepositoryData contains all necessary data for the helm repository. HelmRepositoryData *HelmRepositoryData `json:"helm_repository"` } @@ -88,7 +87,7 @@ func NewOperatorConfig(version string) (*OperatorConfig, error) { log.Info("Starting in development mode! This is not recommended for production!") } - parsedVersion, err := core.ParseVersion(version) + parsedVersion, err := semver.NewVersion(version) if err != nil { return nil, fmt.Errorf("failed to parse version: %w", err) } @@ -102,7 +101,7 @@ func NewOperatorConfig(version string) (*OperatorConfig, error) { return &OperatorConfig{ Namespace: namespace, - Version: &parsedVersion, + Version: parsedVersion, }, nil } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 9749ae2..0f1fc98 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -38,7 +38,7 @@ func TestNewOperatorConfig(t *testing.T) { require.NoError(t, err) require.NotNil(t, operatorConfig) assert.Equal(t, expectedNamespace, operatorConfig.Namespace) - assert.Equal(t, "0.1.0", operatorConfig.Version.Raw) + assert.Equal(t, "0.1.0", operatorConfig.Version.Original()) }) } diff --git a/pkg/controllers/componentController.go b/pkg/controllers/componentController.go index d2b49c4..6bb34a9 100644 --- a/pkg/controllers/componentController.go +++ b/pkg/controllers/componentController.go @@ -5,9 +5,10 @@ import ( "fmt" "strings" - "github.com/cloudogu/cesapp-lib/core" k8sv1 "github.com/cloudogu/k8s-component-operator/pkg/api/v1" + semver "github.com/Masterminds/semver/v3" + "helm.sh/helm/v3/pkg/release" corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -228,21 +229,21 @@ func (r *componentReconciler) getChangeOperation(component *k8sv1.Component) (op func getChangeOperationForRelease(component *k8sv1.Component, release *release.Release) (operation, error) { chart := release.Chart - deployedAppVersion, err := core.ParseVersion(chart.AppVersion()) + deployedAppVersion, err := semver.NewVersion(chart.AppVersion()) if err != nil { return "", fmt.Errorf("failed to parse app version %s from helm chart %s: %w", chart.AppVersion(), chart.Name(), err) } - componentVersion, err := core.ParseVersion(component.Spec.Version) + componentVersion, err := semver.NewVersion(component.Spec.Version) if err != nil { return "", fmt.Errorf("failed to parse component version %s from %s: %w", component.Spec.Version, component.Spec.Name, err) } - if deployedAppVersion.IsOlderThan(componentVersion) { + if deployedAppVersion.LessThan(componentVersion) { return Upgrade, nil } - if deployedAppVersion.IsNewerThan(componentVersion) { + if deployedAppVersion.GreaterThan(componentVersion) { return Downgrade, nil } diff --git a/pkg/logging/logger.go b/pkg/logging/logger.go index 16f1507..9781d74 100644 --- a/pkg/logging/logger.go +++ b/pkg/logging/logger.go @@ -6,7 +6,6 @@ import ( "strings" "github.com/bombsimon/logrusr/v2" - "github.com/cloudogu/cesapp-lib/core" "github.com/cloudogu/k8s-apply-lib/apply" "github.com/go-logr/logr" "github.com/sirupsen/logrus" @@ -121,12 +120,6 @@ func ConfigureLogger() error { // set logr logger as controller logger ctrl.SetLogger(logrusLogrLogger) - // set custom logger implementation to cesapp-lib logger - cesappLibLogger := libraryLogger{name: "cesapp-lib", logger: logrusLogrLogger.GetSink()} - core.GetLogger = func() core.Logger { - return &cesappLibLogger - } - // set custom logger implementation to k8s-apply-lib logger k8sApplyLibLogger := libraryLogger{name: "k8s-apply-lib", logger: logrusLogrLogger.GetSink()} apply.GetLogger = func() apply.Logger { diff --git a/pkg/logging/logger_test.go b/pkg/logging/logger_test.go index 29ca9a3..c21ddf8 100644 --- a/pkg/logging/logger_test.go +++ b/pkg/logging/logger_test.go @@ -1,30 +1,19 @@ package logging import ( - "github.com/cloudogu/k8s-apply-lib/apply" - "github.com/cloudogu/k8s-component-operator/pkg/mocks/external" - "github.com/stretchr/testify/require" "os" "testing" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" - ctrl "sigs.k8s.io/controller-runtime" + "github.com/stretchr/testify/require" - "github.com/cloudogu/cesapp-lib/core" + "github.com/cloudogu/k8s-apply-lib/apply" + "github.com/cloudogu/k8s-component-operator/pkg/mocks/external" ) func TestConfigureLogger(t *testing.T) { - originalControllerLogger := ctrl.Log - originalLibraryLogger := core.GetLogger() - defer func() { - ctrl.Log = originalControllerLogger - core.GetLogger = func() core.Logger { - return originalLibraryLogger - } - }() - t.Run("create logger with no log level set in env -> should use default", func(t *testing.T) { // given _ = os.Unsetenv(logLevelEnvVar) @@ -47,18 +36,6 @@ func TestConfigureLogger(t *testing.T) { assert.Equal(t, logrus.ErrorLevel, CurrentLogLevel) }) - t.Run("create logger with log level INFO", func(t *testing.T) { - // given - _ = os.Setenv(logLevelEnvVar, "INFO") - - // when - err := ConfigureLogger() - - // then - core.GetLogger().Info("test") - assert.NoError(t, err) - }) - t.Run("create logger with invalid log level TEST_LEVEL", func(t *testing.T) { // given _ = os.Setenv(logLevelEnvVar, "TEST_LEVEL") @@ -71,24 +48,6 @@ func TestConfigureLogger(t *testing.T) { assert.ErrorContains(t, err, "value of log environment variable [LOG_LEVEL] is not a valid log level") }) - t.Run("should set library logger for core", func(t *testing.T) { - // given - _ = os.Setenv(logLevelEnvVar, "") - - // when - err := ConfigureLogger() - coreLogger := core.GetLogger() - - // then - require.NoError(t, err) - require.NotNil(t, coreLogger) - - libLogger, ok := coreLogger.(*libraryLogger) - require.True(t, ok) - - assert.Equal(t, "cesapp-lib", libLogger.name) - }) - t.Run("should set library logger for apply", func(t *testing.T) { // given _ = os.Setenv(logLevelEnvVar, "") From d87ea0684b16be2b87a0a18255937f5c9be4b6f5 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Thu, 24 Aug 2023 14:49:30 +0200 Subject: [PATCH 39/47] #15 replace data interface with struct Co-authored-by: Philipp Pixel --- go.mod | 1 - go.sum | 4 - k8s/helm-repository.yaml | 2 +- main.go | 4 +- pkg/config/config.go | 82 ++++--- pkg/config/config_test.go | 206 +++++++++--------- .../mock_configMapInterface_test.go} | 164 +++++++------- pkg/config/testdata/helm-repository.yaml | 2 +- pkg/helm/client.go | 47 ++-- pkg/helm/client_test.go | 86 ++------ pkg/helm/mock_ociRepositoryConfig_test.go | 125 ----------- 11 files changed, 275 insertions(+), 448 deletions(-) rename pkg/{mocks/external/ConfigMapInterface.go => config/mock_configMapInterface_test.go} (64%) delete mode 100644 pkg/helm/mock_ociRepositoryConfig_test.go diff --git a/go.mod b/go.mod index 6625ae1..29ba6de 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,6 @@ require ( github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/eapache/go-resiliency v1.4.0 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect diff --git a/go.sum b/go.sum index 07f0c23..3e3c9c9 100644 --- a/go.sum +++ b/go.sum @@ -45,8 +45,6 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR 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/cloudogu/cesapp-lib v0.12.0 h1:+yRVk65DljGtJj/gNpgBRhvIJHfGy7kr4/iEw1LJugg= -github.com/cloudogu/cesapp-lib v0.12.0/go.mod h1:PTQqI3xs1ReJMXYE6BGTF33yAfmS4J7P8UiE4AwDMDY= github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d h1:wORDIdIYkMpsHrNUXbyhllPYpM8fbXIYqv0jvrcIj6I= github.com/cloudogu/go-helm-client v0.0.0-20230822080918-4b3b24282d0d/go.mod h1:b1jCbr7z27zWDtVPp3IjXDMwe7GrHxg/L8jOC5jW9Ls= github.com/cloudogu/k8s-apply-lib v0.4.2 h1:D5hTYvIZya+tAyGCUGaZ1T83otvpQwzrZXz5JPHQQ5M= @@ -80,8 +78,6 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= -github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= -github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= diff --git a/k8s/helm-repository.yaml b/k8s/helm-repository.yaml index 134ab38..681838d 100644 --- a/k8s/helm-repository.yaml +++ b/k8s/helm-repository.yaml @@ -1 +1 @@ -endpoint: http://192.168.56.3:30100 \ No newline at end of file +endpoint: oci://192.168.56.3:30100 \ No newline at end of file diff --git a/main.go b/main.go index 056a8ad..73786be 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "flag" "fmt" "github.com/cloudogu/k8s-component-operator/pkg/api/ecosystem" @@ -133,7 +134,8 @@ func configureReconciler(k8sManager manager.Manager, operatorConfig *config.Oper return fmt.Errorf("failed to create clientset: %w", err) } - helmRepoData, err := config.GetHelmRepositoryData(clientSet.CoreV1().ConfigMaps(operatorConfig.Namespace)) + ctx := context.Background() + helmRepoData, err := config.GetHelmRepositoryData(ctx, clientSet.CoreV1().ConfigMaps(operatorConfig.Namespace)) if err != nil { return err } diff --git a/pkg/config/config.go b/pkg/config/config.go index b75c144..97e0851 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -9,7 +9,6 @@ import ( "github.com/Masterminds/semver/v3" "gopkg.in/yaml.v3" - "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" ctrl "sigs.k8s.io/controller-runtime" @@ -40,6 +39,14 @@ var ( log = ctrl.Log.WithName("config") ) +type EndpointSchema string + +const EndpointSchemaOCI EndpointSchema = "oci" + +type configMapInterface interface { + corev1.ConfigMapInterface +} + // HelmRepositoryData contains all necessary data for the helm repository. type HelmRepositoryData struct { // Endpoint contains the Helm registry endpoint URL. @@ -48,21 +55,30 @@ type HelmRepositoryData struct { PlainHttp bool `json:"plainHttp,omitempty" yaml:"plainHttp,omitempty"` } -// GetOciEndpoint returns the configured endpoint of the HelmRepositoryData with the OCI-protocol -func (hrd *HelmRepositoryData) GetOciEndpoint() (string, error) { - split := strings.Split(hrd.Endpoint, "://") - if len(split) == 1 && split[0] != "" { - return fmt.Sprintf("oci://%s", split[0]), nil +func (hrd *HelmRepositoryData) validate() error { + parts := strings.Split(hrd.Endpoint, "://") + + if len(parts) != 2 { + return fmt.Errorf("endpoint is not formatted as ://") } - if len(split) == 2 && split[1] != "" { - return fmt.Sprintf("oci://%s", split[1]), nil + + schema := parts[0] + url := parts[1] + + if url == "" { + return fmt.Errorf("endpoint url must not be empty") + } + + if EndpointSchema(schema) != EndpointSchemaOCI { + return fmt.Errorf("endpoint uses an unsupported schema '%s': valid schemas are: oci", schema) } - return "", fmt.Errorf("error creating oci-endpoint from '%s': wrong format", hrd.Endpoint) + return nil } -func (hrd *HelmRepositoryData) IsPlainHttp() bool { - return hrd.PlainHttp +func (hrd *HelmRepositoryData) EndpointSchema() EndpointSchema { + parts := strings.Split(hrd.Endpoint, "://") + return EndpointSchema(parts[0]) } // OperatorConfig contains all configurable values for the dogu operator. @@ -106,24 +122,22 @@ func NewOperatorConfig(version string) (*OperatorConfig, error) { } // GetHelmRepositoryData reads the repository data either from file or from a secret in the cluster. -func GetHelmRepositoryData(configMapClient corev1.ConfigMapInterface) (*HelmRepositoryData, error) { +func GetHelmRepositoryData(ctx context.Context, configMapClient configMapInterface) (*HelmRepositoryData, error) { runtime, err := getEnvVar(runtimeEnvironmentVariable) if err != nil { log.Info("Runtime env var not found.") } if runtime == runtimeLocal { - return getHelmRepositoryDataFromFile() + return NewHelmRepoDataFromFile(devHelmRepoDataPath) } - return getHelmRepositoryFromConfigMap(configMapClient) + return NewHelmRepoDataFromCluster(ctx, configMapClient) } -func getHelmRepositoryFromConfigMap(configMapClient corev1.ConfigMapInterface) (*HelmRepositoryData, error) { - configMap, err := configMapClient.Get(context.TODO(), helmRepositoryConfigMapName, metav1.GetOptions{}) - if errors.IsNotFound(err) { - return nil, fmt.Errorf("helm repository configMap %s not found: %w", helmRepositoryConfigMapName, err) - } +// NewHelmRepoDataFromCluster reads the repo data ConfigMap, validates and returns it. +func NewHelmRepoDataFromCluster(ctx context.Context, configMapClient configMapInterface) (*HelmRepositoryData, error) { + configMap, err := configMapClient.Get(ctx, helmRepositoryConfigMapName, metav1.GetOptions{}) if err != nil { return nil, fmt.Errorf("failed to get helm repository configMap %s: %w", helmRepositoryConfigMapName, err) } @@ -137,29 +151,37 @@ func getHelmRepositoryFromConfigMap(configMapClient corev1.ConfigMapInterface) ( } } - return &HelmRepositoryData{ + repoData := &HelmRepositoryData{ Endpoint: configMap.Data["endpoint"], PlainHttp: plainHttp, - }, nil + } + + err = repoData.validate() + if err != nil { + return nil, fmt.Errorf("config map '%s' failed validation: %w", helmRepositoryConfigMapName, err) + } + + return repoData, nil } -func getHelmRepositoryDataFromFile() (*HelmRepositoryData, error) { - data := &HelmRepositoryData{} - if _, err := os.Stat(devHelmRepoDataPath); os.IsNotExist(err) { - return data, fmt.Errorf("could not find configuration at %s", devHelmRepoDataPath) +func NewHelmRepoDataFromFile(filepath string) (*HelmRepositoryData, error) { + fileBytes, err := os.ReadFile(filepath) + if err != nil { + return nil, fmt.Errorf("failed to read configuration %s: %w", filepath, err) } - fileData, err := os.ReadFile(devHelmRepoDataPath) + repoData := &HelmRepositoryData{} + err = yaml.Unmarshal(fileBytes, repoData) if err != nil { - return data, fmt.Errorf("failed to read configuration %s: %w", devHelmRepoDataPath, err) + return nil, fmt.Errorf("failed to unmarshal configuration %s: %w", filepath, err) } - err = yaml.Unmarshal(fileData, data) + err = repoData.validate() if err != nil { - return data, fmt.Errorf("failed to unmarshal configuration %s: %w", devHelmRepoDataPath, err) + return nil, fmt.Errorf("helm repository data from file '%s' failed validation: %w", fileBytes, err) } - return data, nil + return repoData, nil } func readNamespace() (string, error) { diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 0f1fc98..f6a02c6 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -1,20 +1,20 @@ package config import ( + "context" "fmt" - "github.com/cloudogu/k8s-component-operator/pkg/mocks/external" - "github.com/stretchr/testify/mock" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" "os" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var testCtx = context.Background() + func TestNewOperatorConfig(t *testing.T) { _ = os.Unsetenv("NAMESPACE") @@ -43,184 +43,176 @@ func TestNewOperatorConfig(t *testing.T) { } func TestGetHelmRepositoryData(t *testing.T) { - t.Setenv("RUNTIME", "local") t.Run("success from file", func(t *testing.T) { // given + t.Setenv("RUNTIME", "local") devHelmRepoDataPath = "testdata/helm-repository.yaml" expected := &HelmRepositoryData{ - Endpoint: "http://192.168.56.3:30100", + Endpoint: "oci://192.168.56.3:30100", PlainHttp: true, } // when - result, err := GetHelmRepositoryData(nil) + result, err := GetHelmRepositoryData(testCtx, nil) // then require.NoError(t, err) assert.Equal(t, expected, result) }) - - t.Run("should throw error because the file does not exists", func(t *testing.T) { - // given - devHelmRepoDataPath = "testdata/ne.yaml" - - // when - _, err := GetHelmRepositoryData(nil) - - // then - require.Error(t, err) - assert.ErrorContains(t, err, "could not find configuration at") - }) - - t.Run("should throw error because wrong yaml format", func(t *testing.T) { - // given - devHelmRepoDataPath = "testdata/invalid-helm-repository.yaml" - - // when - _, err := GetHelmRepositoryData(nil) - - // then - require.Error(t, err) - assert.ErrorContains(t, err, "failed to unmarshal configuration") - }) - - require.NoError(t, os.Unsetenv("RUNTIME")) t.Run("success with cluster", func(t *testing.T) { // given - mockConfigMapInterface := external.NewMockConfigMapInterface(t) + mockConfigMapInterface := newMockConfigMapInterface(t) configMap := &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{Name: "component-operator-helm-repository"}, - Data: map[string]string{"endpoint": "endpoint", "plainHttp": "false"}, + Data: map[string]string{"endpoint": "oci://endpoint", "plainHttp": "false"}, } mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(configMap, nil) expected := &HelmRepositoryData{ - Endpoint: "endpoint", + Endpoint: "oci://endpoint", PlainHttp: false, } // when - result, err := GetHelmRepositoryData(mockConfigMapInterface) + result, err := GetHelmRepositoryData(testCtx, mockConfigMapInterface) // then require.NoError(t, err) assert.Equal(t, expected, result) }) +} - t.Run("success with plainHttp not existing", func(t *testing.T) { +func TestNewHelmRepoDataFromCluster(t *testing.T) { + getOpts := metav1.GetOptions{} + t.Run("should fail on getting config map", func(t *testing.T) { // given - mockConfigMapInterface := external.NewMockConfigMapInterface(t) - configMap := &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: "component-operator-helm-repository"}, - Data: map[string]string{"endpoint": "endpoint"}, - } - mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(configMap, nil) - expected := &HelmRepositoryData{ - Endpoint: "endpoint", - PlainHttp: false, - } + configMapClient := newMockConfigMapInterface(t) + configMapClient.EXPECT().Get(testCtx, "component-operator-helm-repository", getOpts).Return(nil, assert.AnError) // when - result, err := GetHelmRepositoryData(mockConfigMapInterface) + _, err := NewHelmRepoDataFromCluster(testCtx, configMapClient) // then - require.NoError(t, err) - assert.Equal(t, expected, result) + require.Error(t, err) + assert.ErrorIs(t, err, assert.AnError) + assert.ErrorContains(t, err, "failed to get helm repository configMap component-operator-helm-repository") }) - t.Run("should fail to parse plainHttp", func(t *testing.T) { // given - mockConfigMapInterface := external.NewMockConfigMapInterface(t) - configMap := &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{Name: "component-operator-helm-repository"}, - Data: map[string]string{"endpoint": "endpoint", "plainHttp": "not-a-bool"}, - } - mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(configMap, nil) + configMap := &v1.ConfigMap{Data: map[string]string{"plainHttp": "invalid"}} + configMapClient := newMockConfigMapInterface(t) + configMapClient.EXPECT().Get(testCtx, "component-operator-helm-repository", getOpts).Return(configMap, nil) // when - _, err := GetHelmRepositoryData(mockConfigMapInterface) + _, err := NewHelmRepoDataFromCluster(testCtx, configMapClient) // then require.Error(t, err) assert.ErrorContains(t, err, "failed to parse field plainHttp from configMap component-operator-helm-repository") }) - - t.Run("should return not found error if no secret was found", func(t *testing.T) { + t.Run("should fail because endpoint has invalid format", func(t *testing.T) { // given - mockConfigMapInterface := external.NewMockConfigMapInterface(t) - notFoundError := errors.NewNotFound(schema.GroupResource{}, "") - mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(nil, notFoundError) + configMap := &v1.ConfigMap{Data: map[string]string{"endpoint": "invalid"}} + configMapClient := newMockConfigMapInterface(t) + configMapClient.EXPECT().Get(testCtx, "component-operator-helm-repository", getOpts).Return(configMap, nil) // when - _, err := GetHelmRepositoryData(mockConfigMapInterface) + _, err := NewHelmRepoDataFromCluster(testCtx, configMapClient) // then require.Error(t, err) - assert.ErrorContains(t, err, "helm repository configMap component-operator-helm-repository not found") + assert.ErrorContains(t, err, "config map 'component-operator-helm-repository' failed validation: endpoint is not formatted as ://") }) + t.Run("should fail because endpoint has empty URL", func(t *testing.T) { + // given + configMap := &v1.ConfigMap{Data: map[string]string{"endpoint": "oci://"}} + configMapClient := newMockConfigMapInterface(t) + configMapClient.EXPECT().Get(testCtx, "component-operator-helm-repository", getOpts).Return(configMap, nil) + + // when + _, err := NewHelmRepoDataFromCluster(testCtx, configMapClient) - t.Run("should return error on failed get", func(t *testing.T) { + // then + require.Error(t, err) + assert.ErrorContains(t, err, "config map 'component-operator-helm-repository' failed validation: endpoint url must not be empty") + }) + t.Run("should fail because endpoint schema is not oci", func(t *testing.T) { // given - mockConfigMapInterface := external.NewMockConfigMapInterface(t) - mockConfigMapInterface.On("Get", mock.Anything, "component-operator-helm-repository", mock.Anything).Return(nil, assert.AnError) + configMap := &v1.ConfigMap{Data: map[string]string{"endpoint": "https://myEndpoint"}} + configMapClient := newMockConfigMapInterface(t) + configMapClient.EXPECT().Get(testCtx, "component-operator-helm-repository", getOpts).Return(configMap, nil) // when - _, err := GetHelmRepositoryData(mockConfigMapInterface) + _, err := NewHelmRepoDataFromCluster(testCtx, configMapClient) // then require.Error(t, err) - require.ErrorIs(t, err, assert.AnError) - assert.ErrorContains(t, err, "failed to get helm repository configMap") + assert.ErrorContains(t, err, "config map 'component-operator-helm-repository' failed validation: endpoint uses an unsupported schema 'https': valid schemas are: oci") + }) + t.Run("should succeed to parse plainHttp and validate endpoint", func(t *testing.T) { + // given + configMap := &v1.ConfigMap{Data: map[string]string{"endpoint": "oci://myEndpoint", "plainHttp": "true"}} + configMapClient := newMockConfigMapInterface(t) + configMapClient.EXPECT().Get(testCtx, "component-operator-helm-repository", getOpts).Return(configMap, nil) + + // when + actual, err := NewHelmRepoDataFromCluster(testCtx, configMapClient) + + // then + expected := &HelmRepositoryData{ + Endpoint: "oci://myEndpoint", + PlainHttp: true, + } + require.NoError(t, err) + assert.Equal(t, expected, actual) }) } -func TestHelmRepositoryData_GetOciEndpoint(t *testing.T) { +func TestHelmRepositoryData_EndpointSchema(t *testing.T) { + sut := &HelmRepositoryData{Endpoint: "oci://myEndpoint"} + assert.Equal(t, EndpointSchema("oci"), sut.EndpointSchema()) +} + +func TestNewHelmRepoDataFromFile(t *testing.T) { tests := []struct { name string - Endpoint string - want string + filepath string + want *HelmRepositoryData wantErr assert.ErrorAssertionFunc }{ { - name: "success getOciEndpoint", - Endpoint: "https://staging-registry.cloudogu.com", - want: "oci://staging-registry.cloudogu.com", - wantErr: assert.NoError, - }, - { - name: "success getOciEndpoint with Path", - Endpoint: "https://staging-registry.cloudogu.com/foo/bar", - want: "oci://staging-registry.cloudogu.com/foo/bar", - wantErr: assert.NoError, - }, - { - name: "success getOciEndpoint with other protocol", - Endpoint: "ftp://staging-registry.cloudogu.com", - want: "oci://staging-registry.cloudogu.com", - wantErr: assert.NoError, + name: "should not find file", + filepath: "not-exist", + want: nil, + wantErr: func(t assert.TestingT, err error, _ ...interface{}) bool { + return assert.ErrorContains(t, err, "failed to read configuration not-exist") && + assert.ErrorContains(t, err, "no such file") + }, }, { - name: "success no protocol", - Endpoint: "staging-registry.cloudogu.com", - want: "oci://staging-registry.cloudogu.com", - wantErr: assert.NoError, + name: "should fail to unmarshal yaml", + filepath: "testdata/invalid-helm-repository.yaml", + want: nil, + wantErr: func(t assert.TestingT, err error, _ ...interface{}) bool { + return assert.ErrorContains(t, err, "failed to unmarshal configuration testdata/invalid-helm-repository.yaml") + }, }, { - name: "error empty string", - Endpoint: "", - want: "", - wantErr: assert.Error, + name: "should succeed", + filepath: "testdata/helm-repository.yaml", + want: &HelmRepositoryData{ + Endpoint: "oci://192.168.56.3:30100", + PlainHttp: true, + }, + wantErr: assert.NoError, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - hrd := &HelmRepositoryData{ - Endpoint: tt.Endpoint, - } - got, err := hrd.GetOciEndpoint() - if !tt.wantErr(t, err, fmt.Sprintf("GetOciEndpoint()")) { + got, err := NewHelmRepoDataFromFile(tt.filepath) + if !tt.wantErr(t, err, fmt.Sprintf("NewHelmRepoDataFromFile(%v)", tt.filepath)) { return } - assert.Equalf(t, tt.want, got, "GetOciEndpoint()") + assert.Equalf(t, tt.want, got, "NewHelmRepoDataFromFile(%v)", tt.filepath) }) } } diff --git a/pkg/mocks/external/ConfigMapInterface.go b/pkg/config/mock_configMapInterface_test.go similarity index 64% rename from pkg/mocks/external/ConfigMapInterface.go rename to pkg/config/mock_configMapInterface_test.go index 6301f82..e8ff214 100644 --- a/pkg/mocks/external/ConfigMapInterface.go +++ b/pkg/config/mock_configMapInterface_test.go @@ -1,6 +1,6 @@ // Code generated by mockery v2.20.0. DO NOT EDIT. -package external +package config import ( context "context" @@ -18,21 +18,21 @@ import ( watch "k8s.io/apimachinery/pkg/watch" ) -// MockConfigMapInterface is an autogenerated mock type for the ConfigMapInterface type -type MockConfigMapInterface struct { +// mockConfigMapInterface is an autogenerated mock type for the configMapInterface type +type mockConfigMapInterface struct { mock.Mock } -type MockConfigMapInterface_Expecter struct { +type mockConfigMapInterface_Expecter struct { mock *mock.Mock } -func (_m *MockConfigMapInterface) EXPECT() *MockConfigMapInterface_Expecter { - return &MockConfigMapInterface_Expecter{mock: &_m.Mock} +func (_m *mockConfigMapInterface) EXPECT() *mockConfigMapInterface_Expecter { + return &mockConfigMapInterface_Expecter{mock: &_m.Mock} } // Apply provides a mock function with given fields: ctx, configMap, opts -func (_m *MockConfigMapInterface) Apply(ctx context.Context, configMap *v1.ConfigMapApplyConfiguration, opts metav1.ApplyOptions) (*corev1.ConfigMap, error) { +func (_m *mockConfigMapInterface) Apply(ctx context.Context, configMap *v1.ConfigMapApplyConfiguration, opts metav1.ApplyOptions) (*corev1.ConfigMap, error) { ret := _m.Called(ctx, configMap, opts) var r0 *corev1.ConfigMap @@ -57,8 +57,8 @@ func (_m *MockConfigMapInterface) Apply(ctx context.Context, configMap *v1.Confi return r0, r1 } -// MockConfigMapInterface_Apply_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Apply' -type MockConfigMapInterface_Apply_Call struct { +// mockConfigMapInterface_Apply_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Apply' +type mockConfigMapInterface_Apply_Call struct { *mock.Call } @@ -66,29 +66,29 @@ type MockConfigMapInterface_Apply_Call struct { // - ctx context.Context // - configMap *v1.ConfigMapApplyConfiguration // - opts metav1.ApplyOptions -func (_e *MockConfigMapInterface_Expecter) Apply(ctx interface{}, configMap interface{}, opts interface{}) *MockConfigMapInterface_Apply_Call { - return &MockConfigMapInterface_Apply_Call{Call: _e.mock.On("Apply", ctx, configMap, opts)} +func (_e *mockConfigMapInterface_Expecter) Apply(ctx interface{}, configMap interface{}, opts interface{}) *mockConfigMapInterface_Apply_Call { + return &mockConfigMapInterface_Apply_Call{Call: _e.mock.On("Apply", ctx, configMap, opts)} } -func (_c *MockConfigMapInterface_Apply_Call) Run(run func(ctx context.Context, configMap *v1.ConfigMapApplyConfiguration, opts metav1.ApplyOptions)) *MockConfigMapInterface_Apply_Call { +func (_c *mockConfigMapInterface_Apply_Call) Run(run func(ctx context.Context, configMap *v1.ConfigMapApplyConfiguration, opts metav1.ApplyOptions)) *mockConfigMapInterface_Apply_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*v1.ConfigMapApplyConfiguration), args[2].(metav1.ApplyOptions)) }) return _c } -func (_c *MockConfigMapInterface_Apply_Call) Return(result *corev1.ConfigMap, err error) *MockConfigMapInterface_Apply_Call { +func (_c *mockConfigMapInterface_Apply_Call) Return(result *corev1.ConfigMap, err error) *mockConfigMapInterface_Apply_Call { _c.Call.Return(result, err) return _c } -func (_c *MockConfigMapInterface_Apply_Call) RunAndReturn(run func(context.Context, *v1.ConfigMapApplyConfiguration, metav1.ApplyOptions) (*corev1.ConfigMap, error)) *MockConfigMapInterface_Apply_Call { +func (_c *mockConfigMapInterface_Apply_Call) RunAndReturn(run func(context.Context, *v1.ConfigMapApplyConfiguration, metav1.ApplyOptions) (*corev1.ConfigMap, error)) *mockConfigMapInterface_Apply_Call { _c.Call.Return(run) return _c } // Create provides a mock function with given fields: ctx, configMap, opts -func (_m *MockConfigMapInterface) Create(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.CreateOptions) (*corev1.ConfigMap, error) { +func (_m *mockConfigMapInterface) Create(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.CreateOptions) (*corev1.ConfigMap, error) { ret := _m.Called(ctx, configMap, opts) var r0 *corev1.ConfigMap @@ -113,8 +113,8 @@ func (_m *MockConfigMapInterface) Create(ctx context.Context, configMap *corev1. return r0, r1 } -// MockConfigMapInterface_Create_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Create' -type MockConfigMapInterface_Create_Call struct { +// mockConfigMapInterface_Create_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Create' +type mockConfigMapInterface_Create_Call struct { *mock.Call } @@ -122,29 +122,29 @@ type MockConfigMapInterface_Create_Call struct { // - ctx context.Context // - configMap *corev1.ConfigMap // - opts metav1.CreateOptions -func (_e *MockConfigMapInterface_Expecter) Create(ctx interface{}, configMap interface{}, opts interface{}) *MockConfigMapInterface_Create_Call { - return &MockConfigMapInterface_Create_Call{Call: _e.mock.On("Create", ctx, configMap, opts)} +func (_e *mockConfigMapInterface_Expecter) Create(ctx interface{}, configMap interface{}, opts interface{}) *mockConfigMapInterface_Create_Call { + return &mockConfigMapInterface_Create_Call{Call: _e.mock.On("Create", ctx, configMap, opts)} } -func (_c *MockConfigMapInterface_Create_Call) Run(run func(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.CreateOptions)) *MockConfigMapInterface_Create_Call { +func (_c *mockConfigMapInterface_Create_Call) Run(run func(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.CreateOptions)) *mockConfigMapInterface_Create_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*corev1.ConfigMap), args[2].(metav1.CreateOptions)) }) return _c } -func (_c *MockConfigMapInterface_Create_Call) Return(_a0 *corev1.ConfigMap, _a1 error) *MockConfigMapInterface_Create_Call { +func (_c *mockConfigMapInterface_Create_Call) Return(_a0 *corev1.ConfigMap, _a1 error) *mockConfigMapInterface_Create_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *MockConfigMapInterface_Create_Call) RunAndReturn(run func(context.Context, *corev1.ConfigMap, metav1.CreateOptions) (*corev1.ConfigMap, error)) *MockConfigMapInterface_Create_Call { +func (_c *mockConfigMapInterface_Create_Call) RunAndReturn(run func(context.Context, *corev1.ConfigMap, metav1.CreateOptions) (*corev1.ConfigMap, error)) *mockConfigMapInterface_Create_Call { _c.Call.Return(run) return _c } // Delete provides a mock function with given fields: ctx, name, opts -func (_m *MockConfigMapInterface) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { +func (_m *mockConfigMapInterface) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { ret := _m.Called(ctx, name, opts) var r0 error @@ -157,8 +157,8 @@ func (_m *MockConfigMapInterface) Delete(ctx context.Context, name string, opts return r0 } -// MockConfigMapInterface_Delete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Delete' -type MockConfigMapInterface_Delete_Call struct { +// mockConfigMapInterface_Delete_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Delete' +type mockConfigMapInterface_Delete_Call struct { *mock.Call } @@ -166,29 +166,29 @@ type MockConfigMapInterface_Delete_Call struct { // - ctx context.Context // - name string // - opts metav1.DeleteOptions -func (_e *MockConfigMapInterface_Expecter) Delete(ctx interface{}, name interface{}, opts interface{}) *MockConfigMapInterface_Delete_Call { - return &MockConfigMapInterface_Delete_Call{Call: _e.mock.On("Delete", ctx, name, opts)} +func (_e *mockConfigMapInterface_Expecter) Delete(ctx interface{}, name interface{}, opts interface{}) *mockConfigMapInterface_Delete_Call { + return &mockConfigMapInterface_Delete_Call{Call: _e.mock.On("Delete", ctx, name, opts)} } -func (_c *MockConfigMapInterface_Delete_Call) Run(run func(ctx context.Context, name string, opts metav1.DeleteOptions)) *MockConfigMapInterface_Delete_Call { +func (_c *mockConfigMapInterface_Delete_Call) Run(run func(ctx context.Context, name string, opts metav1.DeleteOptions)) *mockConfigMapInterface_Delete_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(string), args[2].(metav1.DeleteOptions)) }) return _c } -func (_c *MockConfigMapInterface_Delete_Call) Return(_a0 error) *MockConfigMapInterface_Delete_Call { +func (_c *mockConfigMapInterface_Delete_Call) Return(_a0 error) *mockConfigMapInterface_Delete_Call { _c.Call.Return(_a0) return _c } -func (_c *MockConfigMapInterface_Delete_Call) RunAndReturn(run func(context.Context, string, metav1.DeleteOptions) error) *MockConfigMapInterface_Delete_Call { +func (_c *mockConfigMapInterface_Delete_Call) RunAndReturn(run func(context.Context, string, metav1.DeleteOptions) error) *mockConfigMapInterface_Delete_Call { _c.Call.Return(run) return _c } // DeleteCollection provides a mock function with given fields: ctx, opts, listOpts -func (_m *MockConfigMapInterface) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { +func (_m *mockConfigMapInterface) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { ret := _m.Called(ctx, opts, listOpts) var r0 error @@ -201,8 +201,8 @@ func (_m *MockConfigMapInterface) DeleteCollection(ctx context.Context, opts met return r0 } -// MockConfigMapInterface_DeleteCollection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteCollection' -type MockConfigMapInterface_DeleteCollection_Call struct { +// mockConfigMapInterface_DeleteCollection_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteCollection' +type mockConfigMapInterface_DeleteCollection_Call struct { *mock.Call } @@ -210,29 +210,29 @@ type MockConfigMapInterface_DeleteCollection_Call struct { // - ctx context.Context // - opts metav1.DeleteOptions // - listOpts metav1.ListOptions -func (_e *MockConfigMapInterface_Expecter) DeleteCollection(ctx interface{}, opts interface{}, listOpts interface{}) *MockConfigMapInterface_DeleteCollection_Call { - return &MockConfigMapInterface_DeleteCollection_Call{Call: _e.mock.On("DeleteCollection", ctx, opts, listOpts)} +func (_e *mockConfigMapInterface_Expecter) DeleteCollection(ctx interface{}, opts interface{}, listOpts interface{}) *mockConfigMapInterface_DeleteCollection_Call { + return &mockConfigMapInterface_DeleteCollection_Call{Call: _e.mock.On("DeleteCollection", ctx, opts, listOpts)} } -func (_c *MockConfigMapInterface_DeleteCollection_Call) Run(run func(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions)) *MockConfigMapInterface_DeleteCollection_Call { +func (_c *mockConfigMapInterface_DeleteCollection_Call) Run(run func(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions)) *mockConfigMapInterface_DeleteCollection_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(metav1.DeleteOptions), args[2].(metav1.ListOptions)) }) return _c } -func (_c *MockConfigMapInterface_DeleteCollection_Call) Return(_a0 error) *MockConfigMapInterface_DeleteCollection_Call { +func (_c *mockConfigMapInterface_DeleteCollection_Call) Return(_a0 error) *mockConfigMapInterface_DeleteCollection_Call { _c.Call.Return(_a0) return _c } -func (_c *MockConfigMapInterface_DeleteCollection_Call) RunAndReturn(run func(context.Context, metav1.DeleteOptions, metav1.ListOptions) error) *MockConfigMapInterface_DeleteCollection_Call { +func (_c *mockConfigMapInterface_DeleteCollection_Call) RunAndReturn(run func(context.Context, metav1.DeleteOptions, metav1.ListOptions) error) *mockConfigMapInterface_DeleteCollection_Call { _c.Call.Return(run) return _c } // Get provides a mock function with given fields: ctx, name, opts -func (_m *MockConfigMapInterface) Get(ctx context.Context, name string, opts metav1.GetOptions) (*corev1.ConfigMap, error) { +func (_m *mockConfigMapInterface) Get(ctx context.Context, name string, opts metav1.GetOptions) (*corev1.ConfigMap, error) { ret := _m.Called(ctx, name, opts) var r0 *corev1.ConfigMap @@ -257,8 +257,8 @@ func (_m *MockConfigMapInterface) Get(ctx context.Context, name string, opts met return r0, r1 } -// MockConfigMapInterface_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' -type MockConfigMapInterface_Get_Call struct { +// mockConfigMapInterface_Get_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Get' +type mockConfigMapInterface_Get_Call struct { *mock.Call } @@ -266,29 +266,29 @@ type MockConfigMapInterface_Get_Call struct { // - ctx context.Context // - name string // - opts metav1.GetOptions -func (_e *MockConfigMapInterface_Expecter) Get(ctx interface{}, name interface{}, opts interface{}) *MockConfigMapInterface_Get_Call { - return &MockConfigMapInterface_Get_Call{Call: _e.mock.On("Get", ctx, name, opts)} +func (_e *mockConfigMapInterface_Expecter) Get(ctx interface{}, name interface{}, opts interface{}) *mockConfigMapInterface_Get_Call { + return &mockConfigMapInterface_Get_Call{Call: _e.mock.On("Get", ctx, name, opts)} } -func (_c *MockConfigMapInterface_Get_Call) Run(run func(ctx context.Context, name string, opts metav1.GetOptions)) *MockConfigMapInterface_Get_Call { +func (_c *mockConfigMapInterface_Get_Call) Run(run func(ctx context.Context, name string, opts metav1.GetOptions)) *mockConfigMapInterface_Get_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(string), args[2].(metav1.GetOptions)) }) return _c } -func (_c *MockConfigMapInterface_Get_Call) Return(_a0 *corev1.ConfigMap, _a1 error) *MockConfigMapInterface_Get_Call { +func (_c *mockConfigMapInterface_Get_Call) Return(_a0 *corev1.ConfigMap, _a1 error) *mockConfigMapInterface_Get_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *MockConfigMapInterface_Get_Call) RunAndReturn(run func(context.Context, string, metav1.GetOptions) (*corev1.ConfigMap, error)) *MockConfigMapInterface_Get_Call { +func (_c *mockConfigMapInterface_Get_Call) RunAndReturn(run func(context.Context, string, metav1.GetOptions) (*corev1.ConfigMap, error)) *mockConfigMapInterface_Get_Call { _c.Call.Return(run) return _c } // List provides a mock function with given fields: ctx, opts -func (_m *MockConfigMapInterface) List(ctx context.Context, opts metav1.ListOptions) (*corev1.ConfigMapList, error) { +func (_m *mockConfigMapInterface) List(ctx context.Context, opts metav1.ListOptions) (*corev1.ConfigMapList, error) { ret := _m.Called(ctx, opts) var r0 *corev1.ConfigMapList @@ -313,37 +313,37 @@ func (_m *MockConfigMapInterface) List(ctx context.Context, opts metav1.ListOpti return r0, r1 } -// MockConfigMapInterface_List_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'List' -type MockConfigMapInterface_List_Call struct { +// mockConfigMapInterface_List_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'List' +type mockConfigMapInterface_List_Call struct { *mock.Call } // List is a helper method to define mock.On call // - ctx context.Context // - opts metav1.ListOptions -func (_e *MockConfigMapInterface_Expecter) List(ctx interface{}, opts interface{}) *MockConfigMapInterface_List_Call { - return &MockConfigMapInterface_List_Call{Call: _e.mock.On("List", ctx, opts)} +func (_e *mockConfigMapInterface_Expecter) List(ctx interface{}, opts interface{}) *mockConfigMapInterface_List_Call { + return &mockConfigMapInterface_List_Call{Call: _e.mock.On("List", ctx, opts)} } -func (_c *MockConfigMapInterface_List_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *MockConfigMapInterface_List_Call { +func (_c *mockConfigMapInterface_List_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *mockConfigMapInterface_List_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(metav1.ListOptions)) }) return _c } -func (_c *MockConfigMapInterface_List_Call) Return(_a0 *corev1.ConfigMapList, _a1 error) *MockConfigMapInterface_List_Call { +func (_c *mockConfigMapInterface_List_Call) Return(_a0 *corev1.ConfigMapList, _a1 error) *mockConfigMapInterface_List_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *MockConfigMapInterface_List_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (*corev1.ConfigMapList, error)) *MockConfigMapInterface_List_Call { +func (_c *mockConfigMapInterface_List_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (*corev1.ConfigMapList, error)) *mockConfigMapInterface_List_Call { _c.Call.Return(run) return _c } // Patch provides a mock function with given fields: ctx, name, pt, data, opts, subresources -func (_m *MockConfigMapInterface) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*corev1.ConfigMap, error) { +func (_m *mockConfigMapInterface) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*corev1.ConfigMap, error) { _va := make([]interface{}, len(subresources)) for _i := range subresources { _va[_i] = subresources[_i] @@ -375,8 +375,8 @@ func (_m *MockConfigMapInterface) Patch(ctx context.Context, name string, pt typ return r0, r1 } -// MockConfigMapInterface_Patch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Patch' -type MockConfigMapInterface_Patch_Call struct { +// mockConfigMapInterface_Patch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Patch' +type mockConfigMapInterface_Patch_Call struct { *mock.Call } @@ -387,12 +387,12 @@ type MockConfigMapInterface_Patch_Call struct { // - data []byte // - opts metav1.PatchOptions // - subresources ...string -func (_e *MockConfigMapInterface_Expecter) Patch(ctx interface{}, name interface{}, pt interface{}, data interface{}, opts interface{}, subresources ...interface{}) *MockConfigMapInterface_Patch_Call { - return &MockConfigMapInterface_Patch_Call{Call: _e.mock.On("Patch", +func (_e *mockConfigMapInterface_Expecter) Patch(ctx interface{}, name interface{}, pt interface{}, data interface{}, opts interface{}, subresources ...interface{}) *mockConfigMapInterface_Patch_Call { + return &mockConfigMapInterface_Patch_Call{Call: _e.mock.On("Patch", append([]interface{}{ctx, name, pt, data, opts}, subresources...)...)} } -func (_c *MockConfigMapInterface_Patch_Call) Run(run func(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string)) *MockConfigMapInterface_Patch_Call { +func (_c *mockConfigMapInterface_Patch_Call) Run(run func(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string)) *mockConfigMapInterface_Patch_Call { _c.Call.Run(func(args mock.Arguments) { variadicArgs := make([]string, len(args)-5) for i, a := range args[5:] { @@ -405,18 +405,18 @@ func (_c *MockConfigMapInterface_Patch_Call) Run(run func(ctx context.Context, n return _c } -func (_c *MockConfigMapInterface_Patch_Call) Return(result *corev1.ConfigMap, err error) *MockConfigMapInterface_Patch_Call { +func (_c *mockConfigMapInterface_Patch_Call) Return(result *corev1.ConfigMap, err error) *mockConfigMapInterface_Patch_Call { _c.Call.Return(result, err) return _c } -func (_c *MockConfigMapInterface_Patch_Call) RunAndReturn(run func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) (*corev1.ConfigMap, error)) *MockConfigMapInterface_Patch_Call { +func (_c *mockConfigMapInterface_Patch_Call) RunAndReturn(run func(context.Context, string, types.PatchType, []byte, metav1.PatchOptions, ...string) (*corev1.ConfigMap, error)) *mockConfigMapInterface_Patch_Call { _c.Call.Return(run) return _c } // Update provides a mock function with given fields: ctx, configMap, opts -func (_m *MockConfigMapInterface) Update(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.UpdateOptions) (*corev1.ConfigMap, error) { +func (_m *mockConfigMapInterface) Update(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.UpdateOptions) (*corev1.ConfigMap, error) { ret := _m.Called(ctx, configMap, opts) var r0 *corev1.ConfigMap @@ -441,8 +441,8 @@ func (_m *MockConfigMapInterface) Update(ctx context.Context, configMap *corev1. return r0, r1 } -// MockConfigMapInterface_Update_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Update' -type MockConfigMapInterface_Update_Call struct { +// mockConfigMapInterface_Update_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Update' +type mockConfigMapInterface_Update_Call struct { *mock.Call } @@ -450,29 +450,29 @@ type MockConfigMapInterface_Update_Call struct { // - ctx context.Context // - configMap *corev1.ConfigMap // - opts metav1.UpdateOptions -func (_e *MockConfigMapInterface_Expecter) Update(ctx interface{}, configMap interface{}, opts interface{}) *MockConfigMapInterface_Update_Call { - return &MockConfigMapInterface_Update_Call{Call: _e.mock.On("Update", ctx, configMap, opts)} +func (_e *mockConfigMapInterface_Expecter) Update(ctx interface{}, configMap interface{}, opts interface{}) *mockConfigMapInterface_Update_Call { + return &mockConfigMapInterface_Update_Call{Call: _e.mock.On("Update", ctx, configMap, opts)} } -func (_c *MockConfigMapInterface_Update_Call) Run(run func(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.UpdateOptions)) *MockConfigMapInterface_Update_Call { +func (_c *mockConfigMapInterface_Update_Call) Run(run func(ctx context.Context, configMap *corev1.ConfigMap, opts metav1.UpdateOptions)) *mockConfigMapInterface_Update_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*corev1.ConfigMap), args[2].(metav1.UpdateOptions)) }) return _c } -func (_c *MockConfigMapInterface_Update_Call) Return(_a0 *corev1.ConfigMap, _a1 error) *MockConfigMapInterface_Update_Call { +func (_c *mockConfigMapInterface_Update_Call) Return(_a0 *corev1.ConfigMap, _a1 error) *mockConfigMapInterface_Update_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *MockConfigMapInterface_Update_Call) RunAndReturn(run func(context.Context, *corev1.ConfigMap, metav1.UpdateOptions) (*corev1.ConfigMap, error)) *MockConfigMapInterface_Update_Call { +func (_c *mockConfigMapInterface_Update_Call) RunAndReturn(run func(context.Context, *corev1.ConfigMap, metav1.UpdateOptions) (*corev1.ConfigMap, error)) *mockConfigMapInterface_Update_Call { _c.Call.Return(run) return _c } // Watch provides a mock function with given fields: ctx, opts -func (_m *MockConfigMapInterface) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { +func (_m *mockConfigMapInterface) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { ret := _m.Called(ctx, opts) var r0 watch.Interface @@ -497,43 +497,43 @@ func (_m *MockConfigMapInterface) Watch(ctx context.Context, opts metav1.ListOpt return r0, r1 } -// MockConfigMapInterface_Watch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Watch' -type MockConfigMapInterface_Watch_Call struct { +// mockConfigMapInterface_Watch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Watch' +type mockConfigMapInterface_Watch_Call struct { *mock.Call } // Watch is a helper method to define mock.On call // - ctx context.Context // - opts metav1.ListOptions -func (_e *MockConfigMapInterface_Expecter) Watch(ctx interface{}, opts interface{}) *MockConfigMapInterface_Watch_Call { - return &MockConfigMapInterface_Watch_Call{Call: _e.mock.On("Watch", ctx, opts)} +func (_e *mockConfigMapInterface_Expecter) Watch(ctx interface{}, opts interface{}) *mockConfigMapInterface_Watch_Call { + return &mockConfigMapInterface_Watch_Call{Call: _e.mock.On("Watch", ctx, opts)} } -func (_c *MockConfigMapInterface_Watch_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *MockConfigMapInterface_Watch_Call { +func (_c *mockConfigMapInterface_Watch_Call) Run(run func(ctx context.Context, opts metav1.ListOptions)) *mockConfigMapInterface_Watch_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(metav1.ListOptions)) }) return _c } -func (_c *MockConfigMapInterface_Watch_Call) Return(_a0 watch.Interface, _a1 error) *MockConfigMapInterface_Watch_Call { +func (_c *mockConfigMapInterface_Watch_Call) Return(_a0 watch.Interface, _a1 error) *mockConfigMapInterface_Watch_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *MockConfigMapInterface_Watch_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (watch.Interface, error)) *MockConfigMapInterface_Watch_Call { +func (_c *mockConfigMapInterface_Watch_Call) RunAndReturn(run func(context.Context, metav1.ListOptions) (watch.Interface, error)) *mockConfigMapInterface_Watch_Call { _c.Call.Return(run) return _c } -type mockConstructorTestingTNewMockConfigMapInterface interface { +type mockConstructorTestingTnewMockConfigMapInterface interface { mock.TestingT Cleanup(func()) } -// NewMockConfigMapInterface creates a new instance of MockConfigMapInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewMockConfigMapInterface(t mockConstructorTestingTNewMockConfigMapInterface) *MockConfigMapInterface { - mock := &MockConfigMapInterface{} +// newMockConfigMapInterface creates a new instance of mockConfigMapInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newMockConfigMapInterface(t mockConstructorTestingTnewMockConfigMapInterface) *mockConfigMapInterface { + mock := &mockConfigMapInterface{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/pkg/config/testdata/helm-repository.yaml b/pkg/config/testdata/helm-repository.yaml index 41d0537..6e61b5f 100644 --- a/pkg/config/testdata/helm-repository.yaml +++ b/pkg/config/testdata/helm-repository.yaml @@ -1,2 +1,2 @@ -endpoint: http://192.168.56.3:30100 +endpoint: oci://192.168.56.3:30100 plainHttp: true \ No newline at end of file diff --git a/pkg/helm/client.go b/pkg/helm/client.go index 2109483..0708592 100644 --- a/pkg/helm/client.go +++ b/pkg/helm/client.go @@ -3,6 +3,7 @@ package helm import ( "context" "fmt" + "github.com/cloudogu/k8s-component-operator/pkg/config" "strings" helmclient "github.com/mittwald/go-helm-client" @@ -26,22 +27,16 @@ type HelmClient interface { helmclient.Client } -// ociRepositoryConfig can get an OCI-Endpoint for a helm-repository. -type ociRepositoryConfig interface { - GetOciEndpoint() (string, error) - IsPlainHttp() bool -} - // Client wraps the HelmClient with config.HelmRepositoryData type Client struct { helmClient HelmClient - helmRepoData ociRepositoryConfig + helmRepoData *config.HelmRepositoryData actionConfig *action.Configuration dependencyChecker dependencyChecker } // NewClient create a new instance of the helm client. -func NewClient(namespace string, helmRepoData ociRepositoryConfig, debug bool, debugLog action.DebugLog) (*Client, error) { +func NewClient(namespace string, helmRepoData *config.HelmRepositoryData, debug bool, debugLog action.DebugLog) (*Client, error) { opt := &helmclient.RestConfClientOptions{ Options: &helmclient.Options{ Namespace: namespace, @@ -51,7 +46,7 @@ func NewClient(namespace string, helmRepoData ociRepositoryConfig, debug bool, d Debug: debug, DebugLog: debugLog, Linting: true, - PlainHttp: helmRepoData.IsPlainHttp(), + PlainHttp: helmRepoData.PlainHttp, }, RestConfig: ctrl.GetConfigOrDie(), } @@ -61,7 +56,7 @@ func NewClient(namespace string, helmRepoData ociRepositoryConfig, debug bool, d return nil, fmt.Errorf("failed to create helm client: %w", err) } - actionConfig, err := createActionConfig(namespace, helmRepoData.IsPlainHttp(), debug, debugLog, opt.RestConfig) + actionConfig, err := createActionConfig(namespace, helmRepoData.PlainHttp, debug, debugLog, opt.RestConfig) if err != nil { return nil, fmt.Errorf("failed to create action config: %w", err) } @@ -110,12 +105,9 @@ func (c *Client) InstallOrUpgrade(ctx context.Context, chart *helmclient.ChartSp // This helm-client currently only works with OCI-Helm-Repositories. // Therefore, the chartName has to include the FQDN of the repository (e.g. "oci://my.repo/...") // If in the future non-oci-repositories need to be used, this should be done here... - err := c.patchOciEndpoint(chart) - if err != nil { - return fmt.Errorf("error while patching chart '%s': %w", chart.ChartName, err) - } + c.patchOciEndpoint(chart) - _, err = c.helmClient.InstallOrUpgradeChart(ctx, chart, nil) + _, err := c.helmClient.InstallOrUpgradeChart(ctx, chart, nil) if err != nil { return fmt.Errorf("error while installOrUpgrade chart %s: %w", chart.ChartName, err) } @@ -128,10 +120,7 @@ func (c *Client) SatisfiesDependencies(ctx context.Context, chart *helmclient.Ch logger := log.FromContext(ctx) logger.Info("Checking if components dependencies are satisfied", "component", chart.ChartName) - err := c.patchOciEndpoint(chart) - if err != nil { - return fmt.Errorf("error while patching chart '%s': %w", chart.ChartName, err) - } + c.patchOciEndpoint(chart) componentChart, err := c.getChart(ctx, chart) if err != nil { @@ -158,9 +147,9 @@ func (c *Client) getChart(ctx context.Context, chartSpec *helmclient.ChartSpec) logger.Info("Trying to get chart with options", "chart", chartSpec.ChartName, "version", chartSpec.Version, - "plain http", c.helmRepoData.IsPlainHttp()) + "plain http", c.helmRepoData.PlainHttp) - pathOptions := createChartPathOptions(c.actionConfig, chartSpec, c.helmRepoData.IsPlainHttp()) + pathOptions := createChartPathOptions(c.actionConfig, chartSpec, c.helmRepoData.PlainHttp) componentChart, _, err := c.helmClient.GetChart(chartSpec.ChartName, pathOptions) if err != nil { return nil, fmt.Errorf("error while getting chart for %s:%s: %w", chartSpec.ChartName, chartSpec.Version, err) @@ -191,20 +180,12 @@ func (c *Client) ListDeployedReleases() ([]*release.Release, error) { return c.helmClient.ListDeployedReleases() } -func (c *Client) patchOciEndpoint(chart *helmclient.ChartSpec) error { - if strings.Index(chart.ChartName, "oci://") == 0 { - // oci protocol already present -> nothing to do - return nil +func (c *Client) patchOciEndpoint(chart *helmclient.ChartSpec) { + if strings.HasPrefix(chart.ChartName, "oci://") { + return } - endpoint, err := c.helmRepoData.GetOciEndpoint() - if err != nil { - return fmt.Errorf("error while getting oci endpoint: %w", err) - } - - chart.ChartName = fmt.Sprintf("%s/%s", endpoint, chart.ChartName) - - return nil + chart.ChartName = fmt.Sprintf("%s/%s", c.helmRepoData.Endpoint, chart.ChartName) } type dependencyUnsatisfiedError struct { diff --git a/pkg/helm/client_test.go b/pkg/helm/client_test.go index 4364a06..9f016ca 100644 --- a/pkg/helm/client_test.go +++ b/pkg/helm/client_test.go @@ -78,26 +78,6 @@ func TestClient_InstallOrUpgrade(t *testing.T) { require.NoError(t, err) }) - t.Run("should fail to install or upgrade chart for error in helmRepoData", func(t *testing.T) { - chartSpec := &helmclient.ChartSpec{ - ReleaseName: "testComponent", - ChartName: "testing/testComponent", - Namespace: "testNS", - Version: "0.1.1", - } - ctx := context.TODO() - - helmRepoData := &config.HelmRepositoryData{Endpoint: ""} - mockHelmClient := NewMockHelmClient(t) - - client := &Client{helmClient: mockHelmClient, helmRepoData: helmRepoData} - - err := client.InstallOrUpgrade(ctx, chartSpec) - - require.Error(t, err) - assert.ErrorContains(t, err, "error while patching chart 'testing/testComponent': error while getting oci endpoint: error creating oci-endpoint from '': wrong format") - }) - t.Run("should fail to install or upgrade chart for error in helmClient", func(t *testing.T) { chartSpec := &helmclient.ChartSpec{ ReleaseName: "testComponent", @@ -105,15 +85,14 @@ func TestClient_InstallOrUpgrade(t *testing.T) { Namespace: "testNS", Version: "0.1.1", } - ctx := context.TODO() - helmRepoData := &config.HelmRepositoryData{Endpoint: "https://staging.cloudogu.com"} + helmRepoData := &config.HelmRepositoryData{Endpoint: "oci://staging.cloudogu.com"} mockHelmClient := NewMockHelmClient(t) - mockHelmClient.EXPECT().InstallOrUpgradeChart(ctx, chartSpec, mock.Anything).Return(nil, assert.AnError) + mockHelmClient.EXPECT().InstallOrUpgradeChart(testCtx, chartSpec, mock.Anything).Return(nil, assert.AnError) client := &Client{helmClient: mockHelmClient, helmRepoData: helmRepoData} - err := client.InstallOrUpgrade(ctx, chartSpec) + err := client.InstallOrUpgrade(testCtx, chartSpec) require.Error(t, err) assert.ErrorIs(t, err, assert.AnError) @@ -206,34 +185,12 @@ func Test_dependencyUnsatisfiedError_Error(t *testing.T) { } func TestClient_SatisfiesDependencies(t *testing.T) { - t.Run("should fail to get oci endpoint", func(t *testing.T) { - // given - mockRepoConfig := newMockOciRepositoryConfig(t) - mockRepoConfig.EXPECT().GetOciEndpoint().Return("", assert.AnError) - chartSpec := &helmclient.ChartSpec{ - ReleaseName: "testComponent", - ChartName: "testComponent", - Namespace: "testNS", - Version: "0.1.1", - } - sut := &Client{ - helmRepoData: mockRepoConfig, - } - - // when - err := sut.SatisfiesDependencies(testCtx, chartSpec) - - // then - require.Error(t, err) - assert.ErrorIs(t, err, assert.AnError) - assert.ErrorContains(t, err, "error while patching chart 'testComponent': error while getting oci endpoint") - }) - t.Run("should fail to get chart", func(t *testing.T) { // given - mockRepoConfig := newMockOciRepositoryConfig(t) - mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) - mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + repoConfigData := &config.HelmRepositoryData{ + Endpoint: "oci://some.where/testing", + PlainHttp: true, + } mockHelmClient := NewMockHelmClient(t) mockHelmClient.EXPECT().GetChart("oci://some.where/testing/testComponent", mock.Anything).Return(nil, "", assert.AnError) @@ -247,7 +204,7 @@ func TestClient_SatisfiesDependencies(t *testing.T) { sut := &Client{ helmClient: mockHelmClient, - helmRepoData: mockRepoConfig, + helmRepoData: repoConfigData, actionConfig: new(action.Configuration), } @@ -262,9 +219,10 @@ func TestClient_SatisfiesDependencies(t *testing.T) { t.Run("should fail to list deployed releases", func(t *testing.T) { // given - mockRepoConfig := newMockOciRepositoryConfig(t) - mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) - mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + repoConfigData := &config.HelmRepositoryData{ + Endpoint: "oci://some.where/testing", + PlainHttp: true, + } helmChart := &chart.Chart{Metadata: &chart.Metadata{ Dependencies: []*chart.Dependency{{ @@ -285,7 +243,7 @@ func TestClient_SatisfiesDependencies(t *testing.T) { sut := &Client{ helmClient: mockHelmClient, - helmRepoData: mockRepoConfig, + helmRepoData: repoConfigData, actionConfig: new(action.Configuration), } @@ -300,9 +258,10 @@ func TestClient_SatisfiesDependencies(t *testing.T) { t.Run("should return unsatisfied error", func(t *testing.T) { // given - mockRepoConfig := newMockOciRepositoryConfig(t) - mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) - mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + repoConfigData := &config.HelmRepositoryData{ + Endpoint: "oci://some.where/testing", + PlainHttp: true, + } dependencies := []*chart.Dependency{createDependency("k8s-etcd", "3.2.1")} helmChart := &chart.Chart{Metadata: &chart.Metadata{ @@ -325,7 +284,7 @@ func TestClient_SatisfiesDependencies(t *testing.T) { sut := &Client{ helmClient: mockHelmClient, - helmRepoData: mockRepoConfig, + helmRepoData: repoConfigData, actionConfig: new(action.Configuration), dependencyChecker: mockDepChecker, } @@ -343,9 +302,10 @@ func TestClient_SatisfiesDependencies(t *testing.T) { t.Run("should succeed", func(t *testing.T) { // given - mockRepoConfig := newMockOciRepositoryConfig(t) - mockRepoConfig.EXPECT().GetOciEndpoint().Return("oci://some.where/testing", nil) - mockRepoConfig.EXPECT().IsPlainHttp().Return(true) + repoConfigData := &config.HelmRepositoryData{ + Endpoint: "oci://some.where/testing", + PlainHttp: true, + } dependencies := []*chart.Dependency{createDependency("k8s-etcd", "3.2.1")} helmChart := &chart.Chart{Metadata: &chart.Metadata{ @@ -368,7 +328,7 @@ func TestClient_SatisfiesDependencies(t *testing.T) { sut := &Client{ helmClient: mockHelmClient, - helmRepoData: mockRepoConfig, + helmRepoData: repoConfigData, actionConfig: new(action.Configuration), dependencyChecker: mockDepChecker, } diff --git a/pkg/helm/mock_ociRepositoryConfig_test.go b/pkg/helm/mock_ociRepositoryConfig_test.go deleted file mode 100644 index 95e4c8a..0000000 --- a/pkg/helm/mock_ociRepositoryConfig_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package helm - -import mock "github.com/stretchr/testify/mock" - -// mockOciRepositoryConfig is an autogenerated mock type for the ociRepositoryConfig type -type mockOciRepositoryConfig struct { - mock.Mock -} - -type mockOciRepositoryConfig_Expecter struct { - mock *mock.Mock -} - -func (_m *mockOciRepositoryConfig) EXPECT() *mockOciRepositoryConfig_Expecter { - return &mockOciRepositoryConfig_Expecter{mock: &_m.Mock} -} - -// GetOciEndpoint provides a mock function with given fields: -func (_m *mockOciRepositoryConfig) GetOciEndpoint() (string, error) { - ret := _m.Called() - - var r0 string - var r1 error - if rf, ok := ret.Get(0).(func() (string, error)); ok { - return rf() - } - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// mockOciRepositoryConfig_GetOciEndpoint_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetOciEndpoint' -type mockOciRepositoryConfig_GetOciEndpoint_Call struct { - *mock.Call -} - -// GetOciEndpoint is a helper method to define mock.On call -func (_e *mockOciRepositoryConfig_Expecter) GetOciEndpoint() *mockOciRepositoryConfig_GetOciEndpoint_Call { - return &mockOciRepositoryConfig_GetOciEndpoint_Call{Call: _e.mock.On("GetOciEndpoint")} -} - -func (_c *mockOciRepositoryConfig_GetOciEndpoint_Call) Run(run func()) *mockOciRepositoryConfig_GetOciEndpoint_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *mockOciRepositoryConfig_GetOciEndpoint_Call) Return(_a0 string, _a1 error) *mockOciRepositoryConfig_GetOciEndpoint_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *mockOciRepositoryConfig_GetOciEndpoint_Call) RunAndReturn(run func() (string, error)) *mockOciRepositoryConfig_GetOciEndpoint_Call { - _c.Call.Return(run) - return _c -} - -// IsPlainHttp provides a mock function with given fields: -func (_m *mockOciRepositoryConfig) IsPlainHttp() bool { - ret := _m.Called() - - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// mockOciRepositoryConfig_IsPlainHttp_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsPlainHttp' -type mockOciRepositoryConfig_IsPlainHttp_Call struct { - *mock.Call -} - -// IsPlainHttp is a helper method to define mock.On call -func (_e *mockOciRepositoryConfig_Expecter) IsPlainHttp() *mockOciRepositoryConfig_IsPlainHttp_Call { - return &mockOciRepositoryConfig_IsPlainHttp_Call{Call: _e.mock.On("IsPlainHttp")} -} - -func (_c *mockOciRepositoryConfig_IsPlainHttp_Call) Run(run func()) *mockOciRepositoryConfig_IsPlainHttp_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *mockOciRepositoryConfig_IsPlainHttp_Call) Return(_a0 bool) *mockOciRepositoryConfig_IsPlainHttp_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *mockOciRepositoryConfig_IsPlainHttp_Call) RunAndReturn(run func() bool) *mockOciRepositoryConfig_IsPlainHttp_Call { - _c.Call.Return(run) - return _c -} - -type mockConstructorTestingTnewMockOciRepositoryConfig interface { - mock.TestingT - Cleanup(func()) -} - -// newMockOciRepositoryConfig creates a new instance of mockOciRepositoryConfig. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func newMockOciRepositoryConfig(t mockConstructorTestingTnewMockOciRepositoryConfig) *mockOciRepositoryConfig { - mock := &mockOciRepositoryConfig{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From 06b59da0f8c91eea2e62e5d3f6ad9282fb53028c Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Thu, 24 Aug 2023 15:46:13 +0200 Subject: [PATCH 40/47] boyscouting: replace deprecated controller options Co-authored-by: Philipp Pixel --- main.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 73786be..aac66d5 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,8 @@ import ( "github.com/cloudogu/k8s-component-operator/pkg/logging" "k8s.io/client-go/kubernetes" "os" + "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/manager" // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) @@ -106,8 +108,8 @@ func getK8sManagerOptions(operatorConfig *config.OperatorConfig) manager.Options options := ctrl.Options{ Scheme: scheme, MetricsBindAddress: metricsAddr, - Port: 9443, - Namespace: operatorConfig.Namespace, + Cache: cache.Options{Namespaces: []string{operatorConfig.Namespace}}, + WebhookServer: webhook.NewServer(webhook.Options{Port: 9443}), HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "951e217a.cloudogu.com", From 295d26b2e2d7827a52a8c8a6935712f0a8a4fc34 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 11:59:56 +0200 Subject: [PATCH 41/47] #15 add doc comment Co-authored-by: Jeremias Weber --- pkg/api/v1/ces_component_types.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/api/v1/ces_component_types.go b/pkg/api/v1/ces_component_types.go index 853e812..5e6a888 100644 --- a/pkg/api/v1/ces_component_types.go +++ b/pkg/api/v1/ces_component_types.go @@ -64,6 +64,7 @@ type Component struct { Status ComponentStatus `json:"status,omitempty"` } +// String returns a string representation of this component. func (c *Component) String() string { return fmt.Sprintf("%s/%s:%s", c.Spec.Namespace, c.Spec.Name, c.Spec.Version) } From c023d849121e1a1d78a02302e35faa5b903a0445 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 13:15:29 +0200 Subject: [PATCH 42/47] #15 rename test with use case context Co-authored-by: Jeremias Weber --- pkg/config/config_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index f6a02c6..8df855e 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -43,7 +43,7 @@ func TestNewOperatorConfig(t *testing.T) { } func TestGetHelmRepositoryData(t *testing.T) { - t.Run("success from file", func(t *testing.T) { + t.Run("should return local developer", func(t *testing.T) { // given t.Setenv("RUNTIME", "local") devHelmRepoDataPath = "testdata/helm-repository.yaml" From e0f96d0b707db7da1ae7a26c854440f57b8b1e4b Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 13:21:23 +0200 Subject: [PATCH 43/47] #15 Add doc comments Co-authored-by: Jeremias Weber --- pkg/controllers/interfaces.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/controllers/interfaces.go b/pkg/controllers/interfaces.go index 244e978..3d4d1e2 100644 --- a/pkg/controllers/interfaces.go +++ b/pkg/controllers/interfaces.go @@ -51,6 +51,7 @@ type eventRecorder interface { } type requeueHandler interface { + // Handle takes an error and handles the requeue process for the current dogu operation. Handle(ctx context.Context, contextMessage string, componentResource *k8sv1.Component, originalErr error, onRequeue func()) (ctrl.Result, error) } From 8705e191018137848c3b82cb366b480e44443e65 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Thu, 24 Aug 2023 16:11:14 +0200 Subject: [PATCH 44/47] #15 improve error message Co-authored-by: Philipp Pixel --- pkg/config/config.go | 2 +- pkg/config/config_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index 97e0851..74c3111 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -59,7 +59,7 @@ func (hrd *HelmRepositoryData) validate() error { parts := strings.Split(hrd.Endpoint, "://") if len(parts) != 2 { - return fmt.Errorf("endpoint is not formatted as ://") + return fmt.Errorf("endpoint '%s' is not formatted as ://", hrd.Endpoint) } schema := parts[0] diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index f6a02c6..7ed60dd 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -120,7 +120,7 @@ func TestNewHelmRepoDataFromCluster(t *testing.T) { // then require.Error(t, err) - assert.ErrorContains(t, err, "config map 'component-operator-helm-repository' failed validation: endpoint is not formatted as ://") + assert.ErrorContains(t, err, "config map 'component-operator-helm-repository' failed validation: endpoint 'invalid' is not formatted as ://") }) t.Run("should fail because endpoint has empty URL", func(t *testing.T) { // given From 34a9856e3c173fa566394efb0b9823d84f4bf182 Mon Sep 17 00:00:00 2001 From: Jeremias Weber Date: Thu, 24 Aug 2023 16:12:23 +0200 Subject: [PATCH 45/47] #15 use valid endpoint in configmap Co-authored-by: Philipp Pixel --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 4a6ee7a..27f8d58 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -99,7 +99,7 @@ node('docker') { stage('Deploy Manager') { k3d.kubectl("create secret generic component-operator-helm-registry --from-file=config.json=k8s/emptyHelmRegistry.json --namespace default") - k3d.kubectl("create cm component-operator-helm-repository --from-literal=endpoint=dummy --namespace default") + k3d.kubectl("create cm component-operator-helm-repository --from-literal=endpoint=oci://dummy --namespace default") k3d.kubectl("apply -f ${sourceDeploymentYaml}") } From e1b9b8bd2bdc88c9b81ae516c03159a73e89376d Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 16:26:54 +0200 Subject: [PATCH 46/47] Bump version --- Dockerfile | 2 +- Makefile | 2 +- config/manager/kustomization.yaml | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 38701b3..e27db40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,7 @@ RUN make compile-generic FROM gcr.io/distroless/static:nonroot LABEL maintainer="hello@cloudogu.com" \ NAME="k8s-component-operator" \ - VERSION="0.0.3" + VERSION="0.1.0" WORKDIR / COPY --from=builder /workspace/target/k8s-component-operator . diff --git a/Makefile b/Makefile index 6561d3c..57ab816 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Set these to the desired values ARTIFACT_ID=k8s-component-operator -VERSION=0.0.3 +VERSION=0.1.0 ## Image URL to use all building/pushing image targets IMAGE_DEV=${K3CES_REGISTRY_URL_PREFIX}/${ARTIFACT_ID}:${VERSION} IMAGE=cloudogu/${ARTIFACT_ID}:${VERSION} diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index be88892..2e6ebab 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -1,14 +1,14 @@ resources: -- manager.yaml + - manager.yaml generatorOptions: disableNameSuffixHash: true configMapGenerator: -- files: - - controller_manager_config.yaml - name: manager-config + - files: + - controller_manager_config.yaml + name: manager-config apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: -- name: controller - newName: cloudogu/k8s-component-operator - newTag: 0.0.3 + - name: controller + newName: cloudogu/k8s-component-operator + newTag: 0.1.0 From e72f510dcb1fd2852b3cd0492483170b11010ed8 Mon Sep 17 00:00:00 2001 From: Philipp Pixel Date: Thu, 24 Aug 2023 16:28:28 +0200 Subject: [PATCH 47/47] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2f731d..46428b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] + +## [v0.1.0] - 2023-08-24 ### Added - [#15] Check if component dependencies are installed and if their version is appropriate - you can find more information about components in the [operations docs](docs/operations/managing_components_en.md) +- this release adds the ability to requeue CR requests ## [v0.0.3] - 2023-08-21 ### Changed