From c0b2518c115e75b055183ac14b06dc9f69ec68d6 Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Wed, 20 Sep 2023 08:49:20 +0100 Subject: [PATCH 01/11] EVEREST-444 Add configurable bind address for the everest container (#168) Co-authored-by: Andrew Minkin --- deploy/quickstart-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/quickstart-compose.yml b/deploy/quickstart-compose.yml index e5a4a189..1a4d5a9b 100644 --- a/deploy/quickstart-compose.yml +++ b/deploy/quickstart-compose.yml @@ -18,4 +18,4 @@ services: environment: - DSN=postgres://admin:pwd@pg:5432/postgres?sslmode=disable ports: - - 127.0.0.1:8080:8080 + - ${EVEREST_BIND_ADDR:-127.0.0.1}:8080:8080 From 716baebe44d58bc0624fa4b9fdbda43e80c0fcbf Mon Sep 17 00:00:00 2001 From: Andrew Minkin Date: Wed, 20 Sep 2023 21:43:49 +0600 Subject: [PATCH 02/11] EVEREST-256 Improved validation of database cluster CR (#166) Co-authored-by: Diogo Recharte Co-authored-by: Michal Kralik --- .golangci.yml | 3 +- api/database_cluster.go | 8 +- api/validation.go | 232 +++++++++++- api/validation_test.go | 347 ++++++++++++++++++ .../customresources/databaseclusters.go | 4 +- .../client/customresources/databaseengines.go | 97 +++++ pkg/kubernetes/client/database_engine.go | 18 + pkg/kubernetes/client/gen.go | 2 +- pkg/kubernetes/client/kubeclient_interface.go | 4 + .../client/mock_kube_client_connector.go | 52 +++ pkg/kubernetes/database_engine.go | 33 ++ 11 files changed, 781 insertions(+), 19 deletions(-) create mode 100644 pkg/kubernetes/client/customresources/databaseengines.go create mode 100644 pkg/kubernetes/client/database_engine.go create mode 100644 pkg/kubernetes/database_engine.go diff --git a/.golangci.yml b/.golangci.yml index 7b3c9ba6..00da60a2 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -9,8 +9,6 @@ linters-settings: - $all - "!$test" deny: - - pkg: errors - desc: use "github.com/pkg/errors" instead - pkg: github.com/gogo/protobuf/proto desc: use "github.com/golang/protobuf/proto" instead @@ -33,6 +31,7 @@ linters-settings: linters: enable-all: true disable: + - goerr113 # not useful after migration to the standard errors - exhaustruct # not useful - exhaustivestruct # annoying and duplicates exhaustruct - godox # fails to be nolint-ed when necessary diff --git a/api/database_cluster.go b/api/database_cluster.go index 4798e76d..89eb04a9 100644 --- a/api/database_cluster.go +++ b/api/database_cluster.go @@ -38,7 +38,7 @@ func (e *EverestServer) CreateDatabaseCluster(ctx echo.Context, kubernetesID str }) } - if err := validateCreateDatabaseClusterRequest(*dbc); err != nil { + if err := e.validateDatabaseClusterCR(ctx, kubernetesID, dbc); err != nil { return ctx.JSON(http.StatusBadRequest, Error{Message: pointer.ToString(err.Error())}) } @@ -125,7 +125,7 @@ func (e *EverestServer) GetDatabaseCluster(ctx echo.Context, kubernetesID string } // UpdateDatabaseCluster replaces the specified database cluster on the specified kubernetes cluster. -func (e *EverestServer) UpdateDatabaseCluster(ctx echo.Context, kubernetesID string, name string) error { //nolint:funlen +func (e *EverestServer) UpdateDatabaseCluster(ctx echo.Context, kubernetesID string, name string) error { //nolint:funlen,cyclop dbc := &DatabaseCluster{} if err := e.getBodyFromContext(ctx, dbc); err != nil { e.l.Error(err) @@ -134,6 +134,10 @@ func (e *EverestServer) UpdateDatabaseCluster(ctx echo.Context, kubernetesID str }) } + if err := e.validateDatabaseClusterCR(ctx, kubernetesID, dbc); err != nil { + return ctx.JSON(http.StatusBadRequest, Error{Message: pointer.ToString(err.Error())}) + } + _, kubeClient, code, err := e.initKubeClient(ctx.Request().Context(), kubernetesID) if err != nil { return ctx.JSON(code, Error{Message: pointer.ToString(err.Error())}) diff --git a/api/validation.go b/api/validation.go index 3c1f07a5..d381ec83 100644 --- a/api/validation.go +++ b/api/validation.go @@ -17,6 +17,7 @@ package api import ( + "errors" "fmt" "net/http" "net/url" @@ -28,45 +29,73 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/labstack/echo/v4" - "github.com/pkg/errors" + everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" "go.uber.org/zap" k8serrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" "github.com/percona/percona-everest-backend/cmd/config" "github.com/percona/percona-everest-backend/model" ) +const ( + pxcDeploymentName = "percona-xtradb-cluster-operator" + psmdbDeploymentName = "percona-server-mongodb-operator" + pgDeploymentName = "percona-postgresql-operator" +) + var ( - errDBCEmptyMetadata = errors.New("DatabaseCluster's Metadata should not be empty") - errDBCNameEmpty = errors.New("DatabaseCluster's metadata.name should not be empty") - errDBCNameWrongFormat = errors.New("DatabaseCluster's metadata.name should be a string") + minStorageQuantity = resource.MustParse("1G") //nolint:gochecknoglobals + minCPUQuantity = resource.MustParse("600m") //nolint:gochecknoglobals + minMemQuantity = resource.MustParse("512M") //nolint:gochecknoglobals + + errDBCEmptyMetadata = errors.New("DatabaseCluster's Metadata should not be empty") + errDBCNameEmpty = errors.New("DatabaseCluster's metadata.name should not be empty") + errDBCNameWrongFormat = errors.New("DatabaseCluster's metadata.name should be a string") + errNotEnoughMemory = fmt.Errorf("Memory limits should be above %s", minMemQuantity.String()) //nolint:stylecheck + errInt64NotSupported = errors.New("Specifying resources using int64 data type is not supported. Please use string format for that") //nolint:stylecheck + errNotEnoughCPU = fmt.Errorf("CPU limits should be above %s", minCPUQuantity.String()) //nolint:stylecheck + errNotEnoughDiskSize = fmt.Errorf("Storage size should be above %s", minStorageQuantity.String()) //nolint:stylecheck + errUnsupportedPXCProxy = errors.New("You can use either HAProxy or Proxy SQL for PXC clusters") //nolint:stylecheck + errUnsupportedPGProxy = errors.New("You can use only PGBouncer as a proxy type for Postgres clusters") //nolint:stylecheck + errUnsupportedPSMDBProxy = errors.New("You can use only Mongos as a proxy type for MongoDB clusters") //nolint:stylecheck + errNoSchedules = errors.New("Please specify at least one backup schedule") //nolint:stylecheck + errNoNameInSchedule = errors.New("'name' field for the backup schedules cannot be empty") + errNoBackupStorageName = errors.New("'backupStorageName' field cannot be empty when schedule is enabled") + errNoResourceDefined = errors.New("Please specify resource limits for the cluster") //nolint:stylecheck + //nolint:gochecknoglobals + operatorEngine = map[everestv1alpha1.EngineType]string{ + everestv1alpha1.DatabaseEnginePXC: pxcDeploymentName, + everestv1alpha1.DatabaseEnginePSMDB: psmdbDeploymentName, + everestv1alpha1.DatabaseEnginePostgresql: pgDeploymentName, + } ) // ErrNameNotRFC1035Compatible when the given fieldName doesn't contain RFC 1035 compatible string. func ErrNameNotRFC1035Compatible(fieldName string) error { - return errors.Errorf(`'%s' is not RFC 1035 compatible. The name should contain only lowercase alphanumeric characters or '-', start with an alphabetic character, end with an alphanumeric character`, + return fmt.Errorf(`'%s' is not RFC 1035 compatible. The name should contain only lowercase alphanumeric characters or '-', start with an alphabetic character, end with an alphanumeric character`, fieldName, ) } // ErrNameTooLong when the given fieldName is longer than expected. func ErrNameTooLong(fieldName string) error { - return errors.Errorf("'%s' can be at most 22 characters long", fieldName) + return fmt.Errorf("'%s' can be at most 22 characters long", fieldName) } // ErrCreateStorageNotSupported appears when trying to create a storage of a type that is not supported. func ErrCreateStorageNotSupported(storageType string) error { - return errors.Errorf("Creating storage is not implemented for '%s'", storageType) + return fmt.Errorf("Creating storage is not implemented for '%s'", storageType) //nolint:stylecheck } // ErrUpdateStorageNotSupported appears when trying to update a storage of a type that is not supported. func ErrUpdateStorageNotSupported(storageType string) error { - return errors.Errorf("Updating storage is not implemented for '%s'", storageType) + return fmt.Errorf("Updating storage is not implemented for '%s'", storageType) //nolint:stylecheck } // ErrInvalidURL when the given fieldName contains invalid URL. func ErrInvalidURL(fieldName string) error { - return errors.Errorf("'%s' is an invalid URL", fieldName) + return fmt.Errorf("'%s' is an invalid URL", fieldName) } // validates names to be RFC-1035 compatible https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#rfc-1035-label-names @@ -208,7 +237,7 @@ func validateCreateBackupStorageRequest(ctx echo.Context, l *zap.SugaredLogger) // check data access if err := validateStorageAccessByCreate(params); err != nil { l.Error(err) - return nil, errors.New("Could not connect to the backup storage, please check the new credentials are correct") + return nil, errors.New("Could not connect to the backup storage, please check the new credentials are correct") //nolint:stylecheck } return ¶ms, nil @@ -231,14 +260,14 @@ func validateCreateMonitoringInstanceRequest(ctx echo.Context) (*CreateMonitorin switch params.Type { case MonitoringInstanceCreateParamsTypePmm: if params.Pmm == nil { - return nil, errors.Errorf("pmm key is required for type %s", params.Type) + return nil, fmt.Errorf("pmm key is required for type %s", params.Type) } if params.Pmm.ApiKey == "" && params.Pmm.User == "" && params.Pmm.Password == "" { return nil, errors.New("one of pmm.apiKey, pmm.user or pmm.password fields is required") } default: - return nil, errors.Errorf("monitoring type %s is not supported", params.Type) + return nil, fmt.Errorf("monitoring type %s is not supported", params.Type) } return ¶ms, nil @@ -274,7 +303,7 @@ func validateUpdateMonitoringInstanceType(params UpdateMonitoringInstanceJSONReq return nil case MonitoringInstanceUpdateParamsTypePmm: if params.Pmm == nil { - return errors.Errorf("pmm key is required for type %s", params.Type) + return fmt.Errorf("pmm key is required for type %s", params.Type) } default: return errors.New("this monitoring type is not supported") @@ -319,3 +348,180 @@ func (e *EverestServer) validateDBClusterAccess(ctx echo.Context, kubernetesID, return nil } + +func (e *EverestServer) validateDatabaseClusterCR(ctx echo.Context, kubernetesID string, databaseCluster *DatabaseCluster) error { + if err := validateCreateDatabaseClusterRequest(*databaseCluster); err != nil { + return err + } + + _, kubeClient, _, err := e.initKubeClient(ctx.Request().Context(), kubernetesID) + if err != nil { + return err + } + engineName, ok := operatorEngine[everestv1alpha1.EngineType(databaseCluster.Spec.Engine.Type)] + if !ok { + return errors.New("Unsupported database engine") //nolint:stylecheck + } + engine, err := kubeClient.GetDatabaseEngine(ctx.Request().Context(), engineName) + if err != nil { + return err + } + if err := validateVersion(databaseCluster.Spec.Engine.Version, engine); err != nil { + return err + } + if databaseCluster.Spec.Proxy != nil && databaseCluster.Spec.Proxy.Type != nil { + if err := validateProxy(databaseCluster.Spec.Engine.Type, string(*databaseCluster.Spec.Proxy.Type)); err != nil { + return err + } + } + if err := validateBackupSpec(databaseCluster); err != nil { + return err + } + return validateResourceLimits(databaseCluster) +} + +func validateVersion(version *string, engine *everestv1alpha1.DatabaseEngine) error { + if version != nil { + if len(engine.Spec.AllowedVersions) != 0 { + if !containsVersion(*version, engine.Spec.AllowedVersions) { + return fmt.Errorf("Using %s version for %s is not allowed", *version, engine.Spec.Type) //nolint:stylecheck + } + return nil + } + if _, ok := engine.Status.AvailableVersions.Engine[*version]; !ok { + return fmt.Errorf("%s is not in available versions list", *version) + } + } + return nil +} + +func containsVersion(version string, versions []string) bool { + if version == "" { + return true + } + for _, allowedVersion := range versions { + if version == allowedVersion { + return true + } + } + return false +} + +func validateProxy(engineType, proxyType string) error { + if engineType == string(everestv1alpha1.DatabaseEnginePXC) { + if proxyType != string(everestv1alpha1.ProxyTypeProxySQL) && proxyType != string(everestv1alpha1.ProxyTypeHAProxy) { + return errUnsupportedPXCProxy + } + } + + if engineType == string(everestv1alpha1.DatabaseEnginePostgresql) && proxyType != string(everestv1alpha1.ProxyTypePGBouncer) { + return errUnsupportedPGProxy + } + if engineType == string(everestv1alpha1.DatabaseEnginePSMDB) && proxyType != string(everestv1alpha1.ProxyTypeMongos) { + return errUnsupportedPSMDBProxy + } + return nil +} + +func validateBackupSpec(cluster *DatabaseCluster) error { + if cluster.Spec.Backup == nil { + return nil + } + if !cluster.Spec.Backup.Enabled { + return nil + } + if cluster.Spec.Backup.Schedules == nil { + return errNoSchedules + } + + for _, schedule := range *cluster.Spec.Backup.Schedules { + if schedule.Name == "" { + return errNoNameInSchedule + } + if schedule.Enabled && schedule.BackupStorageName == "" { + return errNoBackupStorageName + } + } + return nil +} + +func validateResourceLimits(cluster *DatabaseCluster) error { + if err := ensureNonEmptyResources(cluster); err != nil { + return err + } + if err := validateCPU(cluster); err != nil { + return err + } + if err := validateMemory(cluster); err != nil { + return err + } + return validateStorageSize(cluster) +} + +func ensureNonEmptyResources(cluster *DatabaseCluster) error { + if cluster.Spec.Engine.Resources == nil { + return errNoResourceDefined + } + if cluster.Spec.Engine.Resources.Cpu == nil { + return errNotEnoughCPU + } + if cluster.Spec.Engine.Resources.Memory == nil { + return errNotEnoughMemory + } + return nil +} + +func validateCPU(cluster *DatabaseCluster) error { + cpuStr, err := cluster.Spec.Engine.Resources.Cpu.AsDatabaseClusterSpecEngineResourcesCpu1() + if err == nil { + cpu, err := resource.ParseQuantity(cpuStr) + if err != nil { + return err + } + if cpu.Cmp(minCPUQuantity) == -1 { + return errNotEnoughCPU + } + } + _, err = cluster.Spec.Engine.Resources.Cpu.AsDatabaseClusterSpecEngineResourcesCpu0() + if err == nil { + return errInt64NotSupported + } + return nil +} + +func validateMemory(cluster *DatabaseCluster) error { + _, err := cluster.Spec.Engine.Resources.Memory.AsDatabaseClusterSpecEngineResourcesMemory0() + if err == nil { + return errInt64NotSupported + } + memStr, err := cluster.Spec.Engine.Resources.Memory.AsDatabaseClusterSpecEngineResourcesMemory1() + if err == nil { + mem, err := resource.ParseQuantity(memStr) + if err != nil { + return err + } + if mem.Cmp(minMemQuantity) == -1 { + return errNotEnoughMemory + } + } + return nil +} + +func validateStorageSize(cluster *DatabaseCluster) error { + _, err := cluster.Spec.Engine.Storage.Size.AsDatabaseClusterSpecEngineStorageSize0() + if err == nil { + return errInt64NotSupported + } + sizeStr, err := cluster.Spec.Engine.Storage.Size.AsDatabaseClusterSpecEngineStorageSize1() + + if err == nil { + size, err := resource.ParseQuantity(sizeStr) + if err != nil { + return err + } + if size.Cmp(minStorageQuantity) == -1 { + return errNotEnoughDiskSize + } + } + return nil +} diff --git a/api/validation_test.go b/api/validation_test.go index 388fe713..fd9b255a 100644 --- a/api/validation_test.go +++ b/api/validation_test.go @@ -15,8 +15,13 @@ package api import ( + "encoding/json" "testing" + "github.com/AlekSi/pointer" + everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" + "github.com/pkg/errors" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -166,3 +171,345 @@ func TestValidateCreateDatabaseClusterRequest(t *testing.T) { }) } } + +func TestValidateProxy(t *testing.T) { + t.Parallel() + cases := []struct { + name string + engineType string + proxyType string + err error + }{ + { + name: "PXC with mongos", + engineType: "pxc", + proxyType: "mongos", + err: errUnsupportedPXCProxy, + }, + { + name: "PXC with pgbouncer", + engineType: "pxc", + proxyType: "pgbouncer", + err: errUnsupportedPXCProxy, + }, + { + name: "PXC with haproxy", + engineType: "pxc", + proxyType: "haproxy", + err: nil, + }, + { + name: "PXC with proxysql", + engineType: "pxc", + proxyType: "proxysql", + err: nil, + }, + { + name: "psmdb with mongos", + engineType: "psmdb", + proxyType: "mongos", + err: nil, + }, + { + name: "psmdb with pgbouncer", + engineType: "psmdb", + proxyType: "pgbouncer", + err: errUnsupportedPSMDBProxy, + }, + { + name: "psmdb with haproxy", + engineType: "psmdb", + proxyType: "haproxy", + err: errUnsupportedPSMDBProxy, + }, + { + name: "psmdb with proxysql", + engineType: "psmdb", + proxyType: "proxysql", + err: errUnsupportedPSMDBProxy, + }, + { + name: "postgresql with mongos", + engineType: "postgresql", + proxyType: "mongos", + err: errUnsupportedPGProxy, + }, + { + name: "postgresql with pgbouncer", + engineType: "postgresql", + proxyType: "pgbouncer", + err: nil, + }, + { + name: "postgresql with haproxy", + engineType: "postgresql", + proxyType: "haproxy", + err: errUnsupportedPGProxy, + }, + { + name: "postgresql with proxysql", + engineType: "postgresql", + proxyType: "proxysql", + err: errUnsupportedPGProxy, + }, + } + for _, tc := range cases { + c := tc + t.Run(c.name, func(t *testing.T) { + t.Parallel() + err := validateProxy(c.engineType, c.proxyType) + if c.err == nil { + require.Nil(t, err) + return + } + assert.Equal(t, c.err.Error(), err.Error()) + }) + } +} + +func TestContainsVersion(t *testing.T) { + t.Parallel() + cases := []struct { + version string + versions []string + result bool + }{ + { + version: "1", + versions: []string{}, + result: false, + }, + { + version: "1", + versions: []string{"1", "2"}, + result: true, + }, + { + version: "1", + versions: []string{"1"}, + result: true, + }, + { + version: "1", + versions: []string{"12", "23"}, + result: false, + }, + } + for _, tc := range cases { + tc := tc + t.Run(tc.version, func(t *testing.T) { + t.Parallel() + res := containsVersion(tc.version, tc.versions) + assert.Equal(t, res, tc.result) + }) + } +} + +func TestValidateVersion(t *testing.T) { + t.Parallel() + cases := []struct { + name string + version *string + engine *everestv1alpha1.DatabaseEngine + err error + }{ + { + name: "empty version is allowed", + version: nil, + engine: nil, + err: nil, + }, + { + name: "shall exist in availableVersions", + version: pointer.ToString("8.0.32"), + engine: &everestv1alpha1.DatabaseEngine{ + Status: everestv1alpha1.DatabaseEngineStatus{ + AvailableVersions: everestv1alpha1.Versions{ + Engine: everestv1alpha1.ComponentsMap{ + "8.0.32": &everestv1alpha1.Component{}, + }, + }, + }, + }, + err: nil, + }, + { + name: "shall not exist in availableVersions", + version: pointer.ToString("8.0.32"), + engine: &everestv1alpha1.DatabaseEngine{ + Status: everestv1alpha1.DatabaseEngineStatus{ + AvailableVersions: everestv1alpha1.Versions{ + Engine: everestv1alpha1.ComponentsMap{ + "8.0.31": &everestv1alpha1.Component{}, + }, + }, + }, + }, + err: errors.New("8.0.32 is not in available versions list"), + }, + { + name: "shall exist in allowedVersions", + version: pointer.ToString("8.0.32"), + engine: &everestv1alpha1.DatabaseEngine{ + Spec: everestv1alpha1.DatabaseEngineSpec{ + Type: "pxc", + AllowedVersions: []string{"8.0.32"}, + }, + }, + err: nil, + }, + { + name: "shall not exist in allowedVersions", + version: pointer.ToString("8.0.32"), + engine: &everestv1alpha1.DatabaseEngine{ + Spec: everestv1alpha1.DatabaseEngineSpec{ + Type: "pxc", + AllowedVersions: []string{"8.0.31"}, + }, + }, + err: errors.New("Using 8.0.32 version for pxc is not allowed"), + }, + } + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + err := validateVersion(tc.version, tc.engine) + if tc.err == nil { + require.Nil(t, err) + return + } + assert.Equal(t, err.Error(), tc.err.Error()) + }) + } +} + +func TestValidateBackupSpec(t *testing.T) { + t.Parallel() + cases := []struct { + name string + cluster []byte + err error + }{ + { + name: "empty backup is allowed", + cluster: []byte(`{"spec": {"backup": null}}`), + err: nil, + }, + { + name: "disabled backup is allowed", + cluster: []byte(`{"spec": {"backup": {"enabled": false}}}`), + err: nil, + }, + { + name: "errNoSchedules", + cluster: []byte(`{"spec": {"backup": {"enabled": true}}}`), + err: errNoSchedules, + }, + { + name: "errNoNameInSchedule", + cluster: []byte(`{"spec": {"backup": {"enabled": true, "schedules": [{"enabled": true}]}}}`), + err: errNoNameInSchedule, + }, + { + name: "errNoBackupStorageName", + cluster: []byte(`{"spec": {"backup": {"enabled": true, "schedules": [{"enabled": true, "name": "name"}]}}}`), + err: errNoBackupStorageName, + }, + { + name: "valid spec", + cluster: []byte(`{"spec": {"backup": {"enabled": true, "schedules": [{"enabled": true, "name": "name", "backupStorageName": "some"}]}}}`), + err: nil, + }, + } + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + cluster := &DatabaseCluster{} + err := json.Unmarshal(tc.cluster, cluster) + require.NoError(t, err) + err = validateBackupSpec(cluster) + if tc.err == nil { + require.Nil(t, err) + return + } + assert.Equal(t, err.Error(), tc.err.Error()) + }) + } +} + +func TestValidateResourceLimits(t *testing.T) { + t.Parallel() + cases := []struct { + name string + cluster []byte + err error + }{ + { + name: "success", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": "600m", "memory":"1G"}, "storage": {"size": "2G"}}}}`), + err: nil, + }, + { + name: "errNoResourceDefined", + cluster: []byte(`{"spec": {"engine": {"resources":null, "storage": {"size": "2G"}}}}`), + err: errNoResourceDefined, + }, + { + name: "Not enough CPU", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": null, "memory":"1G"}, "storage": {"size": "2G"}}}}`), + err: errNotEnoughCPU, + }, + { + name: "Not enough memory", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": "600m", "memory":null}, "storage": {"size": "2G"}}}}`), + err: errNotEnoughMemory, + }, + { + name: "No int64 for CPU", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": 6000, "memory": "1G"}, "storage": {"size": "2G"}}}}`), + err: errInt64NotSupported, + }, + { + name: "No int64 for Memory", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": "600m", "memory": 1000000}, "storage": {"size": "2G"}}}}`), + err: errInt64NotSupported, + }, + { + name: "No int64 for storage", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": "600m", "memory": "1G"}, "storage": {"size": 20000}}}}`), + err: errInt64NotSupported, + }, + { + name: "not enough disk size", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": "600m", "memory": "1G"}, "storage": {"size": "512M"}}}}`), + err: errNotEnoughDiskSize, + }, + { + name: "not enough CPU", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": "200m", "memory": "1G"}, "storage": {"size": "2G"}}}}`), + err: errNotEnoughCPU, + }, + { + name: "not enough Mem", + cluster: []byte(`{"spec": {"engine": {"resources": {"cpu": "600m", "memory": "400M"}, "storage": {"size": "2G"}}}}`), + err: errNotEnoughMemory, + }, + } + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + cluster := &DatabaseCluster{} + err := json.Unmarshal(tc.cluster, cluster) + require.NoError(t, err) + err = validateResourceLimits(cluster) + if tc.err == nil { + require.Nil(t, err) + return + } + assert.Equal(t, err.Error(), tc.err.Error()) + }) + } +} diff --git a/pkg/kubernetes/client/customresources/databaseclusters.go b/pkg/kubernetes/client/customresources/databaseclusters.go index 9db7e9c0..2ddac12d 100644 --- a/pkg/kubernetes/client/customresources/databaseclusters.go +++ b/pkg/kubernetes/client/customresources/databaseclusters.go @@ -1,3 +1,4 @@ +// Package customresources ... // percona-everest-backend // Copyright (C) 2023 Percona LLC // @@ -12,7 +13,8 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - +// +//nolint:dupl package customresources import ( diff --git a/pkg/kubernetes/client/customresources/databaseengines.go b/pkg/kubernetes/client/customresources/databaseengines.go new file mode 100644 index 00000000..77be0dd3 --- /dev/null +++ b/pkg/kubernetes/client/customresources/databaseengines.go @@ -0,0 +1,97 @@ +// Package customresources ... +// percona-everest-backend +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//nolint:dupl +package customresources + +import ( + "context" + + everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" +) + +const ( + dbEnginesAPIKind = "databaseengines" +) + +// DBEngines returns a db engine. +func (c *Client) DBEngines(namespace string) DBEngineInterface { //nolint:ireturn + return &dbEngineClient{ + restClient: c.restClient, + namespace: namespace, + } +} + +type dbEngineClient struct { + restClient rest.Interface + namespace string +} + +// DBEngineInterface supports list, get and watch methods. +type DBEngineInterface interface { + List(ctx context.Context, opts metav1.ListOptions) (*everestv1alpha1.DatabaseEngineList, error) + Get(ctx context.Context, name string, options metav1.GetOptions) (*everestv1alpha1.DatabaseEngine, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) +} + +// List lists database clusters based on opts. +func (c *dbEngineClient) List(ctx context.Context, opts metav1.ListOptions) (*everestv1alpha1.DatabaseEngineList, error) { + result := &everestv1alpha1.DatabaseEngineList{} + err := c.restClient. + Get(). + Namespace(c.namespace). + Resource(dbEnginesAPIKind). + VersionedParams(&opts, scheme.ParameterCodec). + Do(ctx). + Into(result) + return result, err +} + +// Get retrieves database cluster based on opts. +func (c *dbEngineClient) Get( + ctx context.Context, + name string, + opts metav1.GetOptions, +) (*everestv1alpha1.DatabaseEngine, error) { + result := &everestv1alpha1.DatabaseEngine{} + err := c.restClient. + Get(). + Namespace(c.namespace). + Resource(dbEnginesAPIKind). + VersionedParams(&opts, scheme.ParameterCodec). + Name(name). + Do(ctx). + Into(result) + return result, err +} + +// Watch starts a watch based on opts. +func (c *dbEngineClient) Watch( //nolint:ireturn + ctx context.Context, + opts metav1.ListOptions, +) (watch.Interface, error) { + opts.Watch = true + return c.restClient. + Get(). + Namespace(c.namespace). + Resource(dbEnginesAPIKind). + VersionedParams(&opts, scheme.ParameterCodec). + Watch(ctx) +} diff --git a/pkg/kubernetes/client/database_engine.go b/pkg/kubernetes/client/database_engine.go new file mode 100644 index 00000000..452598df --- /dev/null +++ b/pkg/kubernetes/client/database_engine.go @@ -0,0 +1,18 @@ +package client + +import ( + "context" + + everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ListDatabaseEngines returns list of managed database clusters. +func (c *Client) ListDatabaseEngines(ctx context.Context) (*everestv1alpha1.DatabaseEngineList, error) { + return c.customClientSet.DBEngines(c.namespace).List(ctx, metav1.ListOptions{}) +} + +// GetDatabaseEngine returns database clusters by provided name. +func (c *Client) GetDatabaseEngine(ctx context.Context, name string) (*everestv1alpha1.DatabaseEngine, error) { + return c.customClientSet.DBEngines(c.namespace).Get(ctx, name, metav1.GetOptions{}) +} diff --git a/pkg/kubernetes/client/gen.go b/pkg/kubernetes/client/gen.go index b9082a79..4eeedab8 100644 --- a/pkg/kubernetes/client/gen.go +++ b/pkg/kubernetes/client/gen.go @@ -15,5 +15,5 @@ package client -//go:generate ../../../bin/ifacemaker -f backup_storage.go -f client.go -f database_cluster.go -f monitoring_config.go -f namespace.go -f node.go -f pod.go -f resource.go -f secret.go -f storage.go -s Client -i KubeClientConnector -p client -o kubeclient_interface.go +//go:generate ../../../bin/ifacemaker -f backup_storage.go -f client.go -f database_cluster.go -f database_engine.go -f monitoring_config.go -f namespace.go -f node.go -f pod.go -f resource.go -f secret.go -f storage.go -s Client -i KubeClientConnector -p client -o kubeclient_interface.go //go:generate ../../../bin/mockery --name=KubeClientConnector --case=snake --inpackage diff --git a/pkg/kubernetes/client/kubeclient_interface.go b/pkg/kubernetes/client/kubeclient_interface.go index f915d960..6b6d0399 100644 --- a/pkg/kubernetes/client/kubeclient_interface.go +++ b/pkg/kubernetes/client/kubeclient_interface.go @@ -41,6 +41,10 @@ type KubeClientConnector interface { ListDatabaseClusters(ctx context.Context) (*everestv1alpha1.DatabaseClusterList, error) // GetDatabaseCluster returns database clusters by provided name. GetDatabaseCluster(ctx context.Context, name string) (*everestv1alpha1.DatabaseCluster, error) + // ListDatabaseEngines returns list of managed database clusters. + ListDatabaseEngines(ctx context.Context) (*everestv1alpha1.DatabaseEngineList, error) + // GetDatabaseEngine returns database clusters by provided name. + GetDatabaseEngine(ctx context.Context, name string) (*everestv1alpha1.DatabaseEngine, error) // CreateMonitoringConfig creates an MonitoringConfig. CreateMonitoringConfig(ctx context.Context, mc *everestv1alpha1.MonitoringConfig) error // GetMonitoringConfig returns the MonitoringConfig. diff --git a/pkg/kubernetes/client/mock_kube_client_connector.go b/pkg/kubernetes/client/mock_kube_client_connector.go index a94914bd..cefd0896 100644 --- a/pkg/kubernetes/client/mock_kube_client_connector.go +++ b/pkg/kubernetes/client/mock_kube_client_connector.go @@ -238,6 +238,32 @@ func (_m *MockKubeClientConnector) GetDatabaseCluster(ctx context.Context, name return r0, r1 } +// GetDatabaseEngine provides a mock function with given fields: ctx, name +func (_m *MockKubeClientConnector) GetDatabaseEngine(ctx context.Context, name string) (*v1alpha1.DatabaseEngine, error) { + ret := _m.Called(ctx, name) + + var r0 *v1alpha1.DatabaseEngine + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*v1alpha1.DatabaseEngine, error)); ok { + return rf(ctx, name) + } + if rf, ok := ret.Get(0).(func(context.Context, string) *v1alpha1.DatabaseEngine); ok { + r0 = rf(ctx, name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1alpha1.DatabaseEngine) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetMonitoringConfig provides a mock function with given fields: ctx, name func (_m *MockKubeClientConnector) GetMonitoringConfig(ctx context.Context, name string) (*v1alpha1.MonitoringConfig, error) { ret := _m.Called(ctx, name) @@ -500,6 +526,32 @@ func (_m *MockKubeClientConnector) ListDatabaseClusters(ctx context.Context) (*v return r0, r1 } +// ListDatabaseEngines provides a mock function with given fields: ctx +func (_m *MockKubeClientConnector) ListDatabaseEngines(ctx context.Context) (*v1alpha1.DatabaseEngineList, error) { + ret := _m.Called(ctx) + + var r0 *v1alpha1.DatabaseEngineList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*v1alpha1.DatabaseEngineList, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *v1alpha1.DatabaseEngineList); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1alpha1.DatabaseEngineList) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ListMonitoringConfigs provides a mock function with given fields: ctx func (_m *MockKubeClientConnector) ListMonitoringConfigs(ctx context.Context) (*v1alpha1.MonitoringConfigList, error) { ret := _m.Called(ctx) diff --git a/pkg/kubernetes/database_engine.go b/pkg/kubernetes/database_engine.go new file mode 100644 index 00000000..b14ee9be --- /dev/null +++ b/pkg/kubernetes/database_engine.go @@ -0,0 +1,33 @@ +// percona-everest-backend +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package kubernetes ... +package kubernetes + +import ( + "context" + + everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" +) + +// ListDatabaseEngines returns list of managed database clusters. +func (k *Kubernetes) ListDatabaseEngines(ctx context.Context) (*everestv1alpha1.DatabaseEngineList, error) { + return k.client.ListDatabaseEngines(ctx) +} + +// GetDatabaseEngine returns database clusters by provided name. +func (k *Kubernetes) GetDatabaseEngine(ctx context.Context, name string) (*everestv1alpha1.DatabaseEngine, error) { + return k.client.GetDatabaseEngine(ctx, name) +} From 375d6b19a14fec97e0fbc725f65e2c058b066994 Mon Sep 17 00:00:00 2001 From: Oksana Grishchenko <91597950+oksana-grishchenko@users.noreply.github.com> Date: Wed, 20 Sep 2023 23:39:51 +0200 Subject: [PATCH 03/11] EVEREST-428-rc-pipeline (#160) --- .github/workflows/rc_create.yml | 122 +++++++++++++++++++++++++++++++ .github/workflows/rc_rebuild.yml | 95 ++++++++++++++++++++++++ 2 files changed, 217 insertions(+) create mode 100644 .github/workflows/rc_create.yml create mode 100644 .github/workflows/rc_rebuild.yml diff --git a/.github/workflows/rc_create.yml b/.github/workflows/rc_create.yml new file mode 100644 index 00000000..ec2b3392 --- /dev/null +++ b/.github/workflows/rc_create.yml @@ -0,0 +1,122 @@ +name: Create RC branches + +on: + workflow_dispatch: + inputs: + version: + description: The release version in v*.*.* format + required: true + +jobs: + build: + runs-on: ubuntu-latest + env: + VERSION: ${{ github.event.inputs.version }} + RC_BRANCH: '' + steps: + - name: Validate input + run: | + echo $RC_BRANCH + if [[ ! $VERSION =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Wrong version format provided, please use v*.*.* format" + exit 1 + fi + - name: Define release branch name in the format "release-*.*.*" + run: | + echo "RC_BRANCH=release-${VERSION#v}" >> $GITHUB_ENV + + - name: Configure git for private modules + env: + ROBOT_TOKEN: ${{ secrets.ROBOT_TOKEN }} + run: git config --global url."https://percona-platform-robot:${ROBOT_TOKEN}@github.com".insteadOf "https://github.com" + + - name: Check out Everest CLI + uses: actions/checkout@v4 + with: + repository: percona/percona-everest-cli + ref: 'main' + path: percona-everest-cli + token: ${{ secrets.ROBOT_TOKEN }} + + - name: Create Everest CLI RC-branch + run: | + cd percona-everest-cli + # Check if the branch already exists + git fetch + check_branch=$(git ls-remote --heads origin ${RC_BRANCH}) + + if [[ -z ${check_branch} ]]; then + git checkout -b $RC_BRANCH + git push origin $RC_BRANCH + fi + + + - name: Check out Everest catalog + uses: actions/checkout@v4 + with: + repository: percona/everest-catalog + ref: 'main' + path: everest-catalog + token: ${{ secrets.ROBOT_TOKEN }} + + - name: Create Everest catalog RC-branch + run: | + cd everest-catalog + # Check if the branch already exists + git fetch + check_branch=$(git ls-remote --heads origin ${RC_BRANCH}) + + if [[ -z ${check_branch} ]]; then + git checkout -b $RC_BRANCH + git push origin $RC_BRANCH + fi + + + - name: Check out Everest frontend + uses: actions/checkout@v4 + with: + repository: percona/percona-everest-frontend + ref: 'main' + path: percona-everest-frontend + token: ${{ secrets.ROBOT_TOKEN }} + + - name: Create Everest Frontend RC-branch + run: | + cd percona-everest-frontend + + # Check if the branch already exists + git fetch + check_branch=$(git ls-remote --heads origin ${RC_BRANCH}) + + if [[ -z ${check_branch} ]]; then + git checkout -b $RC_BRANCH + git push origin $RC_BRANCH + fi + + - name: Check out Everest Backend + uses: actions/checkout@v4 + with: + path: ./backend + ref: 'main' + + - name: Create and update Everest Backend RC-branch + run: | + cd backend + # Check if the branch already exists + git fetch + check_branch=$(git ls-remote --heads origin ${RC_BRANCH}) + + if [[ -z ${check_branch} ]]; then + git checkout -b $RC_BRANCH + + # update tag refs in scripts + sed -i "s/dev-latest/$RC_BRANCH/g" deploy/quickstart-compose.yml deploy/quickstart-k8s.yaml + + # configure userdata for commits + git config --global user.email "everest-ci@percona.com" + git config --global user.name "Everest RC CI triggered by ${{ github.actor }}" + + # commit and push the updated files + git commit -a -m "update version tag" + git push origin $RC_BRANCH + fi diff --git a/.github/workflows/rc_rebuild.yml b/.github/workflows/rc_rebuild.yml new file mode 100644 index 00000000..c4c0ba9f --- /dev/null +++ b/.github/workflows/rc_rebuild.yml @@ -0,0 +1,95 @@ +name: Build and push RC image + +on: + push: + branches: + - release-[0-9]+.[0-9]+.[0-9]+* + +jobs: + build: + runs-on: ubuntu-latest + env: + VERSION: '' + RELEASE_BRANCH_NAME: '' + steps: + - name: Define release branch name + run: | + echo "RELEASE_BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV + + - name: Define version name + run: | + semantic_version=${RELEASE_BRANCH_NAME#"release-"} + echo "VERSION=v${semantic_version}" >> $GITHUB_ENV + + - name: Configure git for private modules + env: + ROBOT_TOKEN: ${{ secrets.ROBOT_TOKEN }} + run: git config --global url."https://percona-platform-robot:${ROBOT_TOKEN}@github.com".insteadOf "https://github.com" + + - name: Check out Everest frontend + uses: actions/checkout@v4 + with: + ref: $ {{ env.RELEASE_BRANCH_NAME }} + path: percona-everest-frontend + token: ${{ secrets.ROBOT_TOKEN }} + + - name: Run with Node 16 + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: Install Bit Version Manager + run: npm i -g @teambit/bvm + + - name: Install latest Bit version + run: bvm install 0.2.3 + + - name: Add bvm bin folder to path + run: echo "$HOME/bin" >> $GITHUB_PATH + + - name: Set up bit config + env: + BIT_TOKEN: ${{ secrets.BIT_TOKEN }} + run: bit config set user.token $BIT_TOKEN + + - name: Build Everest Frontend app + run: | + cd ${GITHUB_WORKSPACE}/percona-everest-frontend + bit install --recurring-install + bit snap + bit artifacts percona.apps/everest --out-dir build + mkdir ${GITHUB_WORKSPACE}/front + cp -rf build/percona.apps_everest/react-common-js/everest/public/* ${GITHUB_WORKSPACE}/front/ + + - name: Check out Everest Backend + uses: actions/checkout@v4 + with: + path: ./backend + ref: $ {{ env.RELEASE_BRANCH_NAME }} + token: ${{ secrets.ROBOT_TOKEN }} + + - name: Embed Everest Frontend app into backend + run: | + cp -rf ${GITHUB_WORKSPACE}/front/* ${GITHUB_WORKSPACE}/backend/public/dist/ + cd ${GITHUB_WORKSPACE}/backend + + - name: Setup docker build metadata + uses: docker/metadata-action@v4 + id: meta + with: + images: perconalab/everest + tags: ${{ env.VERSION }} + + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and Push everest RC-image + uses: docker/build-push-action@v4 + with: + context: backend + push: true + tags: ${{ steps.meta.outputs.tags }} From f84f5300c1a91d0c2691658b1d8d3276aae935ae Mon Sep 17 00:00:00 2001 From: Andrew Minkin Date: Thu, 21 Sep 2023 15:14:46 +0600 Subject: [PATCH 04/11] EVEREST-302 validate unknown fields for backupStorages (#170) --- api-tests/tests/backup-storages.spec.ts | 8 +- api/everest-server.gen.go | 252 ++++++++++++------------ client/everest-client.gen.go | 252 ++++++++++++------------ docs/spec/openapi.yml | 5 +- 4 files changed, 263 insertions(+), 254 deletions(-) diff --git a/api-tests/tests/backup-storages.spec.ts b/api-tests/tests/backup-storages.spec.ts index 5dea338f..2add257e 100644 --- a/api-tests/tests/backup-storages.spec.ts +++ b/api-tests/tests/backup-storages.spec.ts @@ -170,6 +170,12 @@ test('update backup storage failures', async ({ request }) => { }, errorText: '\'url\' is an invalid URL', }, + { + payload: { + bucket: '-asldf;asdfk;sadf', + }, + errorText: 'request body has an error: doesn\'t match schema #/components/schemas/UpdateBackupStorageParams: property \"bucket\" is unsupported', + }, ]; for (const testCase of testCases) { @@ -187,7 +193,7 @@ test('update: backup storage not found', async ({ request }) => { const response = await request.patch(`/v1/backup-storages/${name}`, { data: { - type: 's3', + bucketName: 's3', }, }); diff --git a/api/everest-server.gen.go b/api/everest-server.gen.go index 1c8cdbe1..c2c813a5 100644 --- a/api/everest-server.gen.go +++ b/api/everest-server.gen.go @@ -2025,132 +2025,132 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "1vTj+4//FwAA///siikZ/QIBAA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/client/everest-client.gen.go b/client/everest-client.gen.go index 556a115f..33020ee1 100644 --- a/client/everest-client.gen.go +++ b/client/everest-client.gen.go @@ -6297,132 +6297,132 @@ func ParseUpdateMonitoringInstanceResponse(rsp *http.Response) (*UpdateMonitorin // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "1vTj+4//FwAA///siikZ/QIBAA==", + "H4sIAAAAAAAC/+x9bXPbNrbwX8GwO9NkV5KTtrvTx192Esfb+mndeOxk79yJc28hEpKwJgEWAGWraf77", + "HRwAJEiCMvVix675zRZAvJz3c3Bw8CmKeZZzRpiS0eGnSMYLkmH48zWOr4r8QnGB50T/gJOEKsoZTs8E", + "z4lQlMjocIZTSUZRQmQsaK7bo0P7LZLmY0TZjIsMQ+Moyr2vP0XTIr4i6hecwRxqlZPoMJJKUDaPPjfG", + "DbSzrg8FmXd9Y374FBFWZNHhh0h+G40i/HshSDSK5rGMPo7aHxUiDQwGE/1WUEESPRKsZuTvqVyIHbIa", + "mk//Q2Klh65BWv5MpdIzUUUygNBfBJlFh9FXBxWqDiyeDupIKvcWYSHwSv9/JAhWpNbtDAtsRt4eo7ke", + "gygiZAuhOI6JlD+RVRD2dXTX53i3IChOeZGU05jeBzFnClNGBLIA3ppM6hO+QoUkAiVkRhnRs+ruMAfi", + "M6QWxKNg+PfNLxem2dAzWiiVy8ODg6tiSgQjisgJ5QcJj6Vec0xyJQ/4koglJdcH11xcUTYfX1O1GBvs", + "ywM9mjz4KmFynOIpScfwQzSKyA3O8hRweS3HCVmGtr2GyCWJBVFdaLhfFqhIwl9XH9Yw5PtTCd6jtJCK", + "iIqE6wit8IDsGE3q1D1izmZ0vpZOKuhnlFH9UQj8gKscx5a0ZrhIVXQY5UTEnOExWRJBpGp/GQaZt7QQ", + "KN5ghadYEguC9uYbHRCVQLMXICo0xcK/ie0Vm14SvTo7mbSZOKf/JkJa4mpwzdmJbbOcY+ZZmt80H5kZ", + "gYWoRILkgkjCFCgA/TNmFj0TdEGE/hDJBS/SBMWcLYlQSJCYzxn9vRxNIsVhmhQrIhWiTBHBcIqWOC3I", + "CGGWoAyvkCB6XFQwbwToIifolAujiw5Lxp1TNbn6Hrg25llWMKpWIG4EnRaKC3mQkCVJDySdj7GIF1SR", + "WBWCHOCcjmGxTG9KTrLkK0EkL0QM3NsilSvKkjYof6Is0XjCTvbAUiuI6Z/0ps+PL94hN76BqgFg1VVW", + "sNRwoGxGhOk5EzyDUQhLck6Zgn/ilBKmkCymGVUaSb8VRCoN5gk6woxxhaYEFXmCFUkm6IShI5yR9AhL", + "cueQ1NCTYw2yICwzorAmY4+DKzaROYlv5Y2LnMQ14k2I1NyIpMIKhH/jgwCHpCm/fs8knpEjYNpCYBXm", + "l46eaEZJmmgVlGjiJkwWQiMXGwSBaooxQzHIQBT730pUsBlVwNW54EkRw4iFJJMKYlPOU4IZqF1Q3+21", + "WbVuRcXUKvmcxHRG47DBRhiepiRAzMemwdDzLMVzsyv9ox1ZBtemGTwpUhKQ5xeuyQyaUqk0ctw6yw9H", + "lbUU2p8bprlP93MNtG1UT33rKWy6vG52cVP5xkStEzo6N7j2ydCZGykvgd+i/q3gD4Pb7QaREDaQunbS", + "Hsq3SZRh5SOe0xBSz+sdyvGLbEqEh97YNCuOBNHmXzSKjNkVHUaUqW+/qWbX2mBOhE9N3cTkJowFZ2t2", + "0lDSbSKoUDFyKrwcLaTA66Z5Y3g3VOhDLesuQPSHBZtpKwkJg45HVlloCTHlXEklcK71CUaMXCOr/rto", + "vWO2115rk5msbtLY0mRMQO/cEy+BDIWdGjkzCRFmjtWiPdsZVgs3ge7h7Ay7rRlNyUFCBYkVF6vJVmQC", + "EwcRO7XqxewmDI43r1udQgB589rh1C29jYr20ltLImxOGQkJF/27m9gZkch0v0VjVPZ2fUyjDd2Ydqia", + "LA7LlzylMQ4KFtPSlih27PLTXpKksucCM9kmhIURrqVxllKwpzQxEhwvGlNP0MkMadtKEjVqfaQH0400", + "y7kEudIAZF6A6cFWb2fR4YdP7UW3XJqPTUf+6Oy9g4/+s1yCJeIMIkFAs9rAjg6j/3l2efm3P8bP//ns", + "2YcX4//38W/PLi8n8Ndfn//z+R/lf397/vzZsw8/nf7w7uz4I33+xwdWZFfmvz+efSDHH/uP8/z5P/8S", + "jaKbceXPjSlTYy7Gdl+HShQETMGMi9XOQDmFYRxczKCPGzQh3pZVLK+hGV2Uo8aJzhhpcmSDJlMsAxxy", + "pH92A5YjwY+Ka3ldOqS59hulNgnQkqdFBt1oFmJ9SX8nO+P6gv5e7lQP6ARo9zoeC8J9PQSg6rZCWqG3", + "Vd5EP3QMRYEkERcQxJFhhfW+3iFoP0IzsnE95+WCx2Oagn7fsisi4cIR9Q247repbMcWa8JQGWdUcQPt", + "5uSnZVspP6pf1vNO1dGowjA8TwO9mkDFqDkWOjqfhNVnD63mTMm6grKep2PcasZJSCrQLCwWaCbBkas2", + "IPUOynWNyngsZWBYTFyT+Xhk3CatK8Hsm65MmKMMEk/QJUPv9E/aE2IIp/kCW2cbs8SJc2l8I0d8b1YM", + "ZzR2MNBOe2zddIKV9sznWJFqbDOeniTLCqWN9wk6UeCwc5au0FRTuXHQy5WBXdrhqZ77m0SCzIggTOOC", + "M03RSqsnhs54cqFBUust2/Bf485lhVQowype1CioNk3Ok0kA9I59z3iCrhdE2FBUCQqND4BChq/Ao8Wq", + "IiG8xDQFZ5QySROCsIeyfjHSW72qhpzUZDbOcD6+Iivpj9LuZYfJcK4HNfZY9xHJxirokZhTdXL52Vil", + "5sepDVFk+IZmRYZwxgsG0ZiYZ3mhKhNYIoiNaVIIxAnXHZXUpOVBhhmek3E57Ljio4MoQAkuhPnU0Xbu", + "QrkNxFF2K+Icx4GbUo5DJeIZVcr62B7fjhCFABYuUggdI0sydGaYn0pEbrTjQ1W6cl4iSUaIqwUR11RC", + "wAAz7fGkYGAD6sdOA0A4fFKtJDaBaXITE5LYye6Vyj73+EWTjZaEoVgDaKxagE4qntuAvIvItKNzueA3", + "q8B4+ucyeAH/1DzxurepVWGu1YSgWAX7o2uaplpz4TxPqUW3HntOl4RZu2qCXmnKyUy4GcXY2vKSKHte", + "4asExYFaBE+NaXZjj23MkaALtpTxhLgr3N4vhmD2dGsIgdxo/zoQ5IDf64OZvrcYctTGxM4xm4csq5Mz", + "v91N4MLZJ2cueiZM+7OjkzfnGnEw23PgES1SHdRmgmd13CrQxlQixn1bzTc3Os6Aq1SByjNwB5nukC0a", + "rXMXDID01yMwf6akOp3jokQ5xEvNabM3btn6sVd4apvgj8Hjl4j91GYeQj9D6OeLhX5u9/oNrVqn3zFq", + "xtmc640vsFFBVhXJ3zTv5vMpL1hMRC/mbR14QKD5YzBOhVUhbz/EhW618zM+lUQsNzrHXXCpwt7Sj7bF", + "Qcj1LF2fUl05sSc01wPzBs6spQzG3k5NgzGVlMB+shzCU16osHXgnWtwoQK2AReqxK3+u8eqewlGnKxC", + "QhEnq7bohd7am+wpdl2Arztip7jCqS/c+4/dQVWWjMpQJfxnHd1OqPezAxvE97rjED7YrV/6jj3vGpJ4", + "hiSeJ5fEY4+AN03lMZ9NHtLJdHkOfMsJsD8lF3RONe80fSdYzO0Btfqco8D2d1DNDgabK+gu7MQ8y1Oi", + "Ql71kWsqdQQ1Strk7P6HT9E1lqgcYeLrC80ZY/1BCC8m8yo0pWnwJ5QKZ7mjgSKXShCcWax/LU0Sl80u", + "6jd5QqSirCOn7E3V6BYxK9I0kMEQJDiAflgVlgTmEFNmfmPVQVbbakKX6d6DlHRXG863MhPiSzZWU3en", + "jVNKJQjeFnd4fDhoyzvVlmXkoddNhrCtFAhTDEr4XpRwDy4+EiTRc+F0m0z8HEt5zUVST7cXnKuuU+d2", + "cn64d4+l9xI9exM6g7R54NJmkDMPWc6cmyzGW/nV9uvnOdvUyMF1Hlznp+c6W07Z2He237X5ZecUdcOO", + "6y9gDEnpTzQpfaP4iE/PfkjEm7pHdKSi5+b0O4RFHNttERfp5LxaYKRfZME7i+gbGfBW7olnWS23wb/7", + "CBLYOXuZ6l7f/YQJnHkwmAYP23J3tuFgwD9EA/644zZRvf0Wg92cFA+G+mCoPyFD3XAGGOgG7Povk33Z", + "uHzXcTWdJJb266J1gyyw9vU/yBeRCrOkugUgizznQpGkuS45Qed0vlCI8WtE1dfS5MXnNzHwQC6zZDpB", + "P/JrsrSJpDYfIZcjlM+hE2YrkypqLfnbDbfOKxy3mWgW4JuYZsdd8HeZ7j4GgjdWtAElihp3eHnyS9eJ", + "z1o3LivN2OUurUuDbh+gwViVoeQnoVhbqXMFkxIg6LjR5FDa+HZU/WDSjjQtcZ5KRDNTXUgtApauoIrG", + "2K9B46XIwpc/YrkIUjm0nllfK2j0FjJc26brwkHoyuwA7nsAd5kL3ZnjP2Dh7rHQ/kFvZUDLw0JLqIve", + "BlZceGbzmkWEzIDuKIBFB2UIo6vvpZ/Ov1NEwMy7PhJQ9dktAuCsl8HVeJiOv/UpB4f/ITn8x0LwQEk6", + "+FkDNedMkvb9585AZGiOVhXAbbIOaLLvun/tVIXgHA0/hXpVg6rhzMcf+2z+hM34WgC4SKYmocD9bGh8", + "Z529gAKAswKo4vALVKT0gfMhmuffRKNonn+rF9vXuWyAwF9DaMZeYNioWmqbggJSpNXpdM3l/5/a8O59", + "+9+UfApbENUgJ0w73HHHsdQv3mGLNzG1H/m1Nrxm3bu98halj6Kb8ZzD1eixvKL5mOfGgBuDiNMMGCo9", + "YffVC33n3fesAqTsa5MOlxsyi5o3p05pmlKfQs39AX+D0WFUUKb+8R2cN1F5dWGvIvT7wtwber1SpPc0", + "LRHng9vIo+qu2atyf59HUYxzHFO1+pPu9chtryUwXMPIw3eIzE5b3GPDYvaa2DoZ0f72NZbkv6haAAcG", + "LpAF2K5e8LoVnzKldK38/xhcsJ50fa2R8Fx1emiW+c2zrH1Xqy+blwWAM8p+JmyuHZiXO8iMHmirgX5H", + "FMJtwD5VMh5yVei7Af0WNN0DeSZJ3qs2vhf+G236+dnpac8d2kKruzOvnrIlmzXvtX7EObUluveB2VEt", + "qXZrLpfGtN4TdQVE/dnpaRtoFzmJo55y4T24TPshrTslKePb1UgquKHNqv4H9FvAkH3PBJlTbTj1rp/+", + "Nq9KPAmS8aUpGHoVshXrhDzjwdyscz2IuXUasOfIkjBTK4QIAlfgW5nTSBSM2RJTDTO5P0XTOePCqyL/", + "ntXsxUatBuhslxVaNVRZUN45DRxnCQ41SbQYN6DD6Q5rDrGBIfon/5TD1m8edD5f0II05RBmwTnNcLzQ", + "q11N8qu5/kFOMqLwZPlyojn2lJgISbNukmnxCvC4cIqJRsoVUwuiaOyV3oGyXAu8JCNEWZwWiWY9UydN", + "09cSC8oLWd5PNobCBL2qQlYZXsEA5pyVMzBXPr2Fnno5I+QW9jlYX0VRVgRQ6VpgfFvVzDKHLdinoDR3", + "RhXirHEBHMQZEkQVgpHEhCQpS2iMlSsQZuoBiiURaIElyrgVAxWDTZAmJxO2oxLxHP9WkDK6OSVlCXUq", + "JTSYI2MbbnNBUi8yp1FgznQheAfxYFNmWlBixRUjN1CqA2KzJauXcD8yUDHyMebMlY6EsfSybHAv51JS", + "KHo283daiwzAvuMFZnOSIPDUTR14hjCakWuUUVZocAFytYYniQGJQ70LPZuqOw7a5gpkIcuiPCUmDShd", + "sR8Kl3hinDpIWUgbXM6okKoM4Y1QwVIiJVrxwqxHkJjQEpSKXxFmoqGYIQLhPxvl66hGmJkCkCeKZEe8", + "YIEAf7tPu9CALKZSo1u3AcnZ1QM6rhc0XlQVVoC7THnBCv1ug1ClpfzSkZCTWgkCc1wjycBakhSScKEq", + "IWGt8gd25W5REhXsivFrBtRrwKuHcahIyUyhggFLsaSsupUUYFVIIihO6e9VbadyobS634qeEQr0PyUx", + "LiRBVDmVFS8Kpp0NvX7XqmyhRHOOIG2n59V+rGZm3NBlc09mI2XJp6124oLqPE0goI4ZWr6cvPw7Srir", + "mOPNYWhfa0um0ag3Yf2yMKX8lUhFtfHF5n+tVX3VjJtq/MEijiBYX5666HkFAUHaNbbiTh7CmaH+h9zg", + "WE0aBSn+8d3aGkOdh0oXykbrsLJMOqPuoQCA2NfSO/OxMsCdMNVOv8zJpyuXGdudKo4Srfgzyux9aSve", + "DGdbiTRB/wZ5AApqSpCyd59xKYm9IcEUAgmFCpbxBMq9Qe63Ey5m5RN0xvMihYGggCdBciUVySbonOBk", + "rFXYnR+BaGe8EIKweDW2RcrGmCXjUpzHq+DlaZLOfqbsqo0w12KOm96f/9w8ZSrx0mv/l+ySvTk+Oz8+", + "evXu+I0fsQUug8pxWovjOW5VXmPo5eSbF5qCiTan6+KGSpSnmDGjNaEEjDbT3Wcv3WeTfun5vcwlk1l1", + "pGVOVw0WaNQ7WtKEWEugXQ0HythROx6aYZoWomY0xVhqEGl6zopU0TwlRhOZKluExZp7iTCVABpujIZP", + "2Jw1oCslTXlOiJXR36a2H+AAZhtpDtFGLmCYKon+/8XbX5qi7xTOEUEjoYQbYZlzqWb0piwAB+4YIxK4", + "ThlKJ9r2056e2dTvRPAxZQm50QyL/qXXag4pcZ4T7NsU3ARzAI56AKgEqRcvUVLAicHMfL3A4P41YDhB", + "b63LAvR5bM6E5OElQ+gSgiKXERp7xFb+aAWpYbmqMKz5EJTJhxcfJz1GMCaJWXxZstYOcRltVH3pFVoU", + "GWZjQXACBp7XXBYBwp6KASBMkF8D2BqhltFBMo5N5UMMBZCC+Q9QSUkGUwmQ5aKNF3ViRX9pKZMsV6ta", + "bcAaO5X29d7Z/A1RmKbyf5ffdPG67WEP5q2ZXfqwqOJKw2Gnr/7b6VonLo0hrbgTGP7nAanhWXiam88B", + "+hVTY3The1ZlFsc11Jouma60byRRlckAqtEEGRzzmKd9jPlSFVt2MWUNW8iXwdowdaMb98jaH1jKIrPy", + "BbNV1cvRGyBXy70lTmky0jZIwZIqcB3w8YDLw9LtyEgAw1RWIDlnzKIKS8ljCioLohyQsg9Ac8A0sniC", + "ftGCLE1rrUYaOVyZMUliJU+tLva6yNfGqiYQF5sLHqrCpaEATR6om9I+BALrkft7nfRPrNez6pY9TIre", + "MiR5RpDJ8KIO5gmdzYioUlSsU0OSaoqfKEu+dMYJ6wwkwdnKzvBBz64rj8aIHcrmqR3e+IguRdDGbZLn", + "HZJbidWrmYJnDrjeTjuIOPOrHZdFiShD0nyCpmTGbT2+El+O98EiU4JqXX6hMWrNF5N0ZKInfoIRyB+F", + "r4gpdw8egSIIm0fhxjZXn8tyIFXXXuWYC36NUs6gMPE1pqpcJb5yeQPN4Sf9qu/ZpJjGSxEnb5rYnHSi", + "qcR3F6qa9Bs+gSskEeN5QRNyUPpUQn5V0BBV7qgG1+g/szUTqrEKG54KwGlaKg/2tXI9TETLRZ+G1MS7", + "Tk2MeRJyU4r53EjOH9+9O3O40X0ti1EXoB2hF4iW5X578ohVtHvUgZ4dNuRH7jk/cgePwi8yCgFt0nlz", + "up6JuTNZlIcWOzkg14tVY+XwEIrxzi6jfxk78DKyG93BM0GvnKUep1iY+Bdmhv0sFIH9poUWmMSEOfmS", + "CKGtTKo6q9+tqQRrkVRhBb2Fs5RDdBldFHAkpn1R4e/0zslRWxMQnLKL75NQr5WVzRJVVEFW65l5mhod", + "m6eprbSOvLeVopeTF5MX9qIAwzmNDqNvJy8m39iaEQC3A3PFbGwP9+C3OVHho7DSZbWBw2nt/FFvpQT1", + "SWK/qT+JD2kYxnuDqb558cKdWRFzYgAPFphHDA7+Y6na7m2TF/TNMTxArin5Ae+zIq3oQsPouz2uxORQ", + "ByZ/z2TH9H+/j+lPnO62LjexHUeRLLIMi1VvPCs8l616JJBDk/PQ1Q6TQWRfLK0PV+V314nHfFJDalQ+", + "DfOam9rVe4FXYCZ7HB+A4TuvJk1tAzYA6yqN+vlGNnnhfih/IPrNib4XeXbR/OdRS4oefNKu6GfDBykJ", + "1WF5A78bI8L5l42pWyxhvmmyhJf2cfhhXVp5a3Sqe0D5IOe0u4sMddodeThoKquPLbr+LmRuD/S3jv76", + "EUO30A1q7B+I2oy8fiDqodPWIDMfDM32IK81VgJWcbBamlAUpy7Z0jlZHTNMkEmks/Uo6l1N9H7SIvJA", + "7t3DoPP92zXdaYb97BoAitROUwd0yzMU59gPVs9j4uDNuO0WC6gK0PZyIV1CM0kCiblhT7KV+3yn3mT4", + "fuJAZTs5lLdi3VHY1fdyjTd5bocJ5nQzFxJpEdF5VxL9nfqVXSn7HTI4sKUt/cuXd8cLAx9szge9ibbO", + "A3XZevDJfzIuWethejc2KpkemBwi+l08s+bqyW1m00mZYxW8dRIwnGp7exAW1K0XbwLE4F+9qe47wz2S", + "6PPgLe+Dk7Yi7KZu6ek0B4m35Tg/fO64Lztp0A378KWDRLGJZjiwn43dwdFacncsA+lskLtmfcA4xVIS", + "aRLrtmSFE1u35EmyA2x+YImtWWIHytyKXbJajZiw/3EKL82jzUrG1PnkIsAnXnmaP79ptW73Ha5Rq7T7", + "LgdvAzduwo1bUfxG/OeQO3aMaN/a6ObC8tCu42VAd8lgI1PODBp+wu7Pz5QdT/f1ZEcH9i99HN57F11c", + "v8/YSe/FuJdIrSww6/jm/tfxKo5JrlE2iL92fsBuosYJxCSIi61F5LbZBnsQl2bcBy8uR+uO9DpwComr", + "WoTNeMESeyPn1KZwfnA32T6WDyQFn3632daP4Dx8w2T4waPZT5LHnciRjtjWOWS5y/1LgR+IGkTA4xcB", + "O9tNA6e7APXeGG3fJoN7DW0bt8o997c3v8o9+fXkHKvyrbOenlUJ+QfmWq3Zxxfwrdas5n6dqzULGbyr", + "TbyrzSROh6x02NheWO7qYO0iOIMe1gMUnJvZV+751p0MrPOaVBycrEGW7JUPbxUnW7lZu8iCtp81CILH", + "KQh2t6MGhu/ja+2d4/MiyPF5iuO70P4mhX9g+vtl+sfh/9lLF4P/t7n/NyvSQYb6MnR/8mvfTthmFQna", + "Vee3kbp65AZtyaeSwNbY93DrZX9lFLYlzg6W6lNuoZ0yta/Y7dML2t5LWtp9LfwLqOd+ejld3XFwdojK", + "7hqV3VVqbWoBbBt+3YvwC8ZfH63rtZvLNURaB/mwPtK6d1nR+5rWXpi9HWAdOP2RhVIHVt7H9bM74OMN", + "Iqd74eVg6HRg58cTJN3O33oAUdFBBO0rBPlQXI8D7zLS1rFIm/i3t5Dka7umQaQ9xrzaIbB6d4HVDTlt", + "zzm2pdCIBYF3CXAqb72Av0bmecPsyak58hY2SI/HJT0q3A3S4048nc3Zbf/mhp+lv7294UbZl8Fx7lY1", + "yIxHmV42mBx3aHJsyGx7S5MgbE5ZD0lRvXxdLt1+urN4OLZLeGIZEmbbA1PtzlQ702aTmwxqNuci76Rx", + "U2vdjLCrgW4X/ugULHHrfiya0QJ6YNx9mtAb8UAnz3YcFZh4/h2wX/2gYODAuw/wdzPfw47vD0JjW6Gx", + "R+bdVtdXr0TeWgwT5zimagXlBivbpBxgp2KY595jlU+zImYFgYGRti+LuT2NtsvyVTX8xpRJhVm8YejJ", + "KwJYDRByGasijydevzujvcB0g7+2vyBIB9odgWUBZHfnrL8KDVc9TAuiTKJftej61doCkqjJJXuNJUmc", + "8nDt5iHqnMSKLgm6IivzonitRCVihCSyNtZFES8QliNEZ2aoQ5Rn2a/w8DdDv+q/YTD/S/sSvn2zHNfn", + "mFyyjnz6Nm3e0TMU7YnMAta/Q3HajYwvl9gegNnAyru9dtjNdLdycpfq2DZfO0ByHenYQd7p/YZXFpzn", + "qT+G+J1Z691OH5IqjCtzIPPw05vDFHqbvusZSsx6kP8PRO1G+6f3SPuD3B8Yq0/8MNuKqzqekAxGGvpo", + "FvPhg9Ys92EbGjCstw2z22zDL/Ie5CAk/jxCYgMuvsVG1cPCPIZ3C5FGh9HB8mWkWcp+22Tp4yURK7XQ", + "EwmSgqurOCzGewDBKwzg4m/fy6gdre8ezIWVA0M1U4m2GrY6l2+M6uLYO6wVeclA4TWX1Th2maXKcQ5P", + "4mrUbjDH6+arpnbk+qOmnz9+/r8AAAD//5++0lhSAwEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/docs/spec/openapi.yml b/docs/spec/openapi.yml index a5527b7f..45acd921 100644 --- a/docs/spec/openapi.yml +++ b/docs/spec/openapi.yml @@ -1160,7 +1160,7 @@ paths: - monitoringInstances summary: Create a new monitoring instance object description: | - A monitoring instance object requires `type` to be set. + A monitoring instance object requires `type` to be set. Based on the `type` the respective key with configuration needs to be set. Such as, if `type: pmm`, then `pmm` key needs to be provided with a configuration. operationId: createMonitoringInstance @@ -1376,6 +1376,7 @@ components: - secretKey - region - type + additionalProperties: false UpdateBackupStorageParams: type: object description: Backup storage parameters @@ -1393,6 +1394,7 @@ components: type: string region: type: string + additionalProperties: false BackupStorage: type: object description: Backup storage information @@ -1413,6 +1415,7 @@ components: type: string region: type: string + additionalProperties: false required: - name - bucketName From 69fb781d1af585c8452b7858b899527ddea1b712 Mon Sep 17 00:00:00 2001 From: Andrew Minkin Date: Thu, 21 Sep 2023 16:04:40 +0600 Subject: [PATCH 05/11] EVEREST-434 move to errors package (#171) --- .golangci.yml | 2 + api-tests/tests/monitoring-instances.spec.ts | 2 +- api/backup_storage.go | 29 ++++++------ api/database_cluster.go | 39 ++++++++-------- api/everest.go | 18 ++++---- api/kubernetes.go | 23 +++++----- api/marshal.go | 20 ++++++++ api/monitoring_instance.go | 32 ++++++------- api/proxy.go | 8 ++-- api/validation.go | 34 +++++++------- api/validation_test.go | 4 +- cmd/main.go | 4 +- go.mod | 2 +- model/backup_storage.go | 6 +-- model/backup_storage_helpers.go | 4 +- model/database.go | 14 +++--- model/monitoring_instance.go | 3 +- model/monitoring_instance_helpers.go | 3 +- pkg/configs/configs.go | 10 ++-- pkg/convertors/convertors.go | 7 ++- pkg/kubernetes/backup_storage.go | 8 ++-- pkg/kubernetes/client/client.go | 10 ++-- .../client/customresources/resource.go | 6 +-- pkg/kubernetes/configs.go | 46 +++++++++---------- pkg/kubernetes/kubernetes.go | 6 +-- pkg/kubernetes/monitoring_config.go | 12 ++--- pkg/kubernetes/node.go | 4 +- pkg/kubernetes/resources.go | 35 +++++++------- pkg/kubernetes/vmagent.go | 12 ++--- pkg/pmm/apikey.go | 7 ++- 30 files changed, 218 insertions(+), 192 deletions(-) create mode 100644 api/marshal.go diff --git a/.golangci.yml b/.golangci.yml index 00da60a2..67853412 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -9,6 +9,8 @@ linters-settings: - $all - "!$test" deny: + - pkg: github.com/pkg/errors + desc: use "errors" instead - pkg: github.com/gogo/protobuf/proto desc: use "github.com/golang/protobuf/proto" instead diff --git a/api-tests/tests/monitoring-instances.spec.ts b/api-tests/tests/monitoring-instances.spec.ts index fe1707d7..cb8b505d 100644 --- a/api-tests/tests/monitoring-instances.spec.ts +++ b/api-tests/tests/monitoring-instances.spec.ts @@ -278,7 +278,7 @@ test('patch monitoring instance type fails on missing key', async ({ request }) const getJson = await updated.json() - expect(getJson.message).toMatch('pmm key is required') + expect(getJson.message).toMatch('Pmm key is required') }) test('create monitoring instance failures', async ({ request }) => { diff --git a/api/backup_storage.go b/api/backup_storage.go index 51ad06e8..a0a9a205 100644 --- a/api/backup_storage.go +++ b/api/backup_storage.go @@ -18,6 +18,8 @@ package api import ( "context" + "errors" + "fmt" "net/http" "github.com/AlekSi/pointer" @@ -25,7 +27,6 @@ import ( "github.com/jinzhu/gorm" "github.com/labstack/echo/v4" "github.com/lib/pq" - "github.com/pkg/errors" "github.com/percona/percona-everest-backend/model" "github.com/percona/percona-everest-backend/pkg/kubernetes" @@ -75,7 +76,7 @@ func (e *EverestServer) CreateBackupStorage(ctx echo.Context) error { //nolint:f }) } if existingStorage != nil { - err = errors.Errorf("Storage %s already exists", params.Name) + err = fmt.Errorf("storage %s already exists", params.Name) e.l.Error(err) return ctx.JSON(http.StatusConflict, Error{Message: pointer.ToString(err.Error())}) } @@ -152,7 +153,7 @@ func (e *EverestServer) DeleteBackupStorage(ctx echo.Context, backupStorageName ks, err := e.storage.ListKubernetesClusters(c) if err != nil { - e.l.Error(errors.Wrap(err, "Could not list Kubernetes clusters")) + e.l.Error(errors.Join(err, errors.New("could not list Kubernetes clusters"))) return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString("Could not list Kubernetes clusters")}) } if len(ks) == 0 { @@ -161,7 +162,7 @@ func (e *EverestServer) DeleteBackupStorage(ctx echo.Context, backupStorageName // FIXME: Revisit it once multi k8s support will be enabled _, kubeClient, _, err := e.initKubeClient(ctx.Request().Context(), ks[0].ID) if err != nil { - e.l.Error(errors.Wrap(err, "could not init kube client for config")) + e.l.Error(errors.Join(err, errors.New("could not init kube client for config"))) return nil } @@ -169,7 +170,7 @@ func (e *EverestServer) DeleteBackupStorage(ctx echo.Context, backupStorageName return kubernetes.IsBackupStorageConfigInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - e.l.Error(errors.Wrap(err, "could not delete config")) + e.l.Error(errors.Join(err, errors.New("could not delete config"))) return nil } @@ -177,14 +178,14 @@ func (e *EverestServer) DeleteBackupStorage(ctx echo.Context, backupStorageName err := e.storage.DeleteBackupStorage(c, backupStorageName, tx) if err != nil { e.l.Error(err) - return errors.New("Could not delete backup storage") + return errors.New("could not delete backup storage") } if _, err := e.secretsStorage.DeleteSecret(c, bs.AccessKeyID); err != nil { - return errors.Wrap(err, "could not delete access key from secrets storage") + return errors.Join(err, errors.New("could not delete access key from secrets storage")) } if _, err := e.secretsStorage.DeleteSecret(c, bs.SecretKeyID); err != nil { - return errors.Wrap(err, "could not delete secret key from secrets storage") + return errors.Join(err, errors.New("could not delete secret key from secrets storage")) } return nil @@ -293,12 +294,12 @@ func (e *EverestServer) performBackupStorageUpdate( // FIXME: Revisit it once multi k8s support will be enabled _, kubeClient, _, err := e.initKubeClient(ctx.Request().Context(), ks[0].ID) if err != nil { - e.l.Error(errors.Wrap(err, "could not init kube client to update config")) + e.l.Error(errors.Join(err, errors.New("could not init kube client to update config"))) return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString("Could not init kubernetes client to update config")}) } if err := kubeClient.UpdateConfig(ctx.Request().Context(), bs, e.secretsStorage.GetSecret); err != nil { - e.l.Error(errors.Wrap(err, "could not update config")) + e.l.Error(errors.Join(err, errors.New("could not update config"))) return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString("Could not update config on the kubernetes cluster")}) } @@ -329,7 +330,7 @@ func (e *EverestServer) createSecrets( err := e.secretsStorage.CreateSecret(ctx, newID, *accessKey) if err != nil { e.l.Error(err) - return newAccessKeyID, newSecretKeyID, errors.New("Could not store access key in secrets storage") + return newAccessKeyID, newSecretKeyID, errors.New("could not store access key in secrets storage") } } @@ -341,7 +342,7 @@ func (e *EverestServer) createSecrets( err := e.secretsStorage.CreateSecret(ctx, newID, *secretKey) if err != nil { e.l.Error(err) - return newAccessKeyID, newSecretKeyID, errors.New("Could not store secret key in secrets storage") + return newAccessKeyID, newSecretKeyID, errors.New("could not store secret key in secrets storage") } } @@ -436,12 +437,12 @@ func (e *EverestServer) updateBackupStorage( var pgErr *pq.Error if errors.As(err, &pgErr) { if pgErr.Code.Name() == pgErrUniqueViolation { - return http.StatusBadRequest, errors.New("Backup storage with the same name already exists. " + pgErr.Detail) + return http.StatusBadRequest, errors.New("backup storage with the same name already exists. " + pgErr.Detail) } } e.l.Error(err) - return http.StatusInternalServerError, errors.New("Could not update backup storage") + return http.StatusInternalServerError, errors.New("could not update backup storage") } return 0, nil diff --git a/api/database_cluster.go b/api/database_cluster.go index 89eb04a9..7c7741cf 100644 --- a/api/database_cluster.go +++ b/api/database_cluster.go @@ -18,12 +18,13 @@ package api import ( "context" + "errors" + "fmt" "net/http" "github.com/AlekSi/pointer" "github.com/labstack/echo/v4" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" - "github.com/pkg/errors" "github.com/percona/percona-everest-backend/pkg/kubernetes" ) @@ -145,7 +146,7 @@ func (e *EverestServer) UpdateDatabaseCluster(ctx echo.Context, kubernetesID str oldDB, err := kubeClient.GetDatabaseCluster(ctx.Request().Context(), name) if err != nil { - return errors.Wrap(err, "Could not get old Database Cluster") + return errors.Join(err, errors.New("could not get old Database Cluster")) } if dbc.Spec.Engine.Version != nil { // XXX: Right now we do not support upgrading of versions @@ -239,13 +240,13 @@ func (e *EverestServer) createK8SBackupStorages(ctx context.Context, kubeClient for name := range names { bs, err := e.storage.GetBackupStorage(ctx, nil, name) if err != nil { - return errors.Wrap(err, "Could not get backup storage") + return errors.Join(err, errors.New("could not get backup storage")) } err = kubeClient.EnsureConfigExists(ctx, bs, e.secretsStorage.GetSecret) if err != nil { e.rollbackCreatedBackupStorages(ctx, kubeClient, processed) - return errors.Wrapf(err, "Could not create CRs for %s", name) + return errors.Join(err, fmt.Errorf("could not create CRs for %s", name)) } processed = append(processed, name) } @@ -256,7 +257,7 @@ func (e *EverestServer) rollbackCreatedBackupStorages(ctx context.Context, kubeC for _, name := range toDelete { bs, err := e.storage.GetBackupStorage(ctx, nil, name) if err != nil { - e.l.Error(errors.Wrap(err, "could not get backup storage")) + e.l.Error(errors.Join(err, errors.New("could not get backup storage"))) continue } @@ -264,7 +265,7 @@ func (e *EverestServer) rollbackCreatedBackupStorages(ctx context.Context, kubeC return kubernetes.IsBackupStorageConfigInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - e.l.Error(errors.Wrap(err, "could not delete backup storage config")) + e.l.Error(errors.Join(err, errors.New("could not delete backup storage config"))) continue } } @@ -276,7 +277,7 @@ func (e *EverestServer) deleteK8SMonitoringConfig( defer e.waitGroup.Done() i, err := e.storage.GetMonitoringInstance(name) if err != nil { - e.l.Error(errors.Wrap(err, "could get monitoring instance")) + e.l.Error(errors.Join(err, errors.New("could get monitoring instance"))) return } @@ -284,7 +285,7 @@ func (e *EverestServer) deleteK8SMonitoringConfig( return kubernetes.IsMonitoringConfigInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - e.l.Error(errors.Wrap(err, "could not delete monitoring config in Kubernetes")) + e.l.Error(errors.Join(err, errors.New("could not delete monitoring config in Kubernetes"))) return } } @@ -296,7 +297,7 @@ func (e *EverestServer) deleteK8SBackupStorages( for name := range names { bs, err := e.storage.GetBackupStorage(ctx, nil, name) if err != nil { - e.l.Error(errors.Wrap(err, "could not get backup storage")) + e.l.Error(errors.Join(err, errors.New("could not get backup storage"))) continue } @@ -304,7 +305,7 @@ func (e *EverestServer) deleteK8SBackupStorages( return kubernetes.IsBackupStorageConfigInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - e.l.Error(errors.Wrap(err, "could not delete backup storage config in Kubernetes")) + e.l.Error(errors.Join(err, errors.New("could not delete backup storage config in Kubernetes"))) continue } } @@ -315,14 +316,14 @@ func (e *EverestServer) deleteK8SBackupStorage( ) error { bs, err := e.storage.GetBackupStorage(ctx, nil, name) if err != nil { - return errors.Wrap(err, "could not find backup storage") + return errors.Join(err, errors.New("could not find backup storage")) } err = kubeClient.DeleteConfig(ctx, bs, func(ctx context.Context, name string) (bool, error) { return kubernetes.IsBackupStorageConfigInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - return errors.Wrap(err, "could not delete config in Kubernetes") + return errors.Join(err, errors.New("could not delete config in Kubernetes")) } return nil @@ -340,13 +341,13 @@ func (e *EverestServer) createBackupStoragesOnUpdate( for name := range toCreate { bs, err := e.storage.GetBackupStorage(ctx, nil, name) if err != nil { - return errors.Wrap(err, "Could not get backup storage") + return errors.Join(err, errors.New("could not get backup storage")) } err = kubeClient.EnsureConfigExists(ctx, bs, e.secretsStorage.GetSecret) if err != nil { e.rollbackCreatedBackupStorages(ctx, kubeClient, processed) - return errors.Wrapf(err, "Could not create CRs for %s", name) + return errors.Join(err, fmt.Errorf("could not create CRs for %s", name)) } processed = append(processed, name) } @@ -366,7 +367,7 @@ func (e *EverestServer) deleteBackupStoragesOnUpdate( for name := range toDelete { err := e.deleteK8SBackupStorage(ctx, kubeClient, name) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - e.l.Error(errors.Wrapf(err, "Could not delete CRs for %s", name)) + e.l.Error(errors.Join(err, fmt.Errorf("could not delete CRs for %s", name))) } } } @@ -385,12 +386,12 @@ func (e *EverestServer) createMonitoringInstanceOnUpdate( if newName != "" && newName != oldName { i, err := e.storage.GetMonitoringInstance(newName) if err != nil { - return errors.Wrap(err, "Could not get monitoring instance") + return errors.Join(err, errors.New("could not get monitoring instance")) } err = kubeClient.EnsureConfigExists(ctx, i, e.secretsStorage.GetSecret) if err != nil { - return errors.Wrap(err, "Could not create monitoring config in Kubernetes") + return errors.Join(err, errors.New("could not create monitoring config in Kubernetes")) } } @@ -412,7 +413,7 @@ func (e *EverestServer) deleteMonitoringInstanceOnUpdate( if oldName != "" && newName != oldName { i, err := e.storage.GetMonitoringInstance(oldName) if err != nil { - e.l.Error(errors.Wrap(err, "Could not get monitoring instance")) + e.l.Error(errors.Join(err, errors.New("could not get monitoring instance"))) return } @@ -420,7 +421,7 @@ func (e *EverestServer) deleteMonitoringInstanceOnUpdate( return kubernetes.IsMonitoringConfigInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - e.l.Error(errors.Wrap(err, "Could not delete monitoring config from Kubernetes")) + e.l.Error(errors.Join(err, errors.New("could not delete monitoring config from Kubernetes"))) return } } diff --git a/api/everest.go b/api/everest.go index 872b5263..724c2dcc 100644 --- a/api/everest.go +++ b/api/everest.go @@ -21,6 +21,7 @@ package api import ( "context" "encoding/json" + "errors" "fmt" "io/fs" "net/http" @@ -29,7 +30,6 @@ import ( "github.com/deepmap/oapi-codegen/pkg/middleware" "github.com/labstack/echo/v4" echomiddleware "github.com/labstack/echo/v4/middleware" - "github.com/pkg/errors" "go.uber.org/zap" "github.com/percona/percona-everest-backend/cmd/config" @@ -89,7 +89,7 @@ func (e *EverestServer) initKubeClient(ctx context.Context, kubernetesID string) k, err := e.storage.GetKubernetesCluster(ctx, kubernetesID) if err != nil { e.l.Error(err) - return nil, nil, http.StatusBadRequest, errors.New("Could not find Kubernetes cluster") + return nil, nil, http.StatusBadRequest, errors.New("could not find Kubernetes cluster") } kubeClient, err := kubernetes.NewFromSecretsStorage( @@ -98,7 +98,7 @@ func (e *EverestServer) initKubeClient(ctx context.Context, kubernetesID string) ) if err != nil { e.l.Error(err) - return k, nil, http.StatusInternalServerError, errors.New("Could not create Kubernetes client from kubeconfig") + return k, nil, http.StatusInternalServerError, errors.New("could not create Kubernetes client from kubeconfig") } return k, kubeClient, 0, nil @@ -112,7 +112,7 @@ func (e *EverestServer) initHTTPServer() error { } fsys, err := fs.Sub(public.Static, "dist") if err != nil { - return errors.Wrap(err, "error reading filesystem") + return errors.Join(err, errors.New("error reading filesystem")) } staticFilesHandler := http.FileServer(http.FS(fsys)) indexFS := echo.MustSubFS(public.Index, "dist") @@ -133,7 +133,7 @@ func (e *EverestServer) initHTTPServer() error { basePath, err := swagger.Servers.BasePath() if err != nil { - return errors.Wrap(err, "could not get base path") + return errors.Join(err, errors.New("could not get base path")) } // Use our validation middleware to check all requests against the OpenAPI schema. @@ -155,7 +155,7 @@ func (e *EverestServer) Start() error { func (e *EverestServer) Shutdown(ctx context.Context) error { e.l.Info("Shutting down http server") if err := e.echo.Shutdown(ctx); err != nil { - e.l.Error(errors.Wrap(err, "could not shut down http server")) + e.l.Error(errors.Join(err, errors.New("could not shut down http server"))) } else { e.l.Info("http server shut down") } @@ -168,7 +168,7 @@ func (e *EverestServer) Shutdown(ctx context.Context) error { defer e.waitGroup.Done() e.l.Info("Shutting down database storage") if err := e.storage.Close(); err != nil { - e.l.Error(errors.Wrap(err, "could not shut down database storage")) + e.l.Error(errors.Join(err, errors.New("could not shut down database storage"))) } else { e.l.Info("Database storage shut down") } @@ -179,7 +179,7 @@ func (e *EverestServer) Shutdown(ctx context.Context) error { defer e.waitGroup.Done() e.l.Info("Shutting down secrets storage") if err := e.secretsStorage.Close(); err != nil { - e.l.Error(errors.Wrap(err, "could not shut down secret storage")) + e.l.Error(errors.Join(err, errors.New("could not shut down secret storage"))) } else { e.l.Info("Secret storage shut down") } @@ -208,7 +208,7 @@ func (e *EverestServer) getBodyFromContext(ctx echo.Context, into any) error { decoder := json.NewDecoder(reader) if err := decoder.Decode(into); err != nil { - return errors.Wrap(err, "could not decode body") + return errors.Join(err, errors.New("could not decode body")) } return nil } diff --git a/api/kubernetes.go b/api/kubernetes.go index f9abc75e..7b956095 100644 --- a/api/kubernetes.go +++ b/api/kubernetes.go @@ -19,13 +19,14 @@ package api import ( "context" "encoding/base64" + "errors" + "fmt" "net/http" "github.com/AlekSi/pointer" "github.com/jinzhu/gorm" "github.com/labstack/echo/v4" "github.com/lib/pq" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/client-go/tools/clientcmd" @@ -179,11 +180,11 @@ func (e *EverestServer) UnregisterKubernetesCluster(ctx echo.Context, kubernetes func (e *EverestServer) removeK8sCluster(ctx context.Context, kubernetesID string) error { if _, err := e.secretsStorage.DeleteSecret(ctx, kubernetesID); err != nil { - return errors.Wrap(err, "could not delete kubeconfig from secrets storage") + return errors.Join(err, errors.New("could not delete kubeconfig from secrets storage")) } if err := e.storage.DeleteKubernetesCluster(ctx, kubernetesID); err != nil { - return errors.Wrap(err, "could not delete Kubernetes cluster from db") + return errors.Join(err, errors.New("could not delete Kubernetes cluster from db")) } return nil @@ -268,7 +269,7 @@ func (e *EverestServer) disableK8sClusterMonitoring(ctx echo.Context, kubeClient for _, s := range kubeClient.SecretNamesFromVMAgent(vmAgent) { mcs, err := kubeClient.GetMonitoringConfigsBySecretName(ctx.Request().Context(), s) if err != nil { - err = errors.Wrapf(err, "could not list monitoring configs by secret name %s", s) + err = errors.Join(err, fmt.Errorf("could not list monitoring configs by secret name %s", s)) e.l.Error(err) return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString(err.Error())}) } @@ -276,7 +277,7 @@ func (e *EverestServer) disableK8sClusterMonitoring(ctx echo.Context, kubeClient for _, mc := range mcs { err = kubeClient.DeleteMonitoringConfig(ctx.Request().Context(), mc.Name, mc.Spec.CredentialsSecretName) if err != nil && !errors.Is(err, kubernetes.ErrMonitoringConfigInUse) { - err = errors.Wrapf(err, "could not delete monitoring config %s from Kubernetes", mc.Name) + err = errors.Join(err, fmt.Errorf("could not delete monitoring config %s from Kubernetes", mc.Name)) e.l.Error(err) return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString(err.Error())}) } @@ -327,19 +328,19 @@ func (e *EverestServer) calculateClusterResources( ) if err != nil { e.l.Error(err) - return nil, errors.New("Could not get cluster resources") + return nil, errors.New("could not get cluster resources") } consumedCPUMillis, consumedMemoryBytes, err := kubeClient.GetConsumedCPUAndMemory(ctx.Request().Context(), "") if err != nil { e.l.Error(err) - return nil, errors.New("Could not get consumed cpu and memory") + return nil, errors.New("could not get consumed cpu and memory") } consumedDiskBytes, err := kubeClient.GetConsumedDiskBytes(ctx.Request().Context(), clusterType, volumes) if err != nil { e.l.Error(err) - return nil, errors.New("Could not get consumed disk bytes") + return nil, errors.New("could not get consumed disk bytes") } availableCPUMillis := allCPUMillis - consumedCPUMillis @@ -378,19 +379,19 @@ func (e *EverestServer) getNamespace(ctx context.Context, params CreateKubernete kubeconfig, err := base64.StdEncoding.DecodeString(params.Kubeconfig) if err != nil { e.l.Error(err) - return nil, errors.New("Could not decode kubeconfig") + return nil, errors.New("could not decode kubeconfig") } kubeClient, err := kubernetes.New(kubeconfig, *params.Namespace, e.l) if err != nil { e.l.Error(err) - return nil, errors.New("Could not create kube client") + return nil, errors.New("could not create kube client") } ns, err := kubeClient.GetNamespace(ctx, *params.Namespace) if err != nil { e.l.Error(err) - return nil, errors.New("Could not get namespace from Kubernetes") + return nil, errors.New("could not get namespace from Kubernetes") } return ns, nil diff --git a/api/marshal.go b/api/marshal.go new file mode 100644 index 00000000..954747bc --- /dev/null +++ b/api/marshal.go @@ -0,0 +1,20 @@ +package api + +import ( + "encoding/json" + "unicode" +) + +// MarshalJSON capitalizes Error.Message and marshals it to byte array. +func (e Error) MarshalJSON() ([]byte, error) { + if e.Message != nil && *e.Message != "" { + r := []rune(*e.Message) + r[0] = unicode.ToUpper(r[0]) + *e.Message = string(r) + } + return json.Marshal(&struct { + Message *string `json:"message,omitempty"` + }{ + Message: e.Message, + }) +} diff --git a/api/monitoring_instance.go b/api/monitoring_instance.go index c07bacc8..5dbb4988 100644 --- a/api/monitoring_instance.go +++ b/api/monitoring_instance.go @@ -18,6 +18,7 @@ package api import ( "context" + "errors" "fmt" "net/http" @@ -25,7 +26,6 @@ import ( "github.com/google/uuid" "github.com/jinzhu/gorm" "github.com/labstack/echo/v4" - "github.com/pkg/errors" "github.com/percona/percona-everest-backend/model" "github.com/percona/percona-everest-backend/pkg/kubernetes" @@ -163,7 +163,7 @@ func (e *EverestServer) DeleteMonitoringInstance(ctx echo.Context, name string) ks, err := e.storage.ListKubernetesClusters(ctx.Request().Context()) if err != nil { - return errors.Wrap(err, "Could not list Kubernetes clusters") + return errors.Join(err, errors.New("could not list Kubernetes clusters")) } if len(ks) == 0 { return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString("No registered kubernetes clusters available")}) @@ -171,7 +171,7 @@ func (e *EverestServer) DeleteMonitoringInstance(ctx echo.Context, name string) // FIXME: Revisit it once multi k8s support will be enabled _, kubeClient, _, err := e.initKubeClient(ctx.Request().Context(), ks[0].ID) if err != nil { - e.l.Error(errors.Wrap(err, "could not init kube client")) + e.l.Error(errors.Join(err, errors.New("could not init kube client"))) return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString("Could not make connection to the kubernetes cluster")}) } @@ -179,19 +179,19 @@ func (e *EverestServer) DeleteMonitoringInstance(ctx echo.Context, name string) return kubernetes.IsMonitoringConfigInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - e.l.Error(errors.Wrap(err, "could not delete monitoring config from kubernetes cluster")) + e.l.Error(errors.Join(err, errors.New("could not delete monitoring config from kubernetes cluster"))) return ctx.JSON(http.StatusInternalServerError, Error{Message: pointer.ToString("Could not delete monitoring config from the Kubernetes cluster")}) } err = e.storage.Transaction(func(tx *gorm.DB) error { if err := e.storage.DeleteMonitoringInstance(i.Name, tx); err != nil { e.l.Error(err) - return errors.New("Could not delete monitoring instance") + return errors.New("could not delete monitoring instance") } _, err = e.secretsStorage.DeleteSecret(context.Background(), i.APIKeySecretID) if err != nil { - return errors.Wrapf(err, "could not delete monitoring instance API key secret %s", i.APIKeySecretID) + return errors.Join(err, fmt.Errorf("could not delete monitoring instance API key secret %s", i.APIKeySecretID)) } return nil @@ -224,14 +224,14 @@ func (e *EverestServer) createAndStorePMMApiKey(ctx context.Context, name, url, ) if err != nil { e.l.Error(err) - return "", errors.New("Could not create an API key in PMM") + return "", errors.New("could not create an API key in PMM") } } apiKeyID := uuid.NewString() if err := e.secretsStorage.CreateSecret(ctx, apiKeyID, apiKey); err != nil { e.l.Error(err) - return "", errors.New("Could not save API key to secrets storage") + return "", errors.New("could not save API key to secrets storage") } return apiKeyID, nil @@ -245,10 +245,10 @@ func (e *EverestServer) performMonitoringInstanceUpdate( //nolint:cyclop err := e.storage.Transaction(func(tx *gorm.DB) error { ks, err := e.storage.ListKubernetesClusters(ctx.Request().Context()) if err != nil { - return errors.Wrap(err, "Could not list Kubernetes clusters") + return errors.Join(err, errors.New("could not list Kubernetes clusters")) } if len(ks) == 0 { - return errors.New("No registered Kubernetes clusters available") + return errors.New("no registered Kubernetes clusters available") } err = e.storage.UpdateMonitoringInstance(name, model.UpdateMonitoringInstanceParams{ Type: (*model.MonitoringInstanceType)(¶ms.Type), @@ -257,17 +257,17 @@ func (e *EverestServer) performMonitoringInstanceUpdate( //nolint:cyclop }) if err != nil { if _, err := e.secretsStorage.DeleteSecret(ctx.Request().Context(), *apiKeyID); err != nil { - return errors.Wrapf(err, "Could not delete secret %s from secret storage", *apiKeyID) + return errors.Join(err, fmt.Errorf("could not delete secret %s from secret storage", *apiKeyID)) } e.l.Error(err) - return errors.New("Could not update monitoring instance") + return errors.New("could not update monitoring instance") } monitoringInstance, err = e.storage.GetMonitoringInstance(name) if err != nil { e.l.Error(err) - return errors.New("Could not find updated monitoring instance") + return errors.New("could not find updated monitoring instance") } // FIXME: Revisit it once multi k8s support will be enabled // FIXME: This is not recommended to do network calls in a database transaction @@ -275,16 +275,16 @@ func (e *EverestServer) performMonitoringInstanceUpdate( //nolint:cyclop // However, right now it guarantees data consistency _, kubeClient, _, err := e.initKubeClient(ctx.Request().Context(), ks[0].ID) if err != nil { - return errors.Wrap(err, "could not init kube client to update config") + return errors.Join(err, errors.New("could not init kube client to update config")) } if err := kubeClient.UpdateConfig(ctx.Request().Context(), monitoringInstance, e.secretsStorage.GetSecret); err != nil { - return errors.Wrap(err, "could not update config") + return errors.Join(err, errors.New("could not update config")) } if apiKeyID != nil { if _, err := e.secretsStorage.DeleteSecret(context.Background(), previousAPIKeyID); err != nil { - return errors.Wrapf(err, "could not delete monitoring instance api key secret %s", previousAPIKeyID) + return errors.Join(err, fmt.Errorf("could not delete monitoring instance api key secret %s", previousAPIKeyID)) } } diff --git a/api/proxy.go b/api/proxy.go index fed73417..c3084846 100644 --- a/api/proxy.go +++ b/api/proxy.go @@ -19,6 +19,7 @@ package api import ( "bytes" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -29,7 +30,6 @@ import ( "github.com/AlekSi/pointer" "github.com/labstack/echo/v4" - "github.com/pkg/errors" "go.uber.org/zap" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" @@ -123,17 +123,17 @@ func everestResponseModifier(logger *zap.SugaredLogger) func(resp *http.Response if _, ok := rewriteCodes[resp.StatusCode]; ok { b, err := io.ReadAll(resp.Body) if err != nil { - logger.Error(errors.Wrap(err, "failed reading body")) + logger.Error(errors.Join(err, errors.New("failed reading body"))) return err } err = resp.Body.Close() if err != nil { - logger.Error(errors.Wrap(err, "failed closing body")) + logger.Error(errors.Join(err, errors.New("failed closing body"))) return err } b, err = tryOverrideResponseBody(b) if err != nil { - logger.Error(errors.Wrap(err, "failed overriding response body")) + logger.Error(errors.Join(err, errors.New("failed overriding response body"))) return err } diff --git a/api/validation.go b/api/validation.go index d381ec83..0aa077b8 100644 --- a/api/validation.go +++ b/api/validation.go @@ -49,20 +49,20 @@ var ( minCPUQuantity = resource.MustParse("600m") //nolint:gochecknoglobals minMemQuantity = resource.MustParse("512M") //nolint:gochecknoglobals - errDBCEmptyMetadata = errors.New("DatabaseCluster's Metadata should not be empty") - errDBCNameEmpty = errors.New("DatabaseCluster's metadata.name should not be empty") - errDBCNameWrongFormat = errors.New("DatabaseCluster's metadata.name should be a string") - errNotEnoughMemory = fmt.Errorf("Memory limits should be above %s", minMemQuantity.String()) //nolint:stylecheck - errInt64NotSupported = errors.New("Specifying resources using int64 data type is not supported. Please use string format for that") //nolint:stylecheck - errNotEnoughCPU = fmt.Errorf("CPU limits should be above %s", minCPUQuantity.String()) //nolint:stylecheck - errNotEnoughDiskSize = fmt.Errorf("Storage size should be above %s", minStorageQuantity.String()) //nolint:stylecheck - errUnsupportedPXCProxy = errors.New("You can use either HAProxy or Proxy SQL for PXC clusters") //nolint:stylecheck - errUnsupportedPGProxy = errors.New("You can use only PGBouncer as a proxy type for Postgres clusters") //nolint:stylecheck - errUnsupportedPSMDBProxy = errors.New("You can use only Mongos as a proxy type for MongoDB clusters") //nolint:stylecheck - errNoSchedules = errors.New("Please specify at least one backup schedule") //nolint:stylecheck + errDBCEmptyMetadata = errors.New("databaseCluster's Metadata should not be empty") + errDBCNameEmpty = errors.New("databaseCluster's metadata.name should not be empty") + errDBCNameWrongFormat = errors.New("databaseCluster's metadata.name should be a string") + errNotEnoughMemory = fmt.Errorf("memory limits should be above %s", minMemQuantity.String()) + errInt64NotSupported = errors.New("specifying resources using int64 data type is not supported. Please use string format for that") + errNotEnoughCPU = fmt.Errorf("CPU limits should be above %s", minCPUQuantity.String()) + errNotEnoughDiskSize = fmt.Errorf("storage size should be above %s", minStorageQuantity.String()) + errUnsupportedPXCProxy = errors.New("you can use either HAProxy or Proxy SQL for PXC clusters") + errUnsupportedPGProxy = errors.New("you can use only PGBouncer as a proxy type for Postgres clusters") + errUnsupportedPSMDBProxy = errors.New("you can use only Mongos as a proxy type for MongoDB clusters") + errNoSchedules = errors.New("please specify at least one backup schedule") errNoNameInSchedule = errors.New("'name' field for the backup schedules cannot be empty") errNoBackupStorageName = errors.New("'backupStorageName' field cannot be empty when schedule is enabled") - errNoResourceDefined = errors.New("Please specify resource limits for the cluster") //nolint:stylecheck + errNoResourceDefined = errors.New("please specify resource limits for the cluster") //nolint:gochecknoglobals operatorEngine = map[everestv1alpha1.EngineType]string{ everestv1alpha1.DatabaseEnginePXC: pxcDeploymentName, @@ -85,12 +85,12 @@ func ErrNameTooLong(fieldName string) error { // ErrCreateStorageNotSupported appears when trying to create a storage of a type that is not supported. func ErrCreateStorageNotSupported(storageType string) error { - return fmt.Errorf("Creating storage is not implemented for '%s'", storageType) //nolint:stylecheck + return fmt.Errorf("creating storage is not implemented for '%s'", storageType) } // ErrUpdateStorageNotSupported appears when trying to update a storage of a type that is not supported. func ErrUpdateStorageNotSupported(storageType string) error { - return fmt.Errorf("Updating storage is not implemented for '%s'", storageType) //nolint:stylecheck + return fmt.Errorf("updating storage is not implemented for '%s'", storageType) } // ErrInvalidURL when the given fieldName contains invalid URL. @@ -237,7 +237,7 @@ func validateCreateBackupStorageRequest(ctx echo.Context, l *zap.SugaredLogger) // check data access if err := validateStorageAccessByCreate(params); err != nil { l.Error(err) - return nil, errors.New("Could not connect to the backup storage, please check the new credentials are correct") //nolint:stylecheck + return nil, errors.New("could not connect to the backup storage, please check the new credentials are correct") } return ¶ms, nil @@ -360,7 +360,7 @@ func (e *EverestServer) validateDatabaseClusterCR(ctx echo.Context, kubernetesID } engineName, ok := operatorEngine[everestv1alpha1.EngineType(databaseCluster.Spec.Engine.Type)] if !ok { - return errors.New("Unsupported database engine") //nolint:stylecheck + return errors.New("unsupported database engine") } engine, err := kubeClient.GetDatabaseEngine(ctx.Request().Context(), engineName) if err != nil { @@ -384,7 +384,7 @@ func validateVersion(version *string, engine *everestv1alpha1.DatabaseEngine) er if version != nil { if len(engine.Spec.AllowedVersions) != 0 { if !containsVersion(*version, engine.Spec.AllowedVersions) { - return fmt.Errorf("Using %s version for %s is not allowed", *version, engine.Spec.Type) //nolint:stylecheck + return fmt.Errorf("using %s version for %s is not allowed", *version, engine.Spec.Type) } return nil } diff --git a/api/validation_test.go b/api/validation_test.go index fd9b255a..f36bbf70 100644 --- a/api/validation_test.go +++ b/api/validation_test.go @@ -16,11 +16,11 @@ package api import ( "encoding/json" + "errors" "testing" "github.com/AlekSi/pointer" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -367,7 +367,7 @@ func TestValidateVersion(t *testing.T) { AllowedVersions: []string{"8.0.31"}, }, }, - err: errors.New("Using 8.0.32 version for pxc is not allowed"), + err: errors.New("using 8.0.32 version for pxc is not allowed"), }, } for _, tc := range cases { diff --git a/cmd/main.go b/cmd/main.go index 89089748..39da2e47 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -17,13 +17,13 @@ package main import ( "context" + "errors" "net/http" "os" "os/signal" "time" "github.com/go-logr/zapr" - "github.com/pkg/errors" "go.uber.org/zap" ctrlruntimelog "sigs.k8s.io/controller-runtime/pkg/log" @@ -71,7 +71,7 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { - l.Error(errors.Wrap(err, "could not shut down Everest")) + l.Error(errors.Join(err, errors.New("could not shut down Everest"))) } else { l.Info("Everest shut down") } diff --git a/go.mod b/go.mod index a99fc99d..a62c6cba 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( github.com/labstack/echo/v4 v4.11.1 github.com/lib/pq v1.10.9 github.com/percona/everest-operator v0.0.16 - github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.25.0 k8s.io/api v0.28.1 @@ -76,6 +75,7 @@ require ( github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/pelletier/go-toml/v2 v2.0.9 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect diff --git a/model/backup_storage.go b/model/backup_storage.go index 8d8d2532..bf91bc3f 100644 --- a/model/backup_storage.go +++ b/model/backup_storage.go @@ -17,11 +17,11 @@ package model import ( "context" + "errors" "fmt" "time" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" - "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" ) @@ -50,11 +50,11 @@ func (b *BackupStorage) SecretName() string { func (b *BackupStorage) Secrets(ctx context.Context, getSecret func(ctx context.Context, id string) (string, error)) (map[string]string, error) { secretKey, err := getSecret(ctx, b.SecretKeyID) if err != nil { - return nil, errors.Wrap(err, "Failed to get secretKey") + return nil, errors.Join(err, errors.New("failed to get secretKey")) } accessKey, err := getSecret(ctx, b.AccessKeyID) if err != nil { - return nil, errors.Wrap(err, "Failed to get accessKey") + return nil, errors.Join(err, errors.New("failed to get accessKey")) } return map[string]string{ "AWS_SECRET_ACCESS_KEY": secretKey, diff --git a/model/backup_storage_helpers.go b/model/backup_storage_helpers.go index 01ff4344..39bffb9f 100644 --- a/model/backup_storage_helpers.go +++ b/model/backup_storage_helpers.go @@ -17,9 +17,9 @@ package model import ( "context" + "errors" "github.com/jinzhu/gorm" - "github.com/pkg/errors" ) // CreateBackupStorageParams parameters for BackupStorage record creation. @@ -124,7 +124,7 @@ func (db *Database) UpdateBackupStorage(_ context.Context, tx *gorm.DB, params U // Updates only non-empty fields defined in record if err = target.Model(old).Where("name = ?", params.Name).Updates(record).Error; err != nil { - return errors.Wrap(err, "could not update backup storage") + return errors.Join(err, errors.New("could not update backup storage")) } return nil diff --git a/model/database.go b/model/database.go index 2fedcefb..89d552c1 100644 --- a/model/database.go +++ b/model/database.go @@ -20,6 +20,7 @@ package model import ( "context" "database/sql" + "errors" "fmt" "github.com/golang-migrate/migrate/v4" @@ -27,7 +28,6 @@ import ( _ "github.com/golang-migrate/migrate/v4/source/file" // driver for loading migrations files "github.com/jinzhu/gorm" _ "github.com/lib/pq" // postgresql driver - "github.com/pkg/errors" "go.uber.org/zap" "github.com/percona/percona-everest-backend/cmd/config" @@ -45,7 +45,7 @@ func OpenDB(dsn string) (*gorm.DB, error) { db, err := gorm.Open("postgres", dsn) db.LogMode(config.Debug) if err != nil { - return nil, errors.Wrap(err, "failed to create a connection pool to PostgreSQL") + return nil, errors.Join(err, errors.New("failed to create a connection pool to PostgreSQL")) } return db, nil } @@ -56,7 +56,7 @@ func NewDatabase(name, dsn, migrationsDir string) (*Database, error) { db, err := OpenDB(dsn) if err != nil { - return nil, errors.Wrap(err, "failed to connect to database") + return nil, errors.Join(err, errors.New("failed to connect to database")) } return &Database{ @@ -91,21 +91,21 @@ func (db *Database) Transaction(fn func(tx *gorm.DB) error) error { func (db *Database) Migrate() (uint, error) { pgInstace, err := postgres.WithInstance(db.gormDB.DB(), &postgres.Config{}) if err != nil { - return 0, errors.Wrap(err, "failed to setup migrator driver") + return 0, errors.Join(err, errors.New("failed to setup migrator driver")) } m, err := migrate.NewWithDatabaseInstance("file://"+db.dir, "", pgInstace) if err != nil { - return 0, errors.Wrap(err, "failed to setup migrator") + return 0, errors.Join(err, errors.New("failed to setup migrator")) } if err = m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { - return 0, errors.Wrap(err, "failed to apply") + return 0, errors.Join(err, errors.New("failed to apply")) } v, dirty, err := m.Version() if err != nil { - return 0, errors.Wrap(err, "failed to check version") + return 0, errors.Join(err, errors.New("failed to check version")) } if dirty { return 0, errors.New("database is dirty; manual fix is required") diff --git a/model/monitoring_instance.go b/model/monitoring_instance.go index 1bfa4501..cb6902d8 100644 --- a/model/monitoring_instance.go +++ b/model/monitoring_instance.go @@ -22,7 +22,6 @@ import ( "time" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" - "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" ) @@ -84,7 +83,7 @@ func (m *MonitoringInstance) K8sResource( //nolint:ireturn Image: "percona/pmm-client:2", } default: - return nil, errors.Errorf("monitoring instance type %s not supported", m.Type) + return nil, fmt.Errorf("monitoring instance type %s not supported", m.Type) } return mc, nil diff --git a/model/monitoring_instance_helpers.go b/model/monitoring_instance_helpers.go index 137c504a..0d11ac51 100644 --- a/model/monitoring_instance_helpers.go +++ b/model/monitoring_instance_helpers.go @@ -17,8 +17,9 @@ package model import ( + "errors" + "github.com/jinzhu/gorm" - "github.com/pkg/errors" ) // UpdateMonitoringInstanceParams stores fields to be updated in monitoring instance. diff --git a/pkg/configs/configs.go b/pkg/configs/configs.go index 9805335e..4ec7b82d 100644 --- a/pkg/configs/configs.go +++ b/pkg/configs/configs.go @@ -18,9 +18,9 @@ package configs import ( "context" + "errors" "sync" - "github.com/pkg/errors" "go.uber.org/zap" "github.com/percona/percona-everest-backend/model" @@ -56,7 +56,7 @@ func DeleteConfigFromK8sClusters( _, kubeClient, _, err := initKubeClient(ctx, k.ID) if err != nil { - l.Error(errors.Wrap(err, "could not init kube client for config")) + l.Error(errors.Join(err, errors.New("could not init kube client for config"))) return } @@ -64,7 +64,7 @@ func DeleteConfigFromK8sClusters( return isInUse(ctx, name, kubeClient) }) if err != nil && !errors.Is(err, kubernetes.ErrConfigInUse) { - l.Error(errors.Wrap(err, "could not delete config")) + l.Error(errors.Join(err, errors.New("could not delete config"))) return } }() @@ -88,12 +88,12 @@ func UpdateConfigInAllK8sClusters( _, kubeClient, _, err := initKubeClient(ctx, k.ID) if err != nil { - l.Error(errors.Wrap(err, "could not init kube client to update config")) + l.Error(errors.Join(err, errors.New("could not init kube client to update config"))) return } if err := kubeClient.UpdateConfig(ctx, cfg, getSecret); err != nil { - l.Error(errors.Wrap(err, "could not update config")) + l.Error(errors.Join(err, errors.New("could not update config"))) return } }() diff --git a/pkg/convertors/convertors.go b/pkg/convertors/convertors.go index b6481ae4..f51e6822 100644 --- a/pkg/convertors/convertors.go +++ b/pkg/convertors/convertors.go @@ -17,12 +17,11 @@ package convertors import ( + "fmt" "math" "strconv" "strings" "unicode" - - "github.com/pkg/errors" ) const ( @@ -78,7 +77,7 @@ func StrToBytes(memory string) (uint64, error) { } coeficient, ok := suffixMapping[suffix] if !ok { - return 0, errors.Errorf("suffix '%s' is not supported", suffix) + return 0, fmt.Errorf("suffix '%s' is not supported", suffix) } if suffix != "" { @@ -86,7 +85,7 @@ func StrToBytes(memory string) (uint64, error) { } value, err := strconv.ParseFloat(memory, 64) if err != nil { - return 0, errors.Errorf("given value '%s' is not a number", memory) + return 0, fmt.Errorf("given value '%s' is not a number", memory) } return uint64(math.Ceil(value * coeficient)), nil } diff --git a/pkg/kubernetes/backup_storage.go b/pkg/kubernetes/backup_storage.go index 0e26145a..bb683b69 100644 --- a/pkg/kubernetes/backup_storage.go +++ b/pkg/kubernetes/backup_storage.go @@ -2,9 +2,9 @@ package kubernetes import ( "context" + "errors" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" - "github.com/pkg/errors" ) // IsBackupStorageConfigInUse returns true if the backup storage is in use @@ -12,7 +12,7 @@ import ( func IsBackupStorageConfigInUse(ctx context.Context, name string, kubeClient *Kubernetes) (bool, error) { //nolint:cyclop dbs, err := kubeClient.ListDatabaseClusters(ctx) if err != nil { - return false, errors.Wrap(err, "could not list database clusters in Kubernetes") + return false, errors.Join(err, errors.New("could not list database clusters in Kubernetes")) } for _, db := range dbs.Items { @@ -25,7 +25,7 @@ func IsBackupStorageConfigInUse(ctx context.Context, name string, kubeClient *Ku backups, err := kubeClient.ListDatabaseClusterBackups(ctx) if err != nil { - return false, errors.Wrap(err, "could not list database cluster backups in Kubernetes") + return false, errors.Join(err, errors.New("could not list database cluster backups in Kubernetes")) } for _, b := range backups.Items { if b.Spec.BackupStorageName == name { @@ -35,7 +35,7 @@ func IsBackupStorageConfigInUse(ctx context.Context, name string, kubeClient *Ku restores, err := kubeClient.ListDatabaseClusterRestores(ctx) if err != nil { - return false, errors.Wrap(err, "could not list database cluster restores in Kubernetes") + return false, errors.Join(err, errors.New("could not list database cluster restores in Kubernetes")) } for _, restore := range restores.Items { diff --git a/pkg/kubernetes/client/client.go b/pkg/kubernetes/client/client.go index 88dfeb24..0def3211 100644 --- a/pkg/kubernetes/client/client.go +++ b/pkg/kubernetes/client/client.go @@ -17,9 +17,9 @@ package client import ( + "errors" "time" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -213,7 +213,7 @@ func deleteObject(helper *resource.Helper, namespace, name string) error { func (c *Client) ListObjects(gvk schema.GroupVersionKind, into runtime.Object) error { helper, err := c.helperForGVK(gvk) if err != nil { - return errors.Wrap(err, "could not create helper") + return errors.Join(err, errors.New("could not create helper")) } l, err := helper.List(c.namespace, gvk.Version, &metav1.ListOptions{}) @@ -233,17 +233,17 @@ func (c *Client) ListObjects(gvk schema.GroupVersionKind, into runtime.Object) e func (c *Client) GetObject(gvk schema.GroupVersionKind, name string, into runtime.Object) error { helper, err := c.helperForGVK(gvk) if err != nil { - return errors.Wrap(err, "could not create helper") + return errors.Join(err, errors.New("could not create helper")) } l, err := helper.Get(c.namespace, name) if err != nil { - return errors.Wrap(err, "failed to get object using helper") + return errors.Join(err, errors.New("failed to get object using helper")) } u, err := runtime.DefaultUnstructuredConverter.ToUnstructured(l) if err != nil { - return errors.Wrap(err, "failed to convert object to unstructured") + return errors.Join(err, errors.New("failed to convert object to unstructured")) } return runtime.DefaultUnstructuredConverter.FromUnstructured(u, into) diff --git a/pkg/kubernetes/client/customresources/resource.go b/pkg/kubernetes/client/customresources/resource.go index f83e6f21..2eb50043 100644 --- a/pkg/kubernetes/client/customresources/resource.go +++ b/pkg/kubernetes/client/customresources/resource.go @@ -17,9 +17,9 @@ package customresources import ( "context" + "errors" "strings" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -41,7 +41,7 @@ func (c *Client) objectKind(obj runtime.Object) (schema.GroupVersionKind, error) gvks, _, err := scheme.Scheme.ObjectKinds(obj) if err != nil { - return schema.GroupVersionKind{}, errors.Wrap(err, "could not retrieve object kinds") + return schema.GroupVersionKind{}, errors.Join(err, errors.New("could not retrieve object kinds")) } if len(gvks) != 1 { @@ -139,7 +139,7 @@ func (c *Client) DeleteResource( acc := meta.NewAccessor() name, err := acc.Name(obj) if err != nil { - return errors.Wrap(err, "could not get name from an object to delete") + return errors.Join(err, errors.New("could not get name from an object to delete")) } err = c.restClient. diff --git a/pkg/kubernetes/configs.go b/pkg/kubernetes/configs.go index 78e771f5..9039b64a 100644 --- a/pkg/kubernetes/configs.go +++ b/pkg/kubernetes/configs.go @@ -2,10 +2,10 @@ package kubernetes import ( "context" + "errors" "fmt" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" @@ -29,7 +29,7 @@ type ConfigK8sResourcer interface { } // ErrConfigInUse is returned when a config is in use. -var ErrConfigInUse error = errors.New("config is in use") +var ErrConfigInUse = errors.New("config is in use") // EnsureConfigExists makes sure a config resource for the provided object // exists in Kubernetes. If it does not, it is created. @@ -39,18 +39,18 @@ func (k *Kubernetes) EnsureConfigExists( ) error { config, err := cfg.K8sResource(k.namespace) if err != nil { - return errors.Wrap(err, "could not get Kubernetes resource object") + return errors.Join(err, errors.New("could not get Kubernetes resource object")) } acc := meta.NewAccessor() name, err := acc.Name(config) if err != nil { - return errors.Wrap(err, "could not get name from a config object") + return errors.Join(err, errors.New("could not get name from a config object")) } r, err := cfg.K8sResource(k.namespace) if err != nil { - return errors.Wrap(err, "could not get Kubernetes resource object") + return errors.Join(err, errors.New("could not get Kubernetes resource object")) } err = k.client.GetResource(ctx, name, r, &metav1.GetOptions{}) @@ -59,17 +59,17 @@ func (k *Kubernetes) EnsureConfigExists( } if !k8serrors.IsNotFound(err) { - return errors.Wrap(err, "could not get config from Kubernetes") + return errors.Join(err, errors.New("could not get config from Kubernetes")) } cfgSecrets, err := cfg.Secrets(ctx, getSecret) if err != nil { - return errors.Wrap(err, "could not get config secrets from secrets storage") + return errors.Join(err, errors.New("could not get config secrets from secrets storage")) } err = k.createConfigWithSecret(ctx, cfg.SecretName(), config, cfgSecrets) if err != nil { - return errors.Wrap(err, "could not create a config with secret") + return errors.Join(err, errors.New("could not create a config with secret")) } return nil @@ -82,18 +82,18 @@ func (k *Kubernetes) UpdateConfig( ) error { config, err := cfg.K8sResource(k.namespace) if err != nil { - return errors.Wrap(err, "could not get Kubernetes resource object") + return errors.Join(err, errors.New("could not get Kubernetes resource object")) } acc := meta.NewAccessor() name, err := acc.Name(config) if err != nil { - return errors.Wrap(err, "could not get name from a config object") + return errors.Join(err, errors.New("could not get name from a config object")) } r, err := cfg.K8sResource(k.namespace) if err != nil { - return errors.Wrap(err, "could not get Kubernetes resource object") + return errors.Join(err, errors.New("could not get Kubernetes resource object")) } err = k.client.GetResource(ctx, name, r, &metav1.GetOptions{}) @@ -102,17 +102,17 @@ func (k *Kubernetes) UpdateConfig( return nil } - return errors.Wrap(err, "could not get config resource from Kubernetes") + return errors.Join(err, errors.New("could not get config resource from Kubernetes")) } cfgSecrets, err := cfg.Secrets(ctx, getSecret) if err != nil { - return errors.Wrap(err, "could not get config secrets from secrets storage") + return errors.Join(err, errors.New("could not get config secrets from secrets storage")) } err = k.updateConfigWithSecret(ctx, cfg.SecretName(), config, cfgSecrets) if err != nil { - return errors.Wrap(err, "could not update config with secrets in Kubernetes") + return errors.Join(err, errors.New("could not update config with secrets in Kubernetes")) } return nil @@ -128,29 +128,29 @@ func (k *Kubernetes) DeleteConfig( config, err := cfg.K8sResource(k.namespace) if err != nil { - return errors.Wrap(err, "could not get Kubernetes resource object") + return errors.Join(err, errors.New("could not get Kubernetes resource object")) } acc := meta.NewAccessor() name, err := acc.Name(config) if err != nil { - return errors.Wrap(err, "could not get name from a config object") + return errors.Join(err, errors.New("could not get name from a config object")) } k.l.Debugf("Checking if config %s is in use", name) used, err := isInUse(ctx, name) if err != nil { - return errors.Wrap(err, "could not check if config is in use") + return errors.Join(err, errors.New("could not check if config is in use")) } if used { - return errors.Wrapf(ErrConfigInUse, "config %s in use", name) + return errors.Join(ErrConfigInUse, fmt.Errorf("config %s in use", name)) } k.l.Debugf("Deleting config %s", name) err = k.client.DeleteResource(ctx, config, &metav1.DeleteOptions{}) if err != nil && !k8serrors.IsNotFound(err) { - return errors.Wrap(err, "could not delete Kubernetes config object") + return errors.Join(err, errors.New("could not delete Kubernetes config object")) } go func() { @@ -159,7 +159,7 @@ func (k *Kubernetes) DeleteConfig( if secretName != "" { err := k.DeleteSecret(ctx, secretName, k.namespace) if err != nil && !k8serrors.IsNotFound(err) { - k.l.Error(errors.Wrapf(err, "could not delete secret %s for config %s", secretName, name)) + k.l.Error(errors.Join(err, fmt.Errorf("could not delete secret %s for config %s", secretName, name))) } } }() @@ -207,7 +207,7 @@ func (k *Kubernetes) updateConfigWithSecret( ) error { oldSecret, err := k.GetSecret(ctx, secretName, k.namespace) if err != nil { - return errors.Wrap(err, fmt.Sprintf("Failed to read secret %s", secretName)) + return errors.Join(err, fmt.Errorf("failed to read secret %s", secretName)) } secret := &corev1.Secret{ @@ -227,10 +227,10 @@ func (k *Kubernetes) updateConfigWithSecret( // rollback the changes _, err := k.UpdateSecret(ctx, oldSecret) if err != nil { - k.l.Error(errors.Wrapf(err, "could not revert back secret %s", oldSecret.Name)) + k.l.Error(errors.Join(err, fmt.Errorf("could not revert back secret %s", oldSecret.Name))) } - return errors.Wrap(err, "could not update config in Kubernetes") + return errors.Join(err, errors.New("could not update config in Kubernetes")) } return nil diff --git a/pkg/kubernetes/kubernetes.go b/pkg/kubernetes/kubernetes.go index 68e68405..d73f8030 100644 --- a/pkg/kubernetes/kubernetes.go +++ b/pkg/kubernetes/kubernetes.go @@ -19,9 +19,9 @@ package kubernetes import ( "context" "encoding/base64" + "errors" "strings" - "github.com/pkg/errors" "go.uber.org/zap" "github.com/percona/percona-everest-backend/pkg/kubernetes/client" @@ -78,11 +78,11 @@ func NewFromSecretsStorage( ) (*Kubernetes, error) { kubeconfigBase64, err := secretGetter.GetSecret(ctx, kubernetesID) if err != nil { - return nil, errors.Wrap(err, "could not get kubeconfig from secrets storage") + return nil, errors.Join(err, errors.New("could not get kubeconfig from secrets storage")) } kubeconfig, err := base64.StdEncoding.DecodeString(kubeconfigBase64) if err != nil { - return nil, errors.Wrap(err, "could not decode base64 kubeconfig") + return nil, errors.Join(err, errors.New("could not decode base64 kubeconfig")) } return New(kubeconfig, namespace, l) diff --git a/pkg/kubernetes/monitoring_config.go b/pkg/kubernetes/monitoring_config.go index 81a3e25c..4a313f72 100644 --- a/pkg/kubernetes/monitoring_config.go +++ b/pkg/kubernetes/monitoring_config.go @@ -17,14 +17,14 @@ package kubernetes import ( "context" + "errors" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) // ErrMonitoringConfigInUse is returned when a monitoring config is in use. -var ErrMonitoringConfigInUse error = errors.New("monitoring config is in use") +var ErrMonitoringConfigInUse = errors.New("monitoring config is in use") // DeleteMonitoringConfig deletes a MonitoringConfig. func (k *Kubernetes) DeleteMonitoringConfig(ctx context.Context, name, secretName string) error { @@ -32,14 +32,14 @@ func (k *Kubernetes) DeleteMonitoringConfig(ctx context.Context, name, secretNam used, err := IsMonitoringConfigInUse(ctx, name, k) if err != nil { - return errors.Wrap(err, "could not check if monitoring config is in use") + return errors.Join(err, errors.New("could not check if monitoring config is in use")) } if used { return ErrMonitoringConfigInUse } if err := k.client.DeleteMonitoringConfig(ctx, name); err != nil { - return errors.Wrap(err, "could not delete monitoring config") + return errors.Join(err, errors.New("could not delete monitoring config")) } if secretName == "" { @@ -84,7 +84,7 @@ func IsMonitoringConfigInUse(ctx context.Context, name string, kubeClient *Kuber dbs, err := kubeClient.ListDatabaseClusters(ctx) if err != nil { - return false, errors.Wrap(err, "could not list database clusters in Kubernetes") + return false, errors.Join(err, errors.New("could not list database clusters in Kubernetes")) } for _, db := range dbs.Items { @@ -99,7 +99,7 @@ func IsMonitoringConfigInUse(ctx context.Context, name string, kubeClient *Kuber func (k *Kubernetes) isMonitoringConfigUsedByVMAgent(ctx context.Context, name string) (bool, error) { vmAgents, err := k.ListVMAgents() if err != nil { - return false, errors.Wrap(err, "could not list VM agents in Kubernetes") + return false, errors.Join(err, errors.New("could not list VM agents in Kubernetes")) } secretNames := make([]string, 0, len(vmAgents.Items)) diff --git a/pkg/kubernetes/node.go b/pkg/kubernetes/node.go index 3c277899..1492fd7e 100644 --- a/pkg/kubernetes/node.go +++ b/pkg/kubernetes/node.go @@ -2,8 +2,8 @@ package kubernetes import ( "context" + "errors" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" ) @@ -11,7 +11,7 @@ import ( func (k *Kubernetes) GetWorkerNodes(ctx context.Context) ([]corev1.Node, error) { nodes, err := k.client.GetNodes(ctx) if err != nil { - return nil, errors.Wrap(err, "could not get nodes of Kubernetes cluster") + return nil, errors.Join(err, errors.New("could not get nodes of Kubernetes cluster")) } forbidenTaints := map[string]corev1.TaintEffect{ "node.cloudprovider.kubernetes.io/uninitialized": corev1.TaintEffectNoSchedule, diff --git a/pkg/kubernetes/resources.go b/pkg/kubernetes/resources.go index d31280b5..fdb16446 100644 --- a/pkg/kubernetes/resources.go +++ b/pkg/kubernetes/resources.go @@ -2,16 +2,19 @@ package kubernetes import ( "context" + "errors" + "fmt" "strings" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" "github.com/percona/percona-everest-backend/pkg/convertors" ) -// Max size of volume for AWS Elastic Block Storage service is 16TiB. -const maxVolumeSizeEBS uint64 = 16 * 1024 * 1024 * 1024 * 1024 +const ( + // Max size of volume for AWS Elastic Block Storage service is 16TiB. + maxVolumeSizeEBS uint64 = 16 * 1024 * 1024 * 1024 * 1024 +) // GetAllClusterResources goes through all cluster nodes and sums their allocatable resources. func (k *Kubernetes) GetAllClusterResources( @@ -32,7 +35,7 @@ func (k *Kubernetes) GetAllClusterResources( consumedBytes, err := sumVolumesSize(volumes) if err != nil { - return 0, 0, 0, errors.Wrap(err, "failed to sum persistent volumes storage sizes") + return 0, 0, 0, errors.Join(err, errors.New("failed to sum persistent volumes storage sizes")) } diskSizeBytes = (volumeCountEKS * maxVolumeSizeEBS) + consumedBytes } @@ -44,20 +47,20 @@ func (k *Kubernetes) getResourcesFromNodes(ctx context.Context, clusterType Clus nodes, err := k.GetWorkerNodes(ctx) if err != nil { - return 0, 0, 0, 0, errors.Wrap(err, "could not get a list of nodes") + return 0, 0, 0, 0, errors.Join(err, errors.New("could not get a list of nodes")) } var volumeCountEKS uint64 for _, node := range nodes { cpu, memory, err := getResources(node.Status.Allocatable) if err != nil { - return 0, 0, 0, 0, errors.Wrap(err, "could not get allocatable resources of the node") + return 0, 0, 0, 0, errors.Join(err, errors.New("could not get allocatable resources of the node")) } cpuMillis += cpu memoryBytes += memory switch clusterType { case ClusterTypeUnknown: - return 0, 0, 0, 0, errors.Errorf("unknown cluster type") + return 0, 0, 0, 0, errors.New("unknown cluster type") case ClusterTypeGeneric: // TODO support other cluster types continue @@ -96,7 +99,7 @@ func (k *Kubernetes) getEKSVolumeCount(node corev1.Node) (uint64, error) { volumeLimitPerNode := uint64(39) typeAndSize := strings.Split(strings.ToLower(nodeType), ".") if len(typeAndSize) < 2 { - return 0, errors.Errorf("failed to parse EKS node type '%s', it's not in expected format 'type.size'", nodeType) + return 0, fmt.Errorf("failed to parse EKS node type '%s', it's not in expected format 'type.size'", nodeType) } // ... however, if the node type is one of M5, C5, R5, T3, Z1D it's 25. limitedVolumesSet := map[string]struct{}{ @@ -113,11 +116,11 @@ func (k *Kubernetes) getEKSVolumeCount(node corev1.Node) (uint64, error) { func (k *Kubernetes) getMinikubeDiskSizeBytes(node corev1.Node) (uint64, error) { storage, ok := node.Status.Allocatable[corev1.ResourceEphemeralStorage] if !ok { - return 0, errors.Errorf("could not get storage size of the node") + return 0, errors.New("could not get storage size of the node") } bytes, err := convertors.StrToBytes(storage.String()) if err != nil { - return 0, errors.Wrapf(err, "could not convert storage size '%s' to bytes", storage.String()) + return 0, errors.Join(err, fmt.Errorf("could not convert storage size '%s' to bytes", storage.String())) } return bytes, err } @@ -129,14 +132,14 @@ func getResources(resources corev1.ResourceList) (cpuMillis uint64, memoryBytes if ok { cpuMillis, err = convertors.StrToMilliCPU(cpu.String()) if err != nil { - return 0, 0, errors.Wrapf(err, "failed to convert '%s' to millicpus", cpu.String()) + return 0, 0, errors.Join(err, fmt.Errorf("failed to convert '%s' to millicpus", cpu.String())) } } memory, ok := resources[corev1.ResourceMemory] if ok { memoryBytes, err = convertors.StrToBytes(memory.String()) if err != nil { - return 0, 0, errors.Wrapf(err, "failed to convert '%s' to bytes", memory.String()) + return 0, 0, errors.Join(err, fmt.Errorf("failed to convert '%s' to bytes", memory.String())) } } return cpuMillis, memoryBytes, nil @@ -162,7 +165,7 @@ func (k *Kubernetes) GetConsumedCPUAndMemory(ctx context.Context, namespace stri // Get CPU and Memory Requests of Pods' containers. pods, err := k.GetPods(ctx, namespace, nil) if err != nil { - return 0, 0, errors.Wrap(err, "failed to get consumed resources") + return 0, 0, errors.Join(err, errors.New("failed to get consumed resources")) } for _, ppod := range pods.Items { if ppod.Status.Phase != corev1.PodRunning { @@ -179,7 +182,7 @@ func (k *Kubernetes) GetConsumedCPUAndMemory(ctx context.Context, namespace stri for _, container := range append(ppod.Spec.Containers, nonTerminatedInitContainers...) { cpu, memory, err := getResources(container.Resources.Requests) if err != nil { - return 0, 0, errors.Wrap(err, "failed to sum all consumed resources") + return 0, 0, errors.Join(err, errors.New("failed to sum all consumed resources")) } cpuMillis += cpu memoryBytes += memory @@ -195,7 +198,7 @@ func (k *Kubernetes) GetConsumedDiskBytes( ) (uint64, error) { switch clusterType { case ClusterTypeUnknown: - return 0, errors.Errorf("unknown cluster type") + return 0, errors.New("unknown cluster type") case ClusterTypeGeneric: // TODO support other cluster types. return 0, nil @@ -205,7 +208,7 @@ func (k *Kubernetes) GetConsumedDiskBytes( case ClusterTypeEKS: consumedBytes, err := sumVolumesSize(volumes) if err != nil { - return 0, errors.Wrap(err, "failed to sum persistent volumes storage sizes") + return 0, errors.Join(err, errors.New("failed to sum persistent volumes storage sizes")) } return consumedBytes, nil } diff --git a/pkg/kubernetes/vmagent.go b/pkg/kubernetes/vmagent.go index bf1cc440..c1e9d9b7 100644 --- a/pkg/kubernetes/vmagent.go +++ b/pkg/kubernetes/vmagent.go @@ -18,9 +18,9 @@ package kubernetes import ( "context" "encoding/json" + "errors" "fmt" - "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -49,18 +49,18 @@ func (k *Kubernetes) DeployVMAgent(ctx context.Context, secretName, monitoringUR }) if err != nil && !k8serrors.IsAlreadyExists(err) { - return errors.Wrap(err, "could not create VMAgent username secret") + return errors.Join(err, errors.New("could not create VMAgent username secret")) } k.l.Debug("Applying VMAgent spec") vmagent, err := vmAgentSpec(k.namespace, secretName, monitoringURL) if err != nil { - return errors.Wrap(err, "cannot generate VMAgent spec") + return errors.Join(err, errors.New("cannot generate VMAgent spec")) } err = k.client.ApplyObject(vmagent) if err != nil && !k8serrors.IsAlreadyExists(err) { - return errors.Wrap(err, "cannot apply VMAgent spec") + return errors.Join(err, errors.New("cannot apply VMAgent spec")) } k.l.Debug("VMAgent spec has been applied") @@ -71,12 +71,12 @@ func (k *Kubernetes) DeployVMAgent(ctx context.Context, secretName, monitoringUR func (k *Kubernetes) DeleteVMAgent() error { vmagent, err := vmAgentSpec(k.namespace, "", "") if err != nil { - return errors.Wrap(err, "cannot generate VMAgent spec") + return errors.Join(err, errors.New("cannot generate VMAgent spec")) } err = k.client.DeleteObject(vmagent) if err != nil { - return errors.Wrap(err, "cannot delete VMAgent") + return errors.Join(err, errors.New("cannot delete VMAgent")) } return nil diff --git a/pkg/pmm/apikey.go b/pkg/pmm/apikey.go index a9bea304..f94ffd5a 100644 --- a/pkg/pmm/apikey.go +++ b/pkg/pmm/apikey.go @@ -19,11 +19,10 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "net/http" - - "github.com/pkg/errors" ) // CreatePMMApiKey creates a new API key in PMM by using the provided username and password. @@ -63,9 +62,9 @@ func CreatePMMApiKey(ctx context.Context, hostname, apiKeyName, user, password s if resp.StatusCode >= http.StatusBadRequest { var pmmErr *pmmErrorMessage if err := json.Unmarshal(data, &pmmErr); err != nil { - return "", errors.Wrapf(err, "PMM returned an unknown error. HTTP status code %d", resp.StatusCode) + return "", errors.Join(err, fmt.Errorf("PMM returned an unknown error. HTTP status code %d", resp.StatusCode)) } - return "", errors.Errorf("PMM returned an error with message: %s", pmmErr.Message) + return "", fmt.Errorf("PMM returned an error with message: %s", pmmErr.Message) } var m map[string]interface{} From eacb7508a2cc9b0bccffb7d53e4957c50da57e72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 16:08:08 +0600 Subject: [PATCH 06/11] Bump github.com/percona/everest-operator from 0.0.16 to 0.0.21 (#177) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index a62c6cba..9e8ba3e1 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,13 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/labstack/echo/v4 v4.11.1 github.com/lib/pq v1.10.9 - github.com/percona/everest-operator v0.0.16 + github.com/percona/everest-operator v0.0.21 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.25.0 - k8s.io/api v0.28.1 - k8s.io/apimachinery v0.28.1 + k8s.io/api v0.28.2 + k8s.io/apimachinery v0.28.2 k8s.io/cli-runtime v0.28.0 - k8s.io/client-go v0.28.1 + k8s.io/client-go v0.28.2 sigs.k8s.io/controller-runtime v0.15.1 ) diff --git a/go.sum b/go.sum index f3b2acf0..e79305dc 100644 --- a/go.sum +++ b/go.sum @@ -236,8 +236,8 @@ github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7X github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/percona/everest-operator v0.0.16 h1:/MlMOvgHg/a+H7jxHQVZGoHWP4bmVpxutA+irnYSCEc= -github.com/percona/everest-operator v0.0.16/go.mod h1:r6DYgk7+s4Wrcyxy0eQEjW6HGYQarC1N+s0arQKfihg= +github.com/percona/everest-operator v0.0.21 h1:EQr0Utc8rL5g9Q2Z//+DPXZi3lU85E8T7uXTW/MtDyI= +github.com/percona/everest-operator v0.0.21/go.mod h1:n1IXu/uui4BRlx85Dzm7DR3x9aY7u0sC058bq6FWbZI= github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= @@ -444,14 +444,14 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.28.1 h1:i+0O8k2NPBCPYaMB+uCkseEbawEt/eFaiRqUx8aB108= -k8s.io/api v0.28.1/go.mod h1:uBYwID+66wiL28Kn2tBjBYQdEU0Xk0z5qF8bIBqk/Dg= -k8s.io/apimachinery v0.28.1 h1:EJD40og3GizBSV3mkIoXQBsws32okPOy+MkRyzh6nPY= -k8s.io/apimachinery v0.28.1/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw= +k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= +k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= +k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= +k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= 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.1 h1:pRhMzB8HyLfVwpngWKE8hDcXRqifh1ga2Z/PU9SXVK8= -k8s.io/client-go v0.28.1/go.mod h1:pEZA3FqOsVkCc07pFVzK076R+P/eXqsgx5zuuRWukNE= +k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= +k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= 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= From 292bdfc2e54d0cd9df9ef5cb9e280ecdd8a43620 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 16:08:25 +0600 Subject: [PATCH 07/11] Bump github.com/aws/aws-sdk-go from 1.44.328 to 1.45.14 (#176) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9e8ba3e1..6df3291d 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( github.com/AlekSi/pointer v1.2.0 - github.com/aws/aws-sdk-go v1.44.328 + github.com/aws/aws-sdk-go v1.45.14 github.com/deepmap/oapi-codegen v1.13.4 github.com/getkin/kin-openapi v0.118.0 github.com/go-logr/zapr v1.2.4 diff --git a/go.sum b/go.sum index e79305dc..ef8b1b11 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,8 @@ github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMz github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= -github.com/aws/aws-sdk-go v1.44.328 h1:WBwlf8ym9SDQ/GTIBO9eXyvwappKJyOetWJKl4mT7ZU= -github.com/aws/aws-sdk-go v1.44.328/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.14 h1:/IPMEh9oelbK7506fdMHkbV9mq4a6f5aeiy9OT0PRKw= +github.com/aws/aws-sdk-go v1.45.14/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= From 65d1bfdf01b80dc1c4c69bbf6ec1868b7071c716 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 16:09:45 +0600 Subject: [PATCH 08/11] Bump go.uber.org/zap from 1.25.0 to 1.26.0 (#173) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 6df3291d..71120239 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/lib/pq v1.10.9 github.com/percona/everest-operator v0.0.21 github.com/stretchr/testify v1.8.4 - go.uber.org/zap v1.25.0 + go.uber.org/zap v1.26.0 k8s.io/api v0.28.2 k8s.io/apimachinery v0.28.2 k8s.io/cli-runtime v0.28.0 diff --git a/go.sum b/go.sum index ef8b1b11..b6e096f6 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,6 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP github.com/aws/aws-sdk-go v1.45.14 h1:/IPMEh9oelbK7506fdMHkbV9mq4a6f5aeiy9OT0PRKw= github.com/aws/aws-sdk-go v1.45.14/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= @@ -298,8 +296,8 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= From b993f8837ec3b9606499d1babcc606c56285b0fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 16:10:09 +0600 Subject: [PATCH 09/11] Bump github.com/getkin/kin-openapi from 0.118.0 to 0.120.0 (#174) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 12 ++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 71120239..64570d28 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/AlekSi/pointer v1.2.0 github.com/aws/aws-sdk-go v1.45.14 github.com/deepmap/oapi-codegen v1.13.4 - github.com/getkin/kin-openapi v0.118.0 + github.com/getkin/kin-openapi v0.120.0 github.com/go-logr/zapr v1.2.4 github.com/golang-migrate/migrate/v4 v4.16.2 github.com/google/uuid v1.3.0 diff --git a/go.sum b/go.sum index b6e096f6..4139fe7b 100644 --- a/go.sum +++ b/go.sum @@ -58,8 +58,8 @@ github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCv github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/getkin/kin-openapi v0.118.0 h1:z43njxPmJ7TaPpMSCQb7PN0dEYno4tyBPQcrFdHoLuM= -github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= +github.com/getkin/kin-openapi v0.120.0 h1:MqJcNJFrMDFNc07iwE8iFC5eT2k/NPUFDIpNeiZv8Jg= +github.com/getkin/kin-openapi v0.120.0/go.mod h1:PCWw/lfBrJY4HcdqE3jj+QFkaFK8ABoqo7PvqVhXXqw= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= @@ -71,13 +71,11 @@ 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/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 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.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 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= @@ -151,7 +149,6 @@ github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mO github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= @@ -194,8 +191,6 @@ github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNa github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -236,7 +231,6 @@ github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/percona/everest-operator v0.0.21 h1:EQr0Utc8rL5g9Q2Z//+DPXZi3lU85E8T7uXTW/MtDyI= github.com/percona/everest-operator v0.0.21/go.mod h1:n1IXu/uui4BRlx85Dzm7DR3x9aY7u0sC058bq6FWbZI= -github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -269,8 +263,6 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= From 535420c4f97ce00b0c38bb41e520ee986bb6e851 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 16:15:14 +0600 Subject: [PATCH 10/11] Bump github.com/deepmap/oapi-codegen from 1.13.4 to 1.15.0 (#175) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 44 +++++++++++++++--- go.sum | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 163 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index 64570d28..c1af4cd2 100644 --- a/go.mod +++ b/go.mod @@ -5,11 +5,11 @@ go 1.21 require ( github.com/AlekSi/pointer v1.2.0 github.com/aws/aws-sdk-go v1.45.14 - github.com/deepmap/oapi-codegen v1.13.4 + github.com/deepmap/oapi-codegen v1.15.0 github.com/getkin/kin-openapi v0.120.0 github.com/go-logr/zapr v1.2.4 github.com/golang-migrate/migrate/v4 v4.16.2 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.3.1 github.com/jinzhu/gorm v1.9.16 github.com/kelseyhightower/envconfig v1.4.0 github.com/labstack/echo/v4 v4.11.1 @@ -25,13 +25,22 @@ require ( ) require ( + github.com/BurntSushi/toml v1.3.2 // indirect + github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 // indirect + github.com/CloudyKit/jet/v6 v6.2.0 // indirect + github.com/Joker/jade v1.1.3 // indirect + github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect + github.com/andybalholm/brotli v1.0.5 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/aymerick/douceur v0.2.0 // indirect github.com/bytedance/sonic v1.10.0-rc3 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/flosch/pongo2/v4 v4.0.2 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-gonic/gin v1.9.1 // indirect @@ -47,26 +56,39 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 // 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 + github.com/gorilla/css v1.0.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/invopop/yaml v0.2.0 // indirect + github.com/iris-contrib/schema v0.0.6 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kataras/blocks v0.0.7 // indirect + github.com/kataras/golog v0.1.9 // indirect + github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9 // indirect + github.com/kataras/pio v0.0.12 // indirect + github.com/kataras/sitemap v0.0.6 // indirect + github.com/kataras/tunnel v0.0.4 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/labstack/gommon v0.4.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect + github.com/mailgun/raymond/v2 v2.0.48 // 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.19 // indirect + github.com/microcosm-cc/bluemonday v1.0.25 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect @@ -77,30 +99,38 @@ require ( github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/schollz/closestmatch v2.1.0+incompatible // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect + github.com/tdewolff/minify/v2 v2.12.9 // indirect + github.com/tdewolff/parse/v2 v2.6.8 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xlab/treeprint v1.2.0 // indirect + github.com/yosssi/ace v0.0.5 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/crypto v0.13.0 // indirect + golang.org/x/net v0.15.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/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.100.1 // indirect diff --git a/go.sum b/go.sum index 4139fe7b..08ebfc4f 100644 --- a/go.sum +++ b/go.sum @@ -4,15 +4,33 @@ github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tS 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.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/aws/aws-sdk-go v1.45.14 h1:/IPMEh9oelbK7506fdMHkbV9mq4a6f5aeiy9OT0PRKw= github.com/aws/aws-sdk-go v1.45.14/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -34,8 +52,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 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/deepmap/oapi-codegen v1.13.4 h1:lRRQ8JAXaz5/4oidKFyk3fFZFQsbv0BzRtvDKDnvIfM= -github.com/deepmap/oapi-codegen v1.13.4/go.mod h1:/h5nFQbTAMz4S/WtBz8sBfamlGByYKDr21O2uoNgCYI= +github.com/deepmap/oapi-codegen v1.15.0 h1:SQqViaeb4k2vMul8gx12oDOIadEtoRqTdLkxjzqtQ90= +github.com/deepmap/oapi-codegen v1.15.0/go.mod h1:a6KoHV7lMRwsPoEg2C6NDHiXYV3EQfiFocOlJ8dgJQE= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dhui/dktest v0.3.16 h1:i6gq2YQEtcrjKbeJpBkWjE8MmLZPYllcjOFbTZuPDnw= @@ -56,6 +74,12 @@ github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DP github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= 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/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/getkin/kin-openapi v0.120.0 h1:MqJcNJFrMDFNc07iwE8iFC5eT2k/NPUFDIpNeiZv8Jg= @@ -94,6 +118,8 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEe github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +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.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -118,6 +144,10 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 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.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E= +github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= 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= @@ -129,6 +159,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 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= @@ -136,10 +168,14 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJY github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 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.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= 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.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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= @@ -149,8 +185,14 @@ github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mO github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/iris-contrib/httpexpect/v2 v2.15.2 h1:T9THsdP1woyAqKHwjkEsbCnMefsAFvk8iJJKokcJ3Go= +github.com/iris-contrib/httpexpect/v2 v2.15.2/go.mod h1:JLDgIqnFy5loDSUv1OA2j0mb6p/rDhiCqigP22Uq9xE= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -166,10 +208,24 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF 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/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk= +github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= +github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9 h1:Vx8kDVhO2qepK8w44lBtp+RzN3ld743i+LYPzODJSpQ= +github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9/go.mod h1:ldkoR3iXABBeqlTibQ3MYaviA1oSlPvim6f55biwBh4= +github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w= +github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= 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.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/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -191,6 +247,8 @@ github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNa github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -203,6 +261,10 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= +github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= +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/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= @@ -218,6 +280,7 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= 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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= @@ -239,10 +302,17 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +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/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +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/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -252,8 +322,10 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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.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= @@ -261,6 +333,12 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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/tdewolff/minify/v2 v2.12.9 h1:dvn5MtmuQ/DFMwqf5j8QhEVpPX6fi3WGImhv8RUB4zA= +github.com/tdewolff/minify/v2 v2.12.9/go.mod h1:qOqdlDfL+7v0/fyymB+OP497nIxJYSvX4MQWA8OoiXU= +github.com/tdewolff/parse/v2 v2.6.8 h1:mhNZXYCx//xG7Yq2e/kVLNZw4YfYmeHbhx+Zc0OvFMA= +github.com/tdewolff/parse/v2 v2.6.8/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= +github.com/tdewolff/test v1.0.9 h1:SswqJCmeN4B+9gEAi/5uqT0qpi1y2/2O47V/1hhGZT0= +github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= @@ -270,11 +348,30 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +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/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.1.27/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= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= @@ -299,8 +396,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -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/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -309,6 +406,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl 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.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -317,6 +415,7 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/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-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -326,10 +425,11 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= 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= @@ -345,14 +445,17 @@ 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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/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-20211103235746-7861aae1554b/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -361,21 +464,22 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.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.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -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/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.0/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.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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -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/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -387,6 +491,7 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= @@ -419,10 +524,13 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw 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-20200902074654-038fdea0a05b/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/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.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -448,6 +556,8 @@ k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443 h1:CAIciCnJnSOQxPd0xvpV6J k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/controller-runtime v0.15.1 h1:9UvgKD4ZJGcj24vefUFgZFP3xej/3igL9BsOUTb/+4c= From bad33172bbdc2b3b456595cbb87107249c04e5ba Mon Sep 17 00:00:00 2001 From: Oksana Grishchenko <91597950+oksana-grishchenko@users.noreply.github.com> Date: Thu, 21 Sep 2023 12:42:15 +0200 Subject: [PATCH 11/11] Everest 428 update rc pipeline (#172) --- .github/workflows/rc_create.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/rc_create.yml b/.github/workflows/rc_create.yml index ec2b3392..4b49c8a3 100644 --- a/.github/workflows/rc_create.yml +++ b/.github/workflows/rc_create.yml @@ -108,6 +108,7 @@ jobs: if [[ -z ${check_branch} ]]; then git checkout -b $RC_BRANCH + git push origin $RC_BRANCH # update tag refs in scripts sed -i "s/dev-latest/$RC_BRANCH/g" deploy/quickstart-compose.yml deploy/quickstart-k8s.yaml