diff --git a/api/v1/groupversion_info.go b/api/v1/groupversion_info.go index d883a91..8807c5a 100644 --- a/api/v1/groupversion_info.go +++ b/api/v1/groupversion_info.go @@ -25,10 +25,10 @@ import ( ) var ( - // GroupVersion is group version used to register these objects + // GroupVersion is group version used to register these objects. GroupVersion = schema.GroupVersion{Group: "barmancloud.cnpg.io", Version: "v1"} - // SchemeBuilder is used to add go types to the GroupVersionKind scheme + // SchemeBuilder is used to add go types to the GroupVersionKind scheme. SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} // AddToScheme adds the types in this group-version to the given scheme. diff --git a/api/v1/objectstore_types.go b/api/v1/objectstore_types.go index 99dfb63..fc3e475 100644 --- a/api/v1/objectstore_types.go +++ b/api/v1/objectstore_types.go @@ -17,22 +17,21 @@ limitations under the License. package v1 import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! // NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. -// ObjectStoreSpec defines the desired state of ObjectStore +// ObjectStoreSpec defines the desired state of ObjectStore. type ObjectStoreSpec struct { Configuration barmanapi.BarmanObjectStoreConfiguration `json:"configuration"` // TODO: we add here any exclusive fields for our plugin CRD } -// ObjectStoreStatus defines the observed state of ObjectStore +// ObjectStoreStatus defines the observed state of ObjectStore. type ObjectStoreStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file @@ -41,7 +40,7 @@ type ObjectStoreStatus struct { // +kubebuilder:object:root=true // +kubebuilder:subresource:status -// ObjectStore is the Schema for the objectstores API +// ObjectStore is the Schema for the objectstores API. type ObjectStore struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -52,7 +51,7 @@ type ObjectStore struct { // +kubebuilder:object:root=true -// ObjectStoreList contains a list of ObjectStore +// ObjectStoreList contains a list of ObjectStore. type ObjectStoreList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` diff --git a/cmd/main.go b/cmd/main.go index b84ac64..a8cb483 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -21,12 +21,7 @@ import ( "flag" "os" - "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator" - - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. - _ "k8s.io/client-go/plugin/pkg/client/auth" - + // +kubebuilder:scaffold:imports "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" @@ -38,8 +33,12 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook" barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" + "github.com/cloudnative-pg/plugin-barman-cloud/internal/cnpgi/operator" "github.com/cloudnative-pg/plugin-barman-cloud/internal/controller" - // +kubebuilder:scaffold:imports + + // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) + // to ensure that exec-entrypoint and run can make use of them. + _ "k8s.io/client-go/plugin/pkg/client/auth" ) var ( diff --git a/internal/cnpgi/instance/backup.go b/internal/cnpgi/instance/backup.go index 1d01fdc..749addc 100644 --- a/internal/cnpgi/instance/backup.go +++ b/internal/cnpgi/instance/backup.go @@ -10,7 +10,9 @@ type BackupServiceImplementation struct { backup.UnimplementedBackupServer } -func (b BackupServiceImplementation) GetCapabilities(ctx context.Context, request *backup.BackupCapabilitiesRequest) (*backup.BackupCapabilitiesResult, error) { +func (b BackupServiceImplementation) GetCapabilities( + _ context.Context, _ *backup.BackupCapabilitiesRequest, +) (*backup.BackupCapabilitiesResult, error) { return &backup.BackupCapabilitiesResult{ Capabilities: []*backup.BackupCapability{ { @@ -24,7 +26,7 @@ func (b BackupServiceImplementation) GetCapabilities(ctx context.Context, reques }, nil } -func (b BackupServiceImplementation) Backup(ctx context.Context, request *backup.BackupRequest) (*backup.BackupResult, error) { +func (b BackupServiceImplementation) Backup(_ context.Context, _ *backup.BackupRequest) (*backup.BackupResult, error) { // TODO implement me panic("implement me") } diff --git a/internal/cnpgi/instance/cmd.go b/internal/cnpgi/instance/cmd.go index a0b2b1c..f5db9fa 100644 --- a/internal/cnpgi/instance/cmd.go +++ b/internal/cnpgi/instance/cmd.go @@ -1,11 +1,10 @@ package instance import ( - "github.com/spf13/cobra" - "github.com/cloudnative-pg/cnpg-i-machinery/pkg/pluginhelper/http" "github.com/cloudnative-pg/cnpg-i/pkg/backup" "github.com/cloudnative-pg/cnpg-i/pkg/wal" + "github.com/spf13/cobra" "google.golang.org/grpc" ) @@ -18,5 +17,6 @@ func NewCMD() *cobra.Command { }) cmd.Use = "plugin-instance" + return cmd } diff --git a/internal/cnpgi/instance/constants.go b/internal/cnpgi/instance/constants.go index 4fe1b92..9ab4db9 100644 --- a/internal/cnpgi/instance/constants.go +++ b/internal/cnpgi/instance/constants.go @@ -4,7 +4,7 @@ import "github.com/cloudnative-pg/cnpg-i/pkg/identity" const PluginName = "instance.barman-cloud.cloudnative-pg.io" -// Data is the metadata of this plugin +// Data is the metadata of this plugin. var Data = identity.GetPluginMetadataResponse{ Name: PluginName, Version: "0.0.1", diff --git a/internal/cnpgi/instance/identity.go b/internal/cnpgi/instance/identity.go index ae14bf8..e70e7c5 100644 --- a/internal/cnpgi/instance/identity.go +++ b/internal/cnpgi/instance/identity.go @@ -11,15 +11,15 @@ type IdentityImplementation struct { } func (i IdentityImplementation) GetPluginMetadata( - ctx context.Context, - request *identity.GetPluginMetadataRequest, + _ context.Context, + _ *identity.GetPluginMetadataRequest, ) (*identity.GetPluginMetadataResponse, error) { return &Data, nil } func (i IdentityImplementation) GetPluginCapabilities( - ctx context.Context, - request *identity.GetPluginCapabilitiesRequest, + _ context.Context, + _ *identity.GetPluginCapabilitiesRequest, ) (*identity.GetPluginCapabilitiesResponse, error) { return &identity.GetPluginCapabilitiesResponse{ Capabilities: []*identity.PluginCapability{ @@ -42,8 +42,8 @@ func (i IdentityImplementation) GetPluginCapabilities( } func (i IdentityImplementation) Probe( - ctx context.Context, - request *identity.ProbeRequest, + _ context.Context, + _ *identity.ProbeRequest, ) (*identity.ProbeResponse, error) { return &identity.ProbeResponse{ Ready: true, diff --git a/internal/cnpgi/instance/wal.go b/internal/cnpgi/instance/wal.go index ecc2301..fb13480 100644 --- a/internal/cnpgi/instance/wal.go +++ b/internal/cnpgi/instance/wal.go @@ -10,7 +10,9 @@ type WALServiceImplementation struct { wal.UnimplementedWALServer } -func (W WALServiceImplementation) GetCapabilities(ctx context.Context, request *wal.WALCapabilitiesRequest) (*wal.WALCapabilitiesResult, error) { +func (w WALServiceImplementation) GetCapabilities( + _ context.Context, _ *wal.WALCapabilitiesRequest, +) (*wal.WALCapabilitiesResult, error) { return &wal.WALCapabilitiesResult{ Capabilities: []*wal.WALCapability{ { @@ -31,22 +33,30 @@ func (W WALServiceImplementation) GetCapabilities(ctx context.Context, request * }, nil } -func (W WALServiceImplementation) Archive(ctx context.Context, request *wal.WALArchiveRequest) (*wal.WALArchiveResult, error) { +func (w WALServiceImplementation) Archive(_ context.Context, _ *wal.WALArchiveRequest) (*wal.WALArchiveResult, + error, +) { // TODO implement me panic("implement me") } -func (W WALServiceImplementation) Restore(ctx context.Context, request *wal.WALRestoreRequest) (*wal.WALRestoreResult, error) { +func (w WALServiceImplementation) Restore(_ context.Context, _ *wal.WALRestoreRequest) (*wal.WALRestoreResult, + error, +) { // TODO implement me panic("implement me") } -func (W WALServiceImplementation) Status(ctx context.Context, request *wal.WALStatusRequest) (*wal.WALStatusResult, error) { +func (w WALServiceImplementation) Status(_ context.Context, _ *wal.WALStatusRequest) (*wal.WALStatusResult, + error, +) { // TODO implement me panic("implement me") } -func (W WALServiceImplementation) SetFirstRequired(ctx context.Context, request *wal.SetFirstRequiredRequest) (*wal.SetFirstRequiredResult, error) { +func (w WALServiceImplementation) SetFirstRequired( + _ context.Context, _ *wal.SetFirstRequiredRequest, +) (*wal.SetFirstRequiredResult, error) { // TODO implement me panic("implement me") } diff --git a/internal/cnpgi/operator/constants.go b/internal/cnpgi/operator/constants.go index c2da6e5..f162ec5 100644 --- a/internal/cnpgi/operator/constants.go +++ b/internal/cnpgi/operator/constants.go @@ -4,7 +4,7 @@ import "github.com/cloudnative-pg/cnpg-i/pkg/identity" const PluginName = "operator.barman-cloud.cloudnative-pg.io" -// Data is the metadata of this plugin +// Data is the metadata of this plugin. var Data = identity.GetPluginMetadataResponse{ Name: PluginName, Version: "0.0.1", diff --git a/internal/cnpgi/operator/identity.go b/internal/cnpgi/operator/identity.go index 850d6b9..7ef5ea7 100644 --- a/internal/cnpgi/operator/identity.go +++ b/internal/cnpgi/operator/identity.go @@ -11,15 +11,15 @@ type IdentityImplementation struct { } func (i IdentityImplementation) GetPluginMetadata( - ctx context.Context, - request *identity.GetPluginMetadataRequest, + _ context.Context, + _ *identity.GetPluginMetadataRequest, ) (*identity.GetPluginMetadataResponse, error) { return &Data, nil } func (i IdentityImplementation) GetPluginCapabilities( - ctx context.Context, - request *identity.GetPluginCapabilitiesRequest, + _ context.Context, + _ *identity.GetPluginCapabilitiesRequest, ) (*identity.GetPluginCapabilitiesResponse, error) { return &identity.GetPluginCapabilitiesResponse{ Capabilities: []*identity.PluginCapability{ @@ -42,8 +42,8 @@ func (i IdentityImplementation) GetPluginCapabilities( } func (i IdentityImplementation) Probe( - ctx context.Context, - request *identity.ProbeRequest, + _ context.Context, + _ *identity.ProbeRequest, ) (*identity.ProbeResponse, error) { return &identity.ProbeResponse{ Ready: true, diff --git a/internal/cnpgi/operator/reconciler.go b/internal/cnpgi/operator/reconciler.go index 264ceea..2092984 100644 --- a/internal/cnpgi/operator/reconciler.go +++ b/internal/cnpgi/operator/reconciler.go @@ -11,8 +11,8 @@ type ReconcilerImplementation struct { } func (r ReconcilerImplementation) GetCapabilities( - ctx context.Context, - request *reconciler.ReconcilerHooksCapabilitiesRequest, + _ context.Context, + _ *reconciler.ReconcilerHooksCapabilitiesRequest, ) (*reconciler.ReconcilerHooksCapabilitiesResult, error) { return &reconciler.ReconcilerHooksCapabilitiesResult{ ReconcilerCapabilities: []*reconciler.ReconcilerHooksCapability{ @@ -27,8 +27,8 @@ func (r ReconcilerImplementation) GetCapabilities( } func (r ReconcilerImplementation) Pre( - ctx context.Context, - request *reconciler.ReconcilerHooksRequest, + _ context.Context, + _ *reconciler.ReconcilerHooksRequest, ) (*reconciler.ReconcilerHooksResult, error) { return &reconciler.ReconcilerHooksResult{ Behavior: reconciler.ReconcilerHooksResult_BEHAVIOR_CONTINUE, @@ -36,8 +36,8 @@ func (r ReconcilerImplementation) Pre( } func (r ReconcilerImplementation) Post( - ctx context.Context, - request *reconciler.ReconcilerHooksRequest, + _ context.Context, + _ *reconciler.ReconcilerHooksRequest, ) (*reconciler.ReconcilerHooksResult, error) { return &reconciler.ReconcilerHooksResult{ Behavior: reconciler.ReconcilerHooksResult_BEHAVIOR_CONTINUE, diff --git a/internal/cnpgi/operator/start.go b/internal/cnpgi/operator/start.go index a45b7e6..7cb00b1 100644 --- a/internal/cnpgi/operator/start.go +++ b/internal/cnpgi/operator/start.go @@ -20,5 +20,5 @@ func (c *CNPGI) Start(ctx context.Context) error { }) cmd.Use = "plugin-operator" - return cmd.ExecuteContext(ctx) + return cmd.ExecuteContext(ctx) //nolint:wrapcheck } diff --git a/internal/controller/objectstore_controller.go b/internal/controller/objectstore_controller.go index 7d85809..6f24a1a 100644 --- a/internal/controller/objectstore_controller.go +++ b/internal/controller/objectstore_controller.go @@ -18,6 +18,7 @@ package controller import ( "context" + "fmt" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" @@ -27,7 +28,7 @@ import ( barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" ) -// ObjectStoreReconciler reconciles a ObjectStore object +// ObjectStoreReconciler reconciles a ObjectStore object. type ObjectStoreReconciler struct { client.Client Scheme *runtime.Scheme @@ -46,7 +47,7 @@ type ObjectStoreReconciler struct { // // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.0/pkg/reconcile -func (r *ObjectStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { +func (r *ObjectStoreReconciler) Reconcile(ctx context.Context, _ ctrl.Request) (ctrl.Result, error) { _ = log.FromContext(ctx) // TODO(user): your logic here @@ -56,7 +57,12 @@ func (r *ObjectStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request) // SetupWithManager sets up the controller with the Manager. func (r *ObjectStoreReconciler) SetupWithManager(mgr ctrl.Manager) error { - return ctrl.NewControllerManagedBy(mgr). + err := ctrl.NewControllerManagedBy(mgr). For(&barmancloudv1.ObjectStore{}). Complete(r) + if err != nil { + return fmt.Errorf("unable to create controller: %w", err) + } + + return nil } diff --git a/internal/controller/objectstore_controller_test.go b/internal/controller/objectstore_controller_test.go index 8df14eb..d3ccd7a 100644 --- a/internal/controller/objectstore_controller_test.go +++ b/internal/controller/objectstore_controller_test.go @@ -19,15 +19,16 @@ package controller import ( "context" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" + barmanapi "github.com/cloudnative-pg/barman-cloud/pkg/api" "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/reconcile" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" ) var _ = Describe("ObjectStore Controller", func() { @@ -51,6 +52,9 @@ var _ = Describe("ObjectStore Controller", func() { Name: resourceName, Namespace: "default", }, + Spec: barmancloudv1.ObjectStoreSpec{ + Configuration: barmanapi.BarmanObjectStoreConfiguration{DestinationPath: "/tmp"}, + }, // TODO(user): Specify other spec details if needed. } Expect(k8sClient.Create(ctx, resource)).To(Succeed()) diff --git a/internal/controller/suite_test.go b/internal/controller/suite_test.go index 9939697..1537778 100644 --- a/internal/controller/suite_test.go +++ b/internal/controller/suite_test.go @@ -23,9 +23,7 @@ import ( "runtime" "testing" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - + // +kubebuilder:scaffold:imports "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -34,17 +32,21 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log/zap" barmancloudv1 "github.com/cloudnative-pg/plugin-barman-cloud/api/v1" - // +kubebuilder:scaffold:imports + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" ) // These tests use Ginkgo (BDD-style Go testing framework). Refer to // http://onsi.github.io/ginkgo/ to learn more about Ginkgo. -var cfg *rest.Config -var k8sClient client.Client -var testEnv *envtest.Environment -var ctx context.Context -var cancel context.CancelFunc +var ( + cfg *rest.Config + k8sClient client.Client + testEnv *envtest.Environment + ctx context.Context + cancel context.CancelFunc +) func TestControllers(t *testing.T) { RegisterFailHandler(Fail) @@ -55,7 +57,7 @@ func TestControllers(t *testing.T) { var _ = BeforeSuite(func() { logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) - ctx, cancel = context.WithCancel(context.TODO()) + ctx, cancel = context.WithCancel(context.TODO()) //nolint: fatcontext By("bootstrapping test environment") testEnv = &envtest.Environment{ @@ -85,7 +87,6 @@ var _ = BeforeSuite(func() { k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) Expect(err).NotTo(HaveOccurred()) Expect(k8sClient).NotTo(BeNil()) - }) var _ = AfterSuite(func() { diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 4fdcffb..5e3e07e 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -21,10 +21,10 @@ import ( "os/exec" "time" + "github.com/cloudnative-pg/plugin-barman-cloud/test/utils" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - - "github.com/cloudnative-pg/plugin-barman-cloud/test/utils" ) const namespace = "plugin-barman-cloud-system" @@ -60,14 +60,15 @@ var _ = Describe("controller", Ordered, func() { var err error // projectimage stores the name of the image used in the example - var projectimage = "example.com/plugin-barman-cloud:v0.0.1" + projectimage := "example.com/plugin-barman-cloud:v0.0.1" By("building the manager(Operator) image") + //nolint:gosec,perfsprint cmd := exec.Command("make", "docker-build", fmt.Sprintf("IMG=%s", projectimage)) _, err = utils.Run(cmd) ExpectWithOffset(1, err).NotTo(HaveOccurred()) - By("loading the the manager(Operator) image on Kind") + By("loading the manager(Operator) image on Kind") err = utils.LoadImageToKindClusterWithName(projectimage) ExpectWithOffset(1, err).NotTo(HaveOccurred()) @@ -77,6 +78,7 @@ var _ = Describe("controller", Ordered, func() { ExpectWithOffset(1, err).NotTo(HaveOccurred()) By("deploying the controller-manager") + //nolint:gosec,perfsprint cmd = exec.Command("make", "deploy", fmt.Sprintf("IMG=%s", projectimage)) _, err = utils.Run(cmd) ExpectWithOffset(1, err).NotTo(HaveOccurred()) @@ -113,10 +115,10 @@ var _ = Describe("controller", Ordered, func() { if string(status) != "Running" { return fmt.Errorf("controller pod in %s status", status) } + return nil } EventuallyWithOffset(1, verifyControllerUp, time.Minute, time.Second).Should(Succeed()) - }) }) }) diff --git a/test/utils/utils.go b/test/utils/utils.go index 6b96ab5..fdadf8b 100644 --- a/test/utils/utils.go +++ b/test/utils/utils.go @@ -22,7 +22,7 @@ import ( "os/exec" "strings" - . "github.com/onsi/ginkgo/v2" //nolint:golint,revive + . "github.com/onsi/ginkgo/v2" ) const ( @@ -43,10 +43,11 @@ func InstallPrometheusOperator() error { url := fmt.Sprintf(prometheusOperatorURL, prometheusOperatorVersion) cmd := exec.Command("kubectl", "create", "-f", url) _, err := Run(cmd) + return err } -// Run executes the provided command within this context +// Run executes the provided command within this context. func Run(cmd *exec.Cmd) ([]byte, error) { dir, _ := GetProjectDir() cmd.Dir = dir @@ -60,13 +61,13 @@ func Run(cmd *exec.Cmd) ([]byte, error) { _, _ = fmt.Fprintf(GinkgoWriter, "running: %s\n", command) output, err := cmd.CombinedOutput() if err != nil { - return output, fmt.Errorf("%s failed with error: (%v) %s", command, err, string(output)) + return output, fmt.Errorf("%s failed with error: (%w) %s", command, err, string(output)) } return output, nil } -// UninstallPrometheusOperator uninstalls the prometheus +// UninstallPrometheusOperator uninstalls the prometheus. func UninstallPrometheusOperator() { url := fmt.Sprintf(prometheusOperatorURL, prometheusOperatorVersion) cmd := exec.Command("kubectl", "delete", "-f", url) @@ -75,7 +76,7 @@ func UninstallPrometheusOperator() { } } -// UninstallCertManager uninstalls the cert manager +// UninstallCertManager uninstalls the cert manager. func UninstallCertManager() { url := fmt.Sprintf(certmanagerURLTmpl, certmanagerVersion) cmd := exec.Command("kubectl", "delete", "-f", url) @@ -100,10 +101,11 @@ func InstallCertManager() error { ) _, err := Run(cmd) + return err } -// LoadImageToKindClusterWithName loads a local docker image to the kind cluster +// LoadImageToKindClusterWithName loads a local docker image to the kind cluster. func LoadImageToKindClusterWithName(name string) error { cluster := "kind" if v, ok := os.LookupEnv("KIND_CLUSTER"); ok { @@ -112,6 +114,7 @@ func LoadImageToKindClusterWithName(name string) error { kindOptions := []string{"load", "docker-image", name, "--name", cluster} cmd := exec.Command("kind", kindOptions...) _, err := Run(cmd) + return err } @@ -129,12 +132,13 @@ func GetNonEmptyLines(output string) []string { return res } -// GetProjectDir will return the directory where the project is +// GetProjectDir will return the directory where the project is. func GetProjectDir() (string, error) { wd, err := os.Getwd() if err != nil { - return wd, err + return wd, fmt.Errorf("failed to get the current working directory: %w", err) } - wd = strings.Replace(wd, "/test/e2e", "", -1) + wd = strings.ReplaceAll(wd, "/test/e2e", "") + return wd, nil }