diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index fc5141288c..6f9b4b3cf4 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -16,6 +16,20 @@ jobs: only-new-issues: true args: --timeout 5m + goimports-reviser: + name: runner / suggester / goimports-reviser + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: '^1.23' + - run: go install -v github.com/incu6us/goimports-reviser/v3@latest + - run: $(go env GOPATH)/bin/goimports-reviser -imports-order "std,general,company,project" -company-prefixes "github.com/percona" ./... + - uses: reviewdog/action-suggester@v1 + with: + tool_name: goimports-reviser + gofmt: name: runner / suggester / gofmt runs-on: ubuntu-latest diff --git a/.golangci.yaml b/.golangci.yaml index 7cc7df8727..7d35b967ba 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -6,6 +6,7 @@ linters: - errchkjson - gci - gofumpt + - goimports enable: - depguard - gomodguard @@ -49,9 +50,6 @@ linters-settings: exhaustive: default-signifies-exhaustive: true - goimports: - local-prefixes: github.com/percona/percona-postgresql-operator - gomodguard: blocked: modules: diff --git a/Makefile b/Makefile index 50cbe79489..cf06f320b7 100644 --- a/Makefile +++ b/Makefile @@ -326,6 +326,7 @@ generate-crd: generate-crunchy-crd generate-percona-crd $(KUSTOMIZE) build ./config/crd/ > ./deploy/crd.yaml generate-percona-crd: + go generate ./percona/... GOBIN='$(CURDIR)/hack/tools' ./hack/controller-generator.sh \ crd:crdVersions='v1' \ paths='./pkg/apis/pgv2.percona.com/...' \ diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml index af62882c13..511e52180e 100644 --- a/config/crd/kustomization.yaml +++ b/config/crd/kustomization.yaml @@ -7,3 +7,8 @@ resources: - bases/pgv2.percona.com_perconapgclusters.yaml - bases/postgres-operator.crunchydata.com_pgupgrades.yaml - bases/postgres-operator.crunchydata.com_pgadmins.yaml + +patchesStrategicMerge: +- patches/versionlabel_in_perconapgclusters.yaml +- patches/versionlabel_in_perconapgbackups.yaml +- patches/versionlabel_in_perconapgrestores.yaml diff --git a/config/crd/patches/versionlabel_in_perconapgbackups.yaml b/config/crd/patches/versionlabel_in_perconapgbackups.yaml new file mode 100644 index 0000000000..eccb519f33 --- /dev/null +++ b/config/crd/patches/versionlabel_in_perconapgbackups.yaml @@ -0,0 +1,6 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconapgbackups.pgv2.percona.com + labels: + pgv2.percona.com/version: v2.7.0 diff --git a/config/crd/patches/versionlabel_in_perconapgclusters.yaml b/config/crd/patches/versionlabel_in_perconapgclusters.yaml new file mode 100644 index 0000000000..1e510c760e --- /dev/null +++ b/config/crd/patches/versionlabel_in_perconapgclusters.yaml @@ -0,0 +1,6 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconapgclusters.pgv2.percona.com + labels: + pgv2.percona.com/version: v2.7.0 diff --git a/config/crd/patches/versionlabel_in_perconapgrestores.yaml b/config/crd/patches/versionlabel_in_perconapgrestores.yaml new file mode 100644 index 0000000000..49c0b499f1 --- /dev/null +++ b/config/crd/patches/versionlabel_in_perconapgrestores.yaml @@ -0,0 +1,6 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconapgrestores.pgv2.percona.com + labels: + pgv2.percona.com/version: v2.7.0 diff --git a/deploy/bundle.yaml b/deploy/bundle.yaml index ac94e5bd55..a021a49b9f 100644 --- a/deploy/bundle.yaml +++ b/deploy/bundle.yaml @@ -296,6 +296,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgbackups.pgv2.percona.com spec: group: pgv2.percona.com @@ -702,6 +704,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgclusters.pgv2.percona.com spec: group: pgv2.percona.com @@ -18272,6 +18276,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgrestores.pgv2.percona.com spec: group: pgv2.percona.com diff --git a/deploy/crd.yaml b/deploy/crd.yaml index e45f617a0c..b91217fc23 100644 --- a/deploy/crd.yaml +++ b/deploy/crd.yaml @@ -296,6 +296,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgbackups.pgv2.percona.com spec: group: pgv2.percona.com @@ -702,6 +704,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgclusters.pgv2.percona.com spec: group: pgv2.percona.com @@ -18272,6 +18276,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgrestores.pgv2.percona.com spec: group: pgv2.percona.com diff --git a/deploy/cw-bundle.yaml b/deploy/cw-bundle.yaml index 393d0e8b91..3f97a69c37 100644 --- a/deploy/cw-bundle.yaml +++ b/deploy/cw-bundle.yaml @@ -296,6 +296,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgbackups.pgv2.percona.com spec: group: pgv2.percona.com @@ -702,6 +704,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgclusters.pgv2.percona.com spec: group: pgv2.percona.com @@ -18272,6 +18276,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.16.5 + labels: + pgv2.percona.com/version: v2.7.0 name: perconapgrestores.pgv2.percona.com spec: group: pgv2.percona.com diff --git a/percona/controller/pgcluster/version_test.go b/percona/controller/pgcluster/version_test.go index 88b7cf23dc..324ced2236 100644 --- a/percona/controller/pgcluster/version_test.go +++ b/percona/controller/pgcluster/version_test.go @@ -172,14 +172,14 @@ func (vs *fakeVS) Apply(_ context.Context, req any) (any, error) { DatabaseVersion: "14", KubeVersion: rec.KubeVersion, NamespaceUid: "", - OperatorVersion: v2.Version, + OperatorVersion: version.Version(), Platform: rec.Platform, PmmVersion: "", PmmEnabled: true, HelmDeployCr: true, HelmDeployOperator: true, SidecarsUsed: true, - Product: v2.ProductName, + Product: version.ProductName, } if !reflect.DeepEqual(have, want) { diff --git a/percona/naming/label.go b/percona/naming/label.go new file mode 100644 index 0000000000..55e47ee6d3 --- /dev/null +++ b/percona/naming/label.go @@ -0,0 +1,5 @@ +package naming + +const ( + LabelOperatorVersion = PrefixPerconaPGV2 + "version" +) diff --git a/percona/version/version.go b/percona/version/version.go index bcdc7b54bc..956f4a557c 100644 --- a/percona/version/version.go +++ b/percona/version/version.go @@ -2,18 +2,33 @@ package version import ( "context" + _ "embed" "fmt" "net/http" "net/url" + "os" + "strings" "time" "github.com/pkg/errors" "github.com/percona/percona-postgresql-operator/percona/version/service/client" "github.com/percona/percona-postgresql-operator/percona/version/service/client/version_service" - v2 "github.com/percona/percona-postgresql-operator/pkg/apis/pgv2.percona.com/v2" ) +//go:generate sh -c "yq -i '.metadata.labels.\"pgv2.percona.com/version\" = \"v\" + load(\"version.txt\")' ../../config/crd/patches/versionlabel_in_perconapgclusters.yaml" +//go:generate sh -c "yq -i '.metadata.labels.\"pgv2.percona.com/version\" = \"v\" + load(\"version.txt\")' ../../config/crd/patches/versionlabel_in_perconapgbackups.yaml" +//go:generate sh -c "yq -i '.metadata.labels.\"pgv2.percona.com/version\" = \"v\" + load(\"version.txt\")' ../../config/crd/patches/versionlabel_in_perconapgrestores.yaml" + +//go:embed version.txt +var version string + +func Version() string { + return strings.TrimSpace(version) +} + +const ProductName = "pg-operator" + type Meta struct { Apply string OperatorVersion string @@ -30,10 +45,22 @@ type Meta struct { Extensions string } +const DefaultVersionServiceEndpoint = "https://check.percona.com" + +func getDefaultVersionServiceEndpoint() string { + endpoint := os.Getenv("PERCONA_VS_FALLBACK_URI") + + if len(endpoint) != 0 { + return endpoint + } + + return DefaultVersionServiceEndpoint +} + func EnsureVersion(ctx context.Context, meta Meta) error { - err := fetchVersions(ctx, v2.GetDefaultVersionServiceEndpoint(), meta) + err := fetchVersions(ctx, getDefaultVersionServiceEndpoint(), meta) if err != nil { - return errors.Wrap(err, fmt.Sprintf("failed to send telemetry to %s", v2.GetDefaultVersionServiceEndpoint())) + return errors.Wrap(err, fmt.Sprintf("failed to send telemetry to %s", getDefaultVersionServiceEndpoint())) } return nil @@ -54,7 +81,7 @@ func fetchVersions(ctx context.Context, endpoint string, vm Meta) error { applyParams := &version_service.VersionServiceApplyParams{ Context: ctx, HTTPClient: &http.Client{Timeout: 10 * time.Second}, - Product: v2.ProductName, + Product: ProductName, Apply: vm.Apply, BackupVersion: &vm.BackupVersion, CustomResourceUID: &vm.CRUID, diff --git a/percona/version/version.txt b/percona/version/version.txt new file mode 100644 index 0000000000..24ba9a38de --- /dev/null +++ b/percona/version/version.txt @@ -0,0 +1 @@ +2.7.0 diff --git a/percona/version/version_test.go b/percona/version/version_test.go new file mode 100644 index 0000000000..f128766821 --- /dev/null +++ b/percona/version/version_test.go @@ -0,0 +1,55 @@ +package version_test + +import ( + "bytes" + "os" + "path/filepath" + "runtime" + "slices" + "testing" + + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "sigs.k8s.io/yaml" + + "github.com/percona/percona-postgresql-operator/percona/naming" + "github.com/percona/percona-postgresql-operator/percona/version" +) + +func TestCRDVersionLabel(t *testing.T) { + crdNames := []string{ + "perconapgbackups.pgv2.percona.com", + "perconapgclusters.pgv2.percona.com", + "perconapgrestores.pgv2.percona.com", + } + + _, filename, _, ok := runtime.Caller(0) + if !ok { + t.Fatalf("Failed to get caller information") + } + dir := filepath.Dir(filename) + crdPath := filepath.Join(dir, "..", "..", "deploy", "crd.yaml") + + data, err := os.ReadFile(crdPath) + if err != nil { + t.Fatalf("Failed to read file: %s", err.Error()) + } + yamlDocs := bytes.Split(data, []byte("\n---\n")) + for _, doc := range yamlDocs { + if len(doc) == 0 { + continue + } + crd := new(v1.CustomResourceDefinition) + if err := yaml.Unmarshal(doc, crd); err != nil { + t.Fatalf("Failed to unmarshal crd: %s", err.Error()) + } + if !slices.Contains(crdNames, crd.Name) { + continue + } + expected := "v" + version.Version() + if crd.Labels[naming.LabelOperatorVersion] != expected { + t.Logf("invalid version is specified in %s label of %s CustomResourceDefinition: have: %s, expected: %s", naming.LabelOperatorVersion, crd.Name, crd.Labels[naming.LabelOperatorVersion], expected) + t.Log([]byte(crd.Labels[naming.LabelOperatorVersion]), []byte(expected)) + t.Fail() + } + } +} diff --git a/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go b/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go index 628c81ef9a..a7552e19b2 100644 --- a/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go +++ b/pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go @@ -2,7 +2,6 @@ package v2 import ( "context" - "os" gover "github.com/hashicorp/go-version" corev1 "k8s.io/api/core/v1" @@ -14,6 +13,7 @@ import ( "github.com/percona/percona-postgresql-operator/internal/logging" "github.com/percona/percona-postgresql-operator/internal/naming" pNaming "github.com/percona/percona-postgresql-operator/percona/naming" + "github.com/percona/percona-postgresql-operator/percona/version" crunchyv1beta1 "github.com/percona/percona-postgresql-operator/pkg/apis/postgres-operator.crunchydata.com/v1beta1" ) @@ -21,11 +21,6 @@ func init() { SchemeBuilder.Register(&PerconaPGCluster{}, &PerconaPGClusterList{}) } -const ( - Version = "2.7.0" - ProductName = "pg-operator" -) - // +kubebuilder:object:root=true // +kubebuilder:subresource:status // +kubebuilder:resource:shortName=pg @@ -178,7 +173,7 @@ type PerconaPGClusterSpec struct { func (cr *PerconaPGCluster) Default() { if len(cr.Spec.CRVersion) == 0 { - cr.Spec.CRVersion = Version + cr.Spec.CRVersion = version.Version() } for i := range cr.Spec.InstanceSets { @@ -979,18 +974,6 @@ const ( LabelPMMSecret = labelPrefix + "pmm-secret" ) -const DefaultVersionServiceEndpoint = "https://check.percona.com" - -func GetDefaultVersionServiceEndpoint() string { - endpoint := os.Getenv("PERCONA_VS_FALLBACK_URI") - - if len(endpoint) != 0 { - return endpoint - } - - return DefaultVersionServiceEndpoint -} - const ( UserMonitoring = "monitor" )