feat(only test): ar rover file sftp - #646
Conversation
- implement proper webhook - add support for metrics - unified ssh keys validation with sftp domain
- remove leftoversa - simplified function for getting canonical keys
…ification for roverctl processing
…r-rover-file-sftp # Conflicts: # .github/workflows/ci.yaml # .goreleaser.yaml # file/api/go.mod # file/api/go.sum # file/api/v1/fileexposure_types.go # file/api/v1/filesubscription_types.go # file/api/v1/filetype_types.go # file/api/v1/groupversion_info.go # file/api/v1/zz_generated.deepcopy.go # file/config/crd/kustomization.yaml
There was a problem hiding this comment.
🟡 Changes recommended
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR introduces a new SFTP domain operator (CRDs + controllers + external “SFTP Tardis” API client), adds a new File domain operator intended to bridge Rover “fileType” declarations into SFTP provisioning, and wires FileSpecification support through rover / rover-server / rover-ctl, along with documentation and CI/release integration.
Changes:
- Add SFTP operator scaffolding, service client abstractions, and controller/handler logic.
- Add File domain scaffolding (CRDs/controllers/config) and integrate Rover FileSpecification + file exposures/subscriptions across operator + server + CLI.
- Update docs, CI workflow, and goreleaser build matrix for the new operators.
File summaries
| File | Description |
|---|---|
| sftp/tools/tools.go | Adds go:generate hooks for OpenAPI client + mock generation. |
| sftp/tools/service.yaml | oapi-codegen configuration for SFTP service client generation. |
| sftp/tools/mockery.yaml | mockery configuration for generating service mocks. |
| sftp/README.md | Introduces SFTP operator overview, resources, and build/test instructions. |
| sftp/PROJECT.license | Adds SPDX license metadata for kubebuilder PROJECT file. |
| sftp/PROJECT | Adds kubebuilder project metadata for SFTP CRDs/controllers. |
| sftp/internal/service/utils.go | Adds base URL parsing/validation helper. |
| sftp/internal/service/suite_test.go | Adds Ginkgo suite for SFTP service package tests. |
| sftp/internal/service/service.go | Defines SFTP service interfaces (Service/Factory/ClientManager). |
| sftp/internal/service/service.gen.go.license | SPDX license metadata for generated OpenAPI client output. |
| sftp/internal/service/nop.go | Adds NOP implementations for service + client manager. |
| sftp/internal/service/http_service.go | Implements Service using generated OpenAPI client; maps errors to ctrlerrors. |
| sftp/internal/service/api_error.go | Adds structured API error extraction + ctrlerrors mapping. |
| sftp/internal/handler/user/handler_suite_test.go | Adds Ginkgo suite scaffold for user handler tests. |
| sftp/internal/handler/sftpserviceconfig/handler.go | Adds handler to create/update/delete cached SFTP clients based on SFTPServiceConfig. |
| sftp/internal/handler/sftpserviceconfig/handler_suite_test.go | Adds Ginkgo suite scaffold for SFTPServiceConfig handler tests. |
| sftp/internal/handler/instance/handler.go | Adds handler to provision/delete external SFTP user per Instance. |
| sftp/internal/handler/instance/handler_suite_test.go | Adds Ginkgo suite scaffold for instance handler tests. |
| sftp/internal/controller/user_controller.go | Adds User controller wiring and watch mapping from Instances to Users. |
| sftp/internal/controller/sftpserviceconfig_controller.go | Adds SFTPServiceConfig controller wiring. |
| sftp/internal/controller/sftpserviceconfig_controller_test.go | Adds envtest-based controller test for SFTPServiceConfig reconcile. |
| sftp/internal/controller/schema.go | Registers required API schemes for SFTP controller runtime. |
| sftp/internal/controller/instance_controller.go | Adds Instance controller wiring and watch mapping from SFTPServiceConfigs to Instances. |
| sftp/internal/controller/index.go | Adds field index registration for Instance and User reference indexes. |
| sftp/go.sum.license | SPDX license metadata for SFTP go.sum. |
| sftp/config/samples/sftp_v1_user.yaml | Adds sample User CR. |
| sftp/config/samples/sftp_v1_sftpserviceconfig.yaml | Adds sample SFTPServiceConfig CR. |
| sftp/config/samples/sftp_v1_instance.yaml | Adds sample Instance CR. |
| sftp/config/rbac/user_viewer_role.yaml | Adds RBAC for viewing Users. |
| sftp/config/rbac/user_editor_role.yaml | Adds RBAC for editing Users. |
| sftp/config/rbac/sftpserviceconfig_viewer_role.yaml | Adds RBAC for viewing SFTPServiceConfigs. |
| sftp/config/rbac/sftpserviceconfig_editor_role.yaml | Adds RBAC for editing SFTPServiceConfigs. |
| sftp/config/rbac/service_account.yaml | Adds service account for SFTP operator. |
| sftp/config/rbac/role.yaml | Adds manager ClusterRole for SFTP operator. |
| sftp/config/rbac/role_binding.yaml | Adds manager ClusterRoleBinding for SFTP operator. |
| sftp/config/rbac/metrics_reader_role.yaml | Adds metrics reader ClusterRole. |
| sftp/config/rbac/metrics_auth_role.yaml | Adds auth roles for metrics endpoint protection. |
| sftp/config/rbac/metrics_auth_role_binding.yaml | Binds metrics auth role to service account. |
| sftp/config/rbac/leader_election_role.yaml | Adds leader election Role. |
| sftp/config/rbac/leader_election_role_binding.yaml | Adds leader election RoleBinding. |
| sftp/config/rbac/kustomization.yaml | Wires RBAC resources for SFTP operator. |
| sftp/config/rbac/instance_viewer_role.yaml | Adds RBAC for viewing Instances. |
| sftp/config/rbac/instance_editor_role.yaml | Adds RBAC for editing Instances. |
| sftp/config/manager/manager.yaml | Adds SFTP operator manager Deployment manifest. |
| sftp/config/manager/kustomization.yaml | Wires manager manifest for SFTP operator. |
| sftp/config/default/namespace_patch.yaml | Adds secret-manager namespace label patch for SFTP deployment. |
| sftp/config/default/kustomization.yaml | Default kustomize wiring for SFTP operator deployment. |
| sftp/config/default/deployment_patch.yaml | Adds secret manager + trust bundle mounts for SFTP manager. |
| sftp/config/crd/kustomization.yaml | Wires CRD bases for SFTP operator. |
| sftp/api/v1/user_types.go | Adds SFTP User CRD type definitions. |
| sftp/api/v1/publickey.go | Adds SSH public key canonicalization/fingerprint helpers. |
| sftp/api/v1/labels.go | Adds label key constants for SFTP resources. |
| sftp/api/v1/instance_types.go | Adds SFTP Instance CRD type definitions. |
| sftp/api/v1/groupversion_info.go | Adds SFTP API group/version registration. |
| sftp/api/v1/condition.go | Adds SFTP-specific condition helpers/constants. |
| sftp/api/go.sum.license | SPDX license metadata for sftp/api go.sum. |
| rover/PROJECT | Adds FileSpecification resource to rover kubebuilder project config. |
| rover/internal/webhook/v1/filespecification_webhook.go | Adds validating webhook for FileSpecification. |
| rover/internal/handler/rover/file/util.go | Adds helper for rover->file resource naming + key mapping. |
| rover/internal/handler/rover/file/util_test.go | Adds tests for rover file naming + public key mapping helpers. |
| rover/internal/handler/rover/file/subscription.go | Adds rover->file FileSubscription reconciliation logic. |
| rover/internal/handler/rover/file/exposure.go | Adds rover->file FileExposure reconciliation logic. |
| rover/internal/handler/rover/application/application.go | Refactors client decision logic; excludes file-only rovers from needing clients. |
| rover/internal/handler/rover/application/application_test.go | Adds tests for isClientNeeded behavior. |
| rover/internal/handler/filespecification/handler.go | Adds FileSpecification->FileType reconciliation handler. |
| rover/internal/controller/suite_test.go | Extends envtest suite to include file CRDs and FileSpecification reconciler. |
| rover/internal/controller/rover_controller.go | Adds ownership + RBAC wiring for file-domain resources under feature flag. |
| rover/internal/controller/index.go | Adds owner-index wiring for file-domain resources under feature flag. |
| rover/internal/controller/filespecification_controller.go | Adds FileSpecification controller wiring. |
| rover/go.sum | Adds x/crypto and other dependency sums. |
| rover/go.mod | Adds file/api dependency + x/crypto and replace directive. |
| rover/config/webhook/manifests.yaml | Registers FileSpecification webhook endpoint. |
| rover/config/rbac/role.yaml | Adds RBAC for file-domain resources + filespecifications. |
| rover/config/crd/kustomization.yaml | Adds FileSpecification CRD base to rover CRD bundle. |
| rover/cmd/main.go | Registers file scheme/controller/webhook under feature flag. |
| rover-server/test/mocks/mocks.go | Adds constants + helpers for FileSpecification mock JSON. |
| rover-server/test/mocks/mocks_FileSpecification.go | Adds store mock behavior for FileSpecification CRUD/list. |
| rover-server/test/mocks/data/fileSpecification.json | Adds FileSpecification mock fixture. |
| rover-server/README.md | Removes trailing whitespace lines. |
| rover-server/pkg/store/stores.go | Adds FileSpecification/FileExposure/FileSubscription stores gated by FeatureFile. |
| rover-server/internal/server/server.go | Adds FileSpecification controller interface + route registration. |
| rover-server/internal/server/filespecification_server.go | Adds REST handlers for FileSpecification CRUD/status endpoints. |
| rover-server/internal/mapper/rover/out/file_test.go | Adds tests for mapping rover file exposure/public keys. |
| rover-server/internal/mapper/rover/out/exposure.go | Adds file exposure mapping + public key mapping. |
| rover-server/internal/mapper/rover/in/suite_rover_in_test.go | Adds file exposure/subscription fixtures + helpers. |
| rover-server/internal/mapper/rover/in/subscription.go | Adds file subscription mapping. |
| rover-server/internal/mapper/rover/in/subscription_test.go | Adds test + snapshot for file subscription mapping. |
| rover-server/internal/mapper/rover/in/exposure.go | Adds file exposure mapping + public key mapping. |
| rover-server/internal/mapper/rover/in/exposure_test.go | Adds test + snapshot for file exposure mapping. |
| rover-server/internal/mapper/rover/in/snapshots/subscription_test.snap | Updates snapshots for new FileSubscription discriminator. |
| rover-server/internal/mapper/rover/in/snapshots/rover_test.snap | Updates rover snapshots for file exposure/subscription fields. |
| rover-server/internal/mapper/rover/in/snapshots/exposure_test.snap | Updates exposure snapshots for file exposure discriminator. |
| rover-server/internal/mapper/filespecification/out/suite_filespec_out_test.go | Adds mapper suite for FileSpecification out mapping. |
| rover-server/internal/mapper/filespecification/out/filespecification.go | Adds FileSpecification CRD -> API response mapping. |
| rover-server/internal/mapper/filespecification/out/filespecification_test.go | Adds tests + snapshots for FileSpecification out mapping. |
| rover-server/internal/mapper/filespecification/out/snapshots/filespecification_test.snap | Adds snapshots for FileSpecification response mapping. |
| rover-server/internal/mapper/filespecification/in/suite_filespec_in_test.go | Adds mapper suite for FileSpecification in mapping. |
| rover-server/internal/mapper/filespecification/in/filespecification.go | Adds API request -> FileSpecification CRD mapping. |
| rover-server/internal/mapper/filespecification/in/filespecification_test.go | Adds tests + snapshots for FileSpecification in mapping. |
| rover-server/internal/mapper/filespecification/in/snapshots/filespecification_test.snap | Adds snapshots for FileSpecification request mapping. |
| rover-server/internal/mapper/applicationinfo/suite_appinfo_test.go | Extends appinfo test setup with file exposure/subscription stores. |
| rover-server/internal/controller/suite_controller_test.go | Wires FileSpecification store + controller and routes into server tests. |
| rover-server/go.mod | Adds file/api dependency + replace directive. |
| rover-server/cmd/main.go | Wires FileSpecification controller into rover-server main. |
| rover-ctl/pkg/handlers/v0/rover.go | Adds patching logic for file exposures/subscriptions to set discriminator type. |
| rover-ctl/pkg/handlers/v0/rover_test.go | Adds tests for patching file exposures/subscriptions. |
| rover-ctl/pkg/handlers/v0/filespec.go | Adds FileSpecification handler and request patching to send only spec body. |
| rover-ctl/pkg/handlers/v0/filespec_test.go | Adds tests for FileSpecification handler registration and request patching. |
| rover-ctl/pkg/handlers/registry.go | Registers FileSpecification handler. |
| rover-ctl/pkg/handlers/registry_test.go | Updates registry tests to include FileSpecification handler. |
| file/PROJECT | Adds kubebuilder project metadata for file-domain CRDs/controllers. |
| file/internal/index/index.go | Adds field indexes for file-domain resources. |
| file/internal/handler/zoneserviceconfig/handler_suite_test.go | Adds suite scaffold for ZoneServiceConfig handler tests. |
| file/internal/handler/util/util_suite_test.go | Adds suite scaffold for handler util tests. |
| file/internal/handler/util/refs.go | Adds helper functions for deriving SFTP refs for file resources. |
| file/internal/handler/util/labels.go | Adds file-domain child label conventions + selectors. |
| file/internal/handler/suite_test.go | Adds top-level handler suite scaffold. |
| file/internal/handler/filetype/handler.go | Adds FileType handler logic to select active exposure and validate zone config. |
| file/internal/handler/filetype/handler_suite_test.go | Adds suite scaffold for FileType handler tests. |
| file/internal/handler/filesubscription/handler_suite_test.go | Adds suite scaffold for FileSubscription handler tests. |
| file/internal/handler/fileexposure/handler_suite_test.go | Adds suite scaffold for FileExposure handler tests. |
| file/internal/controller/zoneserviceconfig_controller_test.go | Adds controller test for ZoneServiceConfig reconcile. |
| file/internal/controller/schema.go | Registers required schemes for file operator runtime. |
| file/internal/controller/filetype_controller.go | Adds FileType controller wiring + watch mapping from FileExposure to FileType. |
| file/internal/controller/filetype_controller_test.go | Adds controller test for FileType reconcile. |
| file/internal/controller/filesubscription_controller_test.go | Adds controller test for FileSubscription reconcile. |
| file/internal/controller/fileexposure_controller_test.go | Adds controller test for FileExposure reconcile. |
| file/go.sum.license | SPDX license metadata for file go.sum. |
| file/config/webhook/service.yaml | Adds webhook service manifest. |
| file/config/webhook/manifests.yaml | Adds validating webhook configuration for ZoneServiceConfig. |
| file/config/webhook/kustomizeconfig.yaml | Adds kustomize nameReference wiring for webhook service. |
| file/config/webhook/kustomization.yaml | Wires webhook resources. |
| file/config/samples/file_v1_zoneserviceconfig.yaml | Adds sample ZoneServiceConfig CR. |
| file/config/samples/file_v1_filetype.yaml | Adds sample FileType CR. |
| file/config/samples/file_v1_filesubscription.yaml | Adds sample FileSubscription CR. |
| file/config/samples/file_v1_fileexposure.yaml | Adds sample FileExposure CR. |
| file/config/rbac/service_account.yaml | Adds service account for file operator. |
| file/config/rbac/role_binding.yaml | Adds role binding for file operator manager role. |
| file/config/rbac/metrics_reader_role.yaml | Adds metrics reader role for file operator. |
| file/config/rbac/metrics_auth_role.yaml | Adds metrics auth role for file operator. |
| file/config/rbac/metrics_auth_role_binding.yaml | Adds metrics auth role binding. |
| file/config/rbac/leader_election_role.yaml | Adds leader election role. |
| file/config/rbac/leader_election_role_binding.yaml | Adds leader election role binding. |
| file/config/rbac/kustomization.yaml | Wires RBAC resources for file operator. |
| file/config/prometheus/monitor.yaml | Adds ServiceMonitor for file operator metrics. |
| file/config/prometheus/monitor_tls_patch.yaml | Adds optional TLS patch for ServiceMonitor. |
| file/config/prometheus/kustomization.yaml | Wires ServiceMonitor resources. |
| file/config/manager/manager.yaml | Adds file operator manager Deployment manifest. |
| file/config/manager/kustomization.yaml | Wires manager manifest and image overrides. |
| file/config/default/namespace_patch.yaml | Adds secret-manager namespace label patch for file operator deployment. |
| file/config/default/metrics_service.yaml | Adds metrics Service for file operator. |
| file/config/default/manager_webhook_patch.yaml | Adds webhook cert mount/args/port patches for manager Deployment. |
| file/config/default/manager_metrics_patch.yaml | Adds metrics bind address arg patch. |
| file/config/default/deployment_patch.yaml | Adds secret manager + trust bundle mounts for manager Deployment. |
| file/config/crd/kustomization.yaml | Wires CRD bases for file domain. |
| file/config/certmanager/kustomizeconfig.yaml | Adds nameReference wiring for cert-manager resources. |
| file/config/certmanager/kustomization.yaml | Wires cert-manager resources. |
| file/config/certmanager/certificate-webhook.yaml | Adds cert-manager Certificate manifest for webhook serving certs. |
| file/api/v1/suite_test.go | Adds API v1 test suite scaffold. |
| file/api/v1/shared_types.go | Adds shared types/constants for file-domain API (currently duplicates with file_shared_types.go). |
| file/api/v1/groupversion_info.go | Adds file API group/version registration. |
| file/api/v1/filetype_types.go | Adds FileType CRD types. |
| file/api/v1/filesubscription_types.go | Adds FileSubscription CRD types. |
| file/api/v1/fileexposure_types.go | Adds FileExposure CRD types. |
| file/api/v1/file_shared_types.go | Adds additional shared types (currently duplicates with shared_types.go). |
| file/api/go.sum.license | SPDX license metadata for file/api go.sum. |
| file/api/go.mod | Adds new Go module for file API types. |
| file/.gitignore | Adds module-specific ignores for file operator. |
| docs/scripts/generate-crd-schemas.mjs | Includes sftp domain in CRD schema generation list. |
| docs/scripts/generate-crd-data.mjs | Includes sftp domain in CRD data generation list. |
| docs/docs/reference/json-schemas.md | Adds SFTP section to schema reference docs. |
| docs/docs/reference/api.md | Adds SFTP API group overview to reference docs. |
| docs/docs/overview/components.md | Lists SFTP domain in components overview. |
| docs/docs/developer-journey/local-development.md | Clarifies manifests target wording (webhooks where configured). |
| docs/docs/architecture/sftp.mdx | Adds SFTP domain architecture documentation page. |
| docs/docs/architecture/rover.mdx | Documents Rover file types (SFTP) behavior and API version warning. |
| docs/docs/architecture/overview.md | Adds SFTP domain to architecture overview index. |
| docs/docs/architecture/file.mdx | Adds File domain architecture documentation page. |
| common/pkg/config/feature.go | Adds FeatureFile feature flag. |
| .goreleaser.yaml | Adds goreleaser build entries for sftp-operator and file-operator binaries. |
| .github/workflows/ci.yaml | Adds CI jobs for sftp and file modules (and re-adds projector/permission jobs in this diff). |
Review details
Suppressed comments (3)
rover/internal/handler/filespecification/handler.go:58
- filev1.FileTypeSpec in file/api/v1 currently only has Description, but this code assigns Type and Specification fields that don't exist. Either extend the FileType API to include these fields or update the handler to populate only the fields that actually exist.
rover/internal/handler/rover/file/subscription.go:53 - This FileSubscriptionSpec initialization uses non-existent identifiers/fields (Sftp and filev1.SftpSubscription). In file/api/v1, the spec currently defines required Zone *types.ObjectRef and optional SFTP *FileSFTP (field name SFTP), so this code will not compile and would also violate the CRD schema (missing Zone). Align this mapping with the file-domain API types.
rover/internal/handler/rover/file/exposure.go:63 - This FileExposureSpec initialization uses non-existent fields/types (Sftp and filev1.SftpExposure) and assigns Zone as a value, but file/api/v1 currently defines Zone as *types.ObjectRef and SFTP as *FileSFTP (field name SFTP). As written, this will not compile and also doesn't satisfy the expected file-domain CRD schema. Please align rover->file exposure mapping with file/api/v1.
- Files reviewed: 219/260 changed files
- Comments generated: 8
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| switch res.StatusCode() { | ||
| case http.StatusOK: | ||
| return nil | ||
| default: | ||
| return handleAPIError("delete SFTP user", res.StatusCode(), res.Body, firstAPIError(res.JSON400, res.JSON500)) | ||
| } |
| // Visibility defines who can see and subscribe to an exposed file type. | ||
| // +kubebuilder:validation:Enum=World;Zone;Enterprise | ||
| type Visibility string | ||
|
|
||
| const ( |
| // Visibility defines who can see and subscribe to an exposed file type. | ||
| // +kubebuilder:validation:Enum=World;Zone;Enterprise | ||
| type Visibility string | ||
|
|
||
| const ( |
| fileSubscription.Labels = map[string]string{ | ||
| filev1.FileTypeLabelKey: labelutil.NormalizeLabelValue(sub.FileType), | ||
| config.BuildLabelKey("zone"): labelutil.NormalizeLabelValue(owner.Spec.Zone), | ||
| config.BuildLabelKey("application"): labelutil.NormalizeLabelValue(owner.Name), | ||
| } |
| fileType.Labels = map[string]string{ | ||
| filev1.FileTypeLabelKey: labelutil.NormalizeLabelValue(fileSpec.Name), | ||
| } |
| expectedName := roverv1.MakeFileSpecificationName(filespecification) | ||
| if filespecification.Name != expectedName { | ||
| valErr.AddInvalidError( | ||
| field.NewPath("metadata").Child("name"), | ||
| filespecification.Name, | ||
| fmt.Sprintf("metadata.name must match the normalized spec.type %q", expectedName), | ||
| ) | ||
| } | ||
| if strings.TrimSpace(filespecification.Spec.Type) == "" { | ||
| valErr.AddRequiredError(field.NewPath("spec").Child("type"), "spec.type is required") | ||
| } |
| func MakeName(fileType, ownerName string) string { | ||
| return filev1.MakeFileTypeName(fileType) + "--" + labelutil.NormalizeValue(ownerName) | ||
| } |
There was a problem hiding this comment.
🟡 Changes recommended
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (1)
file/api/v1/shared_types.go:33
- File API defines Visibility/ApprovalStrategy/Approval here, but the same identifiers are also defined in file/api/v1/file_shared_types.go. Having both files in the same package will cause duplicate identifier compile errors; please consolidate these shared types into a single definition.
- Files reviewed: 219/260 changed files
- Comments generated: 4
- Review effort level: Lite
| fileExposure.Spec = filev1.FileExposureSpec{ | ||
| Approval: filev1.Approval{Strategy: filev1.ApprovalStrategy(exp.Approval.Strategy)}, | ||
| Visibility: filev1.Visibility(exp.Visibility.String()), | ||
| FileType: exp.FileType, | ||
| Sftp: filev1.SftpExposure{ | ||
| PublicKeys: mapPublicKeys(exp.PublicKeys), | ||
| }, | ||
| Zone: zoneRef, | ||
| } |
| fileSubscription.Spec = filev1.FileSubscriptionSpec{ | ||
| FileType: sub.FileType, | ||
| Sftp: filev1.SftpSubscription{ | ||
| PublicKeys: mapPublicKeys(sub.PublicKeys), | ||
| }, | ||
| } |
| // +kubebuilder:validation:Required | ||
| // +kubebuilder:validation:MinItems=1 | ||
| // +kubebuilder:validation:uniqueItems=true | ||
| // +kubebuilder:validation:MinItems=1 | ||
| SSHPublicKeys []string `json:"sshPublicKeys"` |
The merge of feat-lk-file-domain into this branch left over four job stanzas (projector, permission, sftp, file) at the bottom of ci.yaml that referenced .github/workflows/reusable-go-ci.yaml, a file removed by the CI redesign in #626. Referencing a non-existent reusable workflow makes the whole ci.yaml run invalid, so GitHub Actions failed the run before scheduling any job (0 jobs, conclusion: failure) - which is why no package/image-build job ever ran. projector and permission are already covered by the modules.yaml matrix, so their stale blocks are just removed. sftp and file are new modules that need to be added to modules.yaml instead of hand-rolled jobs; module-graph.json is regenerated accordingly (make ci-graph). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The file and sftp modules were synced from the feat-lk-* branches, whose go.mod pinned gomega v1.42.1. main has since bumped it to v1.43.0, so 'make manifests' failed with 'updates to go.mod needed' when CI built the PR merge ref, which blocked image publishing for every module. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
GetAllRoverProblems checked api, application and event sub-resources but never the file ones, even though FileExposureStore and FileSubscriptionStore are wired up. As a result a Rover blocked on a FileExposure or FileSubscription reported an empty error list, so roverctl could only print the generic 'resource processing failed' instead of the real cause. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
To test the whole flow in the dcp