Skip to content

OSAC-3593: Sync test changes from osac-test-infra PRs #367, #410, #417 - #645

Merged
osac-ci-bot merged 3 commits into
osac-project:mainfrom
redhat-chai-bot:osac-3633/sync-storage-tier-tests
Aug 31, 2026
Merged

OSAC-3593: Sync test changes from osac-test-infra PRs #367, #410, #417#645
osac-ci-bot merged 3 commits into
osac-project:mainfrom
redhat-chai-bot:osac-3633/sync-storage-tier-tests

Conversation

@amej

@amej amej commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

At time of publishing this PR ( Aug 31 2026 )
Whats present in the osac-test-infra but missing from the osac mono repo are

clobrano and others added 3 commits August 27, 2026 19:04
…oject#367)

Implements E2E test infrastructure and test cases for per-disk storage
tier selection in ComputeInstances:

- **Test infrastructure**: Session-scoped StorageBackend + StorageTier
fixtures with autouse CLI integration
- **CLI wrapper enhancements**: `additional_disks` parameter support
(size_gib + storage_tier per disk)
- **13 test cases**: Core tier selection, validation, immutability, and
default resolution chain (CatalogItem FieldDefinition → Template
SpecDefaults → session default)

All tests validate both CR spec fields (via K8s API) and gRPC API
responses. Two tests skipped pending mandatory validation in a follow-up
osac PR.

https://issues.redhat.com/browse/OSAC-3633

- [x] All existing tests pass (vmaas suite)
- [x] New storage tier tests pass locally
- [x] CLI wrapper validates storage_tier presence in additional_disks
- [x] Lint checks pass (ruff not available locally, CI will validate)
- [x] No secrets or credentials in changes
- [x] Pre-flight security review: PASS (advisory findings only,
untracked files)
- [x] Pre-flight performance review: PASS (advisory findings only,
untracked files)

---

_This PR description was drafted with AI assistance
([create-pr](https://github.com/osac-project/osac-workspace/tree/main/skills/create-pr)
v0.1.3). Review for accuracy_

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

- **New Features**
  - Added private-mode authentication.
- Added default disk image and storage-tier settings for compute
instances.
  - Added separate storage tiers for boot and additional disks.
  - Added GPU options for instance types and optional cluster versions.
  - Added bare-metal instance description support.

- **Bug Fixes**
  - Improved validation for missing or invalid storage tiers.
- Corrected catalog defaults for disk images, instance types, and
versions.

- **Tests**
- Expanded coverage for storage-tier persistence, overrides, defaults,
and immutability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Carlo Lobrano <c.lobrano@gmail.com>
…ct#410)

Assisted-by: Claude Code <noreply@anthropic.com>

Signed-off-by: Ori Amizur <oamizur@redhat.com>
…ent (osac-project#417)

## Summary
- Move `protocol` from each `BackendAssociation` up to `StorageTierSpec`
in `create_storage_tier`, matching the
[OSAC-3014](https://redhat.atlassian.net/browse/OSAC-3014) storage tier
API.
- Fixes VMaaS e2e (`test_compute_instance_storage_tier`) which fails
with `BackendAssociation has no known field named protocol` against the
new API.
- Depends on osac-project#292; this is a hard cutover (no payload
satisfies both old and new APIs), so merge only once that API change is
deployed to the e2e target.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved storage-tier creation requests by using a single protocol
setting and simplifying backend configuration.
* Standardized storage-tier retrieval request formatting and filter
handling.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@openshift-ci-robot

openshift-ci-robot commented Aug 31, 2026

Copy link
Copy Markdown

@amej: This pull request references OSAC-3593 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.1.0" version, but no target version was set.

Details

In response to this:

At time of publishing this PR ( Aug 31 2026 )
Whats present in the osac-test-infra but missing from the osac mono repo are

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 310 files, which is 10 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 11e291c2-57b0-4b5d-9ce3-aa9c22a418c6

📥 Commits

Reviewing files that changed from the base of the PR and between e297d4a and c1fa03a.

⛔ Files ignored due to path filters (151)
  • bare-metal-fulfillment-operator/go.sum is excluded by !**/*.sum
  • fulfillment-service/go.sum is excluded by !**/*.sum
  • fulfillment-service/internal/api/osac/private/v1/baremetal_instance_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/baremetal_instance_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/baremetal_instance_type_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/baremetal_instance_type_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/cluster_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/cluster_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/compute_instance_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/compute_instance_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/external_ip_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/external_ip_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/project_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/project_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/storage_backend_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/storage_backend_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/storage_tier_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/storage_tier_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/tenant_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/private/v1/tenant_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/baremetal_instance_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/baremetal_instance_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/baremetal_instance_type_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/baremetal_instance_type_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/cluster_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/cluster_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/compute_instance_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/compute_instance_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/external_ip_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/external_ip_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/storage_tier_type.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/storage_tier_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/storage_tiers_service.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/storage_tiers_service.pb.gw.go is excluded by !**/*.pb.gw.go
  • fulfillment-service/internal/api/osac/public/v1/storage_tiers_service_grpc.pb.go is excluded by !**/*.pb.go
  • fulfillment-service/internal/api/osac/public/v1/storage_tiers_service_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-csi-driver/go.sum is excluded by !**/*.sum
  • osac-installer/charts/osac-infra/files/realm.json is excluded by !**/realm.json
  • osac-installer/prerequisites/keycloak/service/files/realm.json is excluded by !**/realm.json
  • osac-metering/adapters/go.sum is excluded by !**/*.sum
  • osac-metering/metering-service/go.sum is excluded by !**/*.sum
  • osac-metering/metering-service/internal/api/osac/private/v1/authn_capabilities_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instance_catalog_item_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instance_catalog_items_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instance_common_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instance_template_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instance_templates_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instance_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instance_type_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/baremetal_instances_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/break_glass_credentials_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/capabilities_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/capabilities_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_catalog_item_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_catalog_items_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_catalog_items_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_common_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_template_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_templates_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_templates_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_version_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_versions_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/cluster_versions_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/clusters_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/clusters_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_catalog_item_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_catalog_items_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_catalog_items_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_common_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_template_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_templates_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_templates_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instance_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instances_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/compute_instances_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/condition_status_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/disk_image_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/disk_images_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/disk_images_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/external_ip_attachment_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/external_ip_attachments_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/external_ip_attachments_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/external_ip_pool_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/external_ip_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/external_ips_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/external_ips_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/field_definition_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/host_type_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/host_types_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/host_types_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/hub_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/hubs_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/identity_provider_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/identity_providers_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/identity_providers_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/instance_type_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/instance_types_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/instance_types_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/ip_family_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/nat_gateway_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/nat_gateways_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/nat_gateways_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/network_class_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/project_membership_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/project_memberships_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/projects_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/role_binding_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/role_bindings_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/role_bindings_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/role_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/roles_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/roles_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/secret_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/secrets_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/security_groups_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/security_rule_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/storage_backend_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/storage_backends_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/storage_tier_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/storage_tiers_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/subnet_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/subnets_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/tenants_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/tenants_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/user_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/users_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/users_service_grpc.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/virtual_network_type.pb.go is excluded by !**/*.pb.go
  • osac-metering/metering-service/internal/api/osac/private/v1/virtual_networks_service.pb.go is excluded by !**/*.pb.go
  • osac-metering/schema/go.sum is excluded by !**/*.sum
  • osac-operator/api/go.sum is excluded by !**/*.sum
  • osac-operator/go.sum is excluded by !**/*.sum
  • osac-operator/internal/api/osac/private/v1/baremetal_instance_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/baremetal_instance_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/baremetal_instance_type_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/baremetal_instance_type_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/cluster_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/cluster_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/compute_instance_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/compute_instance_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/external_ip_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/external_ip_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/project_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/project_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/storage_backend_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/storage_backend_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/storage_tier_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/storage_tier_type_protoopaque.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/tenant_type.pb.go is excluded by !**/*.pb.go
  • osac-operator/internal/api/osac/private/v1/tenant_type_protoopaque.pb.go is excluded by !**/*.pb.go
📒 Files selected for processing (310)
  • .github/actions/setup-python/action.yaml
  • .github/scripts/osac-metering-verify-tag-matches-sha.sh
  • .github/scripts/wait-for-ghcr-image.sh
  • .github/workflows/check-floating-tags.yaml
  • .github/workflows/check-generated-code.yaml
  • .github/workflows/cleanup-nightly-branches.yaml
  • .github/workflows/codeql.yml
  • .github/workflows/e2e-on-approval-fork.yml
  • .github/workflows/e2e-on-approval.yml
  • .github/workflows/e2e-on-label.yml
  • .github/workflows/helm-lint.yaml
  • .github/workflows/integration-tests.yml
  • .github/workflows/nightly-build.yaml
  • .github/workflows/publish-charts.yaml
  • .github/workflows/publish-osac-installer-chart.yaml
  • .github/workflows/unit-tests.yml
  • .tekton/bare-metal-fulfillment-operator-pull-request.yaml
  • .tekton/bare-metal-fulfillment-operator-push.yaml
  • .tekton/fulfillment-service-pull-request.yaml
  • .tekton/fulfillment-service-push.yaml
  • .tekton/osac-csi-driver-pull-request.yaml
  • .tekton/osac-csi-driver-push.yaml
  • .tekton/osac-operator-pull-request.yaml
  • .tekton/osac-operator-push.yaml
  • OWNERS
  • bare-metal-fulfillment-operator/Containerfile
  • bare-metal-fulfillment-operator/api/v1alpha1/baremetalinstance_types.go
  • bare-metal-fulfillment-operator/api/v1alpha1/zz_generated.deepcopy.go
  • bare-metal-fulfillment-operator/charts/operator-crds/templates/osac.openshift.io_baremetalinstances.yaml
  • bare-metal-fulfillment-operator/charts/operator/templates/clusterrole.yaml
  • bare-metal-fulfillment-operator/charts/operator/templates/deployment.yaml
  • bare-metal-fulfillment-operator/charts/operator/values.yaml
  • bare-metal-fulfillment-operator/cmd/main.go
  • bare-metal-fulfillment-operator/config/crd/bases/osac.openshift.io_baremetalinstances.yaml
  • bare-metal-fulfillment-operator/config/rbac/role.yaml
  • bare-metal-fulfillment-operator/go.mod
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_cleanup.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_cleanup_test.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_controller.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_controller_test.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_ip_discovery.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_ip_discovery_test.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_metal3_integration_test.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_names.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_networking.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalinstance_networking_test.go
  • bare-metal-fulfillment-operator/internal/controller/baremetalpool_controller.go
  • bare-metal-fulfillment-operator/internal/controller/suite_test.go
  • bare-metal-fulfillment-operator/internal/management/client.go
  • bare-metal-fulfillment-operator/internal/management/metal3.go
  • bare-metal-fulfillment-operator/internal/management/metal3_test.go
  • bare-metal-fulfillment-operator/internal/management/openstack.go
  • docs/CONVENTIONS.md
  • fulfillment-service/Containerfile
  • fulfillment-service/Makefile
  • fulfillment-service/docs/AUTH.md
  • fulfillment-service/docs/CATALOG_ITEMS.md
  • fulfillment-service/go.mod
  • fulfillment-service/internal/auth/policies/authz.rego
  • fulfillment-service/internal/cmd/cli/create/cluster/create_cluster_cmd.go
  • fulfillment-service/internal/cmd/cli/create/cluster/create_cluster_cmd_test.go
  • fulfillment-service/internal/cmd/cli/create/storagetier/create_storagetier_cmd.go
  • fulfillment-service/internal/cmd/cli/create/storagetier/create_storagetier_cmd_test.go
  • fulfillment-service/internal/cmd/cli/create/storagetier/create_storagetier_suite_test.go
  • fulfillment-service/internal/cmd/cli/describe/describe_cmd.go
  • fulfillment-service/internal/cmd/cli/describe/describe_cmd_test.go
  • fulfillment-service/internal/cmd/cli/describe/storagetier/describe_storagetier_cmd.go
  • fulfillment-service/internal/cmd/cli/describe/storagetier/describe_storagetier_cmd_test.go
  • fulfillment-service/internal/cmd/cli/describe/storagetier/describe_storagetier_suite_test.go
  • fulfillment-service/internal/cmd/cli/get/get_cmd.go
  • fulfillment-service/internal/cmd/cli/get/storagetier/get_storagetier_cmd.go
  • fulfillment-service/internal/cmd/cli/get/storagetier/get_storagetier_cmd_test.go
  • fulfillment-service/internal/cmd/cli/get/storagetier/get_storagetier_suite_test.go
  • fulfillment-service/internal/cmd/cli/login/login_cmd.go
  • fulfillment-service/internal/cmd/cli/login/login_cmd_test.go
  • fulfillment-service/internal/cmd/cli/login/login_suite_test.go
  • fulfillment-service/internal/cmd/service/start/grpcserver/register_servers.go
  • fulfillment-service/internal/cmd/service/start/grpcserver/start_grpc_server_cmd.go
  • fulfillment-service/internal/cmd/service/start/restgateway/start_rest_gateway_cmd.go
  • fulfillment-service/internal/controllers/cluster/cluster_reconciler_function.go
  • fulfillment-service/internal/controllers/cluster/cluster_reconciler_function_test.go
  • fulfillment-service/internal/controllers/cluster/secrets_client_mock.go
  • fulfillment-service/internal/controllers/externalip/external_ip_reconciler_function.go
  • fulfillment-service/internal/controllers/externalip/external_ip_reconciler_function_test.go
  • fulfillment-service/internal/controllers/externalipattachment/external_ip_attachment_reconciler_function.go
  • fulfillment-service/internal/controllers/externalipattachment/external_ip_attachment_reconciler_function_test.go
  • fulfillment-service/internal/controllers/natgateway/nat_gateway_reconciler_function.go
  • fulfillment-service/internal/controllers/natgateway/nat_gateway_reconciler_function_test.go
  • fulfillment-service/internal/controllers/onboarding/tenant_reconciler_function.go
  • fulfillment-service/internal/controllers/onboarding/tenant_reconciler_function_test.go
  • fulfillment-service/internal/controllers/project/project_reconciler_function_test.go
  • fulfillment-service/internal/controllers/securitygroup/securitygroup_reconciler_function.go
  • fulfillment-service/internal/controllers/securitygroup/securitygroup_reconciler_function_test.go
  • fulfillment-service/internal/controllers/tenant/tenant_reconciler_function.go
  • fulfillment-service/internal/controllers/tenant/tenant_reconciler_function_test.go
  • fulfillment-service/internal/database/dao/generic_dao_delete.go
  • fulfillment-service/internal/database/dao/generic_dao_request.go
  • fulfillment-service/internal/database/migrations.sha256
  • fulfillment-service/internal/database/migrations/102_relocate_storage_tier_protocol_remove_quota.up.sql
  • fulfillment-service/internal/database/migrations/102_relocate_storage_tier_protocol_remove_quota_test.go
  • fulfillment-service/internal/database/migrations/103_add_external_ip_not_in_use_trigger.up.sql
  • fulfillment-service/internal/database/migrations/103_add_external_ip_not_in_use_trigger_test.go
  • fulfillment-service/internal/database/migrations/104_add_subnet_sg_delete_guard.up.sql
  • fulfillment-service/internal/database/migrations/104_add_subnet_sg_delete_guard_test.go
  • fulfillment-service/internal/database/migrations/105_add_target_not_in_use_guards.up.sql
  • fulfillment-service/internal/database/migrations/105_add_target_not_in_use_guards_test.go
  • fulfillment-service/internal/idp/project_group_manager.go
  • fulfillment-service/internal/idp/project_group_manager_test.go
  • fulfillment-service/internal/kubernetes/labels/kubernetes_labels.go
  • fulfillment-service/internal/oauth/oauth_credentials_flow.go
  • fulfillment-service/internal/oauth/oauth_token_source.go
  • fulfillment-service/internal/references/reference_validator.go
  • fulfillment-service/internal/rendering/tables/osac.private.v1.BareMetalInstance.yaml
  • fulfillment-service/internal/rendering/tables/osac.public.v1.BareMetalInstance.yaml
  • fulfillment-service/internal/servers/default_networking_provisioner.go
  • fulfillment-service/internal/servers/default_networking_provisioner_test.go
  • fulfillment-service/internal/servers/generic_server.go
  • fulfillment-service/internal/servers/private_baremetal_instances_server.go
  • fulfillment-service/internal/servers/private_baremetal_instances_server_test.go
  • fulfillment-service/internal/servers/private_clusters_server.go
  • fulfillment-service/internal/servers/private_compute_instances_server.go
  • fulfillment-service/internal/servers/private_projects_server.go
  • fulfillment-service/internal/servers/private_projects_server_test.go
  • fulfillment-service/internal/servers/private_secrets_server.go
  • fulfillment-service/internal/servers/private_secrets_server_test.go
  • fulfillment-service/internal/servers/private_storage_backends_server.go
  • fulfillment-service/internal/servers/private_storage_backends_server_test.go
  • fulfillment-service/internal/servers/private_storage_tiers_server_test.go
  • fulfillment-service/internal/servers/private_tenants_server.go
  • fulfillment-service/internal/servers/private_tenants_server_test.go
  • fulfillment-service/internal/servers/storage_tiers_server.go
  • fulfillment-service/internal/servers/storage_tiers_server_test.go
  • fulfillment-service/internal/validation/protovalidate_interceptor_test.go
  • fulfillment-service/internal/vault/vault_authenticator.go
  • fulfillment-service/internal/vault/vault_errors.go
  • fulfillment-service/internal/vault/vault_flags.go
  • fulfillment-service/internal/vault/vault_flags_test.go
  • fulfillment-service/internal/vault/vault_lifecycle_factory.go
  • fulfillment-service/internal/vault/vault_secret_store.go
  • fulfillment-service/internal/vault/vault_secret_store_test.go
  • fulfillment-service/internal/vault/vault_service_tenant_token_source.go
  • fulfillment-service/internal/vault/vault_service_token_source_factory.go
  • fulfillment-service/internal/vault/vault_token_source.go
  • fulfillment-service/internal/vault/vault_token_source_mock.go
  • fulfillment-service/it/it_cluster_reconciler_test.go
  • fulfillment-service/it/it_compute_subnet_test.go
  • fulfillment-service/it/it_public_storage_tiers_test.go
  • fulfillment-service/it/it_suite_test.go
  • fulfillment-service/it/it_tenant_lifecycle_test.go
  • fulfillment-service/it/it_tenant_onboarding_test.go
  • fulfillment-service/proto/private/osac/private/v1/baremetal_instance_type.proto
  • fulfillment-service/proto/private/osac/private/v1/baremetal_instance_type_type.proto
  • fulfillment-service/proto/private/osac/private/v1/cluster_type.proto
  • fulfillment-service/proto/private/osac/private/v1/compute_instance_type.proto
  • fulfillment-service/proto/private/osac/private/v1/external_ip_type.proto
  • fulfillment-service/proto/private/osac/private/v1/project_type.proto
  • fulfillment-service/proto/private/osac/private/v1/storage_backend_type.proto
  • fulfillment-service/proto/private/osac/private/v1/storage_tier_type.proto
  • fulfillment-service/proto/private/osac/private/v1/tenant_type.proto
  • fulfillment-service/proto/public/osac/public/v1/baremetal_instance_type.proto
  • fulfillment-service/proto/public/osac/public/v1/baremetal_instance_type_type.proto
  • fulfillment-service/proto/public/osac/public/v1/cluster_type.proto
  • fulfillment-service/proto/public/osac/public/v1/compute_instance_type.proto
  • fulfillment-service/proto/public/osac/public/v1/external_ip_type.proto
  • fulfillment-service/proto/public/osac/public/v1/storage_tier_type.proto
  • fulfillment-service/proto/public/osac/public/v1/storage_tiers_service.proto
  • osac-aap/Makefile
  • osac-aap/_move_one_attachment.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/inventory/tasks/read_server_ports.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/inventory/tasks/read_servers.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/ipam/tasks/delete_allocation.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/ipam/tasks/read_hosts.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/ipam/tasks/read_subnets.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/ipam/tasks/read_tree.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/vnet/meta/argument_specs.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/vnet/tasks/create.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/vnet/tasks/read.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/vnet/tasks/read_by_id.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/vnet/tasks/update.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/vnet/tasks/wait_active.yaml
  • osac-aap/collections/ansible_collections/netris/controller/roles/vpc/tasks/read.yaml
  • osac-aap/collections/ansible_collections/osac/config_as_code/roles/aap/vars/controller.yml
  • osac-aap/collections/ansible_collections/osac/service/roles/cluster_settings/tasks/main.yml
  • osac-aap/collections/ansible_collections/osac/service/roles/storage_provider/meta/argument_specs.yaml
  • osac-aap/collections/ansible_collections/osac/service/roles/storage_provider/tests/test.yml
  • osac-aap/collections/ansible_collections/osac/service/roles/vnet_lock/meta/argument_specs.yaml
  • osac-aap/collections/ansible_collections/osac/service/roles/vnet_lock/tasks/acquire.yaml
  • osac-aap/collections/ansible_collections/osac/service/roles/vnet_lock/tasks/release.yaml
  • osac-aap/collections/ansible_collections/osac/templates/README.md
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/meta/argument_specs.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/_attach_port_to_vnet.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/_detach_port_from_vnet.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/_resolve_server_port.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/attach_external_ip.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/create_external_ip.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/create_external_ip_pool.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/create_nat_gateway.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/create_security_group.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/create_subnet.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/delete_external_ip_pool.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/delete_security_group.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/delete_virtual_network.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/move_network_attachment.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/query_dhcp_lease.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/vast_storage/meta/osac.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/vast_storage/tasks/ensure_storage_class.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/vast_storage/tasks/setup.yaml
  • osac-aap/execution-environment/requirements.txt
  • osac-aap/group_vars/all/configuration.yaml
  • osac-aap/playbook_osac_create_tenant_cluster_storage.yml
  • osac-aap/playbook_osac_create_tenant_storage_backend.yml
  • osac-aap/playbook_osac_delete_tenant_cluster_storage.yml
  • osac-aap/playbook_osac_delete_tenant_storage_backend.yml
  • osac-aap/playbook_osac_move_network_attachment.yml
  • osac-aap/playbook_osac_query_dhcp_lease.yml
  • osac-aap/samples/storage_tier_definitions_payload.json
  • osac-csi-driver/Containerfile
  • osac-csi-driver/charts/csi-backends/values.yaml
  • osac-csi-driver/charts/csi-driver/values.yaml
  • osac-csi-driver/go.mod
  • osac-installer/charts/osac/Chart.yaml
  • osac-installer/charts/osac/templates/bundled-openbao.yaml
  • osac-installer/charts/osac/templates/hooks/register-local-storage.yaml
  • osac-installer/charts/osac/templates/network-managers.yaml
  • osac-installer/charts/osac/values.schema.json
  • osac-installer/charts/osac/values.yaml
  • osac-installer/docs/helm-deployment-guide.md
  • osac-installer/scripts/nightly-charts.sh
  • osac-installer/values/bmaas-ci/instance.yaml
  • osac-installer/values/dev/kind-instance.yaml
  • osac-metering/AGENTS.md
  • osac-metering/README.md
  • osac-metering/adapters/Containerfile.echo-adapter
  • osac-metering/adapters/Containerfile.m360-adapter
  • osac-metering/adapters/Makefile
  • osac-metering/adapters/adapter.go
  • osac-metering/adapters/cmd/echo-adapter/main.go
  • osac-metering/adapters/cmd/m360-adapter/client.go
  • osac-metering/adapters/cmd/m360-adapter/main.go
  • osac-metering/adapters/dlq.go
  • osac-metering/adapters/dlq_test.go
  • osac-metering/adapters/go.mod
  • osac-metering/adapters/kafka.go
  • osac-metering/adapters/metrics.go
  • osac-metering/adapters/metrics_test.go
  • osac-metering/adapters/runner.go
  • osac-metering/adapters/runner_process.go
  • osac-metering/adapters/runner_test.go
  • osac-metering/adapters/topics.go
  • osac-metering/charts/osac-metering/templates/echo-adapter-deployment.yaml
  • osac-metering/charts/osac-metering/templates/echo-adapter-kafka-user.yaml
  • osac-metering/charts/osac-metering/templates/kafka-topics.yaml
  • osac-metering/charts/osac-metering/templates/m360-adapter-deployment.yaml
  • osac-metering/charts/osac-metering/templates/m360-adapter-kafka-user.yaml
  • osac-metering/charts/osac-metering/values.yaml
  • osac-metering/metering-service/Containerfile
  • osac-metering/metering-service/Makefile
  • osac-metering/metering-service/buf.gen.yaml
  • osac-metering/metering-service/go.mod
  • osac-metering/metering-service/internal/dummy/cleanapi/cleanapi.go
  • osac-metering/schema/go.mod
  • osac-operator/Containerfile
  • osac-operator/api/go.mod
  • osac-operator/buf.gen.yaml
  • osac-operator/charts/operator/templates/deployment.yaml
  • osac-operator/charts/operator/values.yaml
  • osac-operator/cmd/main.go
  • osac-operator/config/crd/fakes/osac.openshift.io_baremetalinstances.yaml
  • osac-operator/config/rbac/role.yaml
  • osac-operator/go.mod
  • osac-operator/internal/controller/computeinstance_controller.go
  • osac-operator/internal/controller/externalip_controller.go
  • osac-operator/internal/controller/externalip_controller_test.go
  • osac-operator/internal/controller/externalip_names.go
  • osac-operator/internal/controller/externalipattachment_controller.go
  • osac-operator/internal/controller/externalipattachment_controller_test.go
  • osac-operator/internal/controller/externalipattachment_names.go
  • osac-operator/internal/controller/externalippool_controller.go
  • osac-operator/internal/controller/externalippool_controller_test.go
  • osac-operator/internal/controller/natgateway_controller.go
  • osac-operator/internal/controller/natgateway_controller_test.go
  • osac-operator/internal/controller/natgateway_names.go
  • osac-operator/internal/controller/networking_provisioning_disabled_test.go
  • osac-operator/internal/controller/securitygroup_controller.go
  • osac-operator/internal/controller/securitygroup_controller_test.go
  • osac-operator/internal/controller/storage_controller.go
  • osac-operator/internal/controller/storage_controller_test.go
  • osac-operator/internal/controller/storage_tier_definitions.go
  • osac-operator/internal/controller/subnet_controller.go
  • osac-operator/internal/controller/subnet_controller_test.go
  • osac-operator/internal/controller/subnet_names.go
  • osac-operator/internal/controller/virtualnetwork_controller.go
  • osac-operator/internal/controller/virtualnetwork_controller_test.go
  • osac-operator/pkg/aap/client.go
  • osac-operator/pkg/provisioning/aap_provider.go
  • osac-operator/pkg/provisioning/aap_provider_test.go
  • osac-operator/pkg/provisioning/extra_vars_context.go
  • osac-operator/pkg/provisioning/extra_vars_context_test.go
  • tests/catalog/test_catalog_item_lifecycle.py
  • tests/catalog/test_compute_instance_catalog_item_disk_image.py
  • tests/catalog/test_compute_instance_catalog_item_lifecycle.py
  • tests/conftest.py
  • tests/core/grpc_client.py
  • tests/core/k8s_client.py
  • tests/core/osac_cli.py
  • tests/vmaas/conftest.py
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/create_network_attachment.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/netris/tasks/delete_network_attachment.yaml
  • osac-aap/collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_quotas.yaml
  • tests/vmaas/test_compute_instance_storage_tier.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 31, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:58 PM UTC · Completed 1:17 PM UTC

Commit: c1fa03a · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $7.39

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 31, 2026

Copy link
Copy Markdown

Review

Findings

Medium

  • [nil-deref] tests/vmaas/test_compute_instance_storage_tier.py:806 — Six test functions call wait_for_deletion(k8s=k8s_hub_client, name=ci_name) without checking if ci_name is None in their inner finally blocks. If wait_for_cr fails, ci_name remains None and the teardown throws an unrelated TypeError, masking the original failure. Affected locations: lines 806, 928, 1042, 1148, 1257, 1364. Other tests in the same file (e.g., test_compute_instance_explicit_boot_disk_tier at line 484) correctly guard with if ci_name is not None:.
    Remediation: Add if ci_name is not None: before each wait_for_deletion call, matching the pattern used in test_compute_instance_explicit_boot_disk_tier and test_compute_instance_multiple_disks_different_tiers.

  • [api-contract] tests/core/osac_cli.py:105OsacCLI.create_compute_instance now unconditionally raises ValueError when neither boot_disk_storage_tier nor default_storage_tier is set (lines 137–140). This makes storage_tier a hard requirement for all CLI-based compute instance creation. The _set_cli_default_storage_tier autouse fixture in tests/vmaas/conftest.py only applies to tests collected under tests/vmaas/. Any future test outside that directory calling create_compute_instance via OsacCLI would fail unexpectedly. Currently no such callers exist, but the risk is latent.
    Remediation: Either make boot_disk_storage_tier optional (only pass --boot-disk-storage-tier when a value is available), or move the default_storage_tier fixture to the top-level tests/conftest.py.

Low

  • [logic-error] tests/vmaas/test_compute_instance_storage_tier.py:420verify_datavolume_storage_classes retrieves vmi_ns via get_compute_instance_vm_namespace but never passes it to the DataVolume lookup calls. k8s_virt_client.get_datavolume_storage_class() uses self.namespace (the osac-devel namespace), not the VMI namespace where DataVolumes reside. Currently commented out at all call sites with a note referencing PR OSAC-3632: per-disk StorageClass resolution in AAP #257 (OSAC-3632), so no runtime impact today.
    Remediation: When uncommenting after PR OSAC-3632: per-disk StorageClass resolution in AAP #257, pass vmi_ns to get_datavolume_storage_class or construct a properly-scoped client.

  • [code-organization] tests/vmaas/test_compute_instance_storage_tier.py:617import json inside test_compute_instance_tier_immutability is a function-body import. The codebase convention is module-level imports.
    Remediation: Move import json to the top of the file alongside the other imports.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run

Review

Findings

Medium

  • [edge-case] tests/vmaas/test_compute_instance_storage_tier.py:806 — Six catalog-item test functions (test_compute_instance_boot_disk_tier_from_catalog_item_default and 5 others at lines 928, 1042, 1148, 1257, 1364) call wait_for_deletion(k8s=k8s_hub_client, name=ci_name) in the inner finally block without an if ci_name is not None guard. If wait_for_cr() raises before assigning ci_name, cleanup passes None to wait_for_deletion, causing a secondary crash that masks the original error. The first three tests in the file correctly guard this.
    Remediation: Add if ci_name is not None: before each unguarded wait_for_deletion call.

  • [logic-error] tests/core/osac_cli.py:291create_compute_instance now unconditionally raises ValueError when neither boot_disk_storage_tier nor default_storage_tier is set. This follows the existing disk_image/instance_type pattern in the same method, but makes --boot-disk-storage-tier mandatory for all CLI-based test callers. The _set_cli_default_storage_tier autouse fixture covers tests/vmaas/ callers.
    Remediation: Confirm no existing callers outside tests/vmaas/ use cli.create_compute_instance, or make the argument optional when the CLI flag is not yet supported.

  • [branch-ticket mismatch] — PR title references OSAC-3593 but the branch name contains OSAC-3633. Align so both reference the same authorizing Jira ticket.

Low

  • [unused-variable] tests/vmaas/test_compute_instance_storage_tier.py:420vmi_ns is computed in verify_datavolume_storage_classes but never used; k8s_virt_client.get_datavolume_storage_class uses k8s_virt_client.namespace instead of the VM namespace. Latent bug in dead code (all calls commented out pending osac PR OSAC-3632: per-disk StorageClass resolution in AAP #257).

  • [inconsistent update mask key casing] tests/core/grpc_client.py:713update_network_class uses "updateMask" (matches the ~8-method majority convention). Two structurally similar catalog-item update methods use "update_mask". Both forms work with gRPC; update_network_class follows the dominant pattern.

  • [code-organization] tests/vmaas/test_compute_instance_storage_tier.py:617import json placed inside test_compute_instance_tier_immutability function body; codebase convention is top-level imports.

  • [scope-creep] tests/catalog/test_catalog_item_lifecycle.py — Catalog test files change field_definition defaults from {"stringValue": "..."} to plain string values. This change is not attributable to any of the three listed upstream PRs (NO-ISSUE: fix Volume reconciler test referencing removed VolumeSpec.PVCRef #367, OSAC-4201: [DEV] CRD Types, Inventory Interface, Metal3 Backend, and Controller NIC Gate #410, OSAC-4195: Add cleanapi to private-only protos #417). Consider documenting which upstream change introduced this format simplification.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

@amej
amej marked this pull request as ready for review August 31, 2026 13:21
@openshift-ci
openshift-ci Bot requested review from adriengentil and ybettan August 31, 2026 13:21
@osac-ci-bot
osac-ci-bot dismissed fullsend-ai-review[bot]’s stale review August 31, 2026 13:21

Auto-dismissed: only Prow labels gate merging

@osac-ci-bot
osac-ci-bot enabled auto-merge August 31, 2026 13:22
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 31, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 1:23 PM UTC · Ended 1:36 PM UTC

Commit: c1fa03a · View workflow run →

@minmzzhang

Copy link
Copy Markdown
Contributor

/lgtm
/approve

@openshift-ci

openshift-ci Bot commented Aug 31, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: amej, minmzzhang

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@osac-ci-bot
osac-ci-bot added this pull request to the merge queue Aug 31, 2026
@github-actions

Copy link
Copy Markdown

E2E on lgtm

Label lgtm applied — starting expensive e2e (PR run replay).

  • Started: 0/3
  • Already active/green (skipped rerun): 3

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

{
"path": "disk_image",
"display_name": "Disk Image",
"editable": True,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] nil-deref

Six test functions call wait_for_deletion(k8s=k8s_hub_client, name=ci_name) without checking if ci_name is None in their inner finally blocks. If wait_for_cr fails, ci_name remains None and the teardown throws an unrelated TypeError masking the original failure. Affected lines: 806, 928, 1042, 1148, 1257, 1364. Other tests in the same file (e.g. line 484) correctly guard with if ci_name is not None.

Suggested fix: Add if ci_name is not None: before each wait_for_deletion call, matching the pattern used in test_compute_instance_explicit_boot_disk_tier and test_compute_instance_multiple_disks_different_tiers.

Comment thread tests/core/osac_cli.py
@@ -101,6 +105,34 @@ def create_compute_instance(
else:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] api-contract

OsacCLI.create_compute_instance now unconditionally raises ValueError when neither boot_disk_storage_tier nor default_storage_tier is set. This makes storage_tier a hard requirement for ALL CLI-based compute instance creation. The _set_cli_default_storage_tier autouse fixture only applies to tests under tests/vmaas/. Any future test outside that directory calling create_compute_instance via OsacCLI would fail. Currently no such callers exist, but the risk is latent.

Suggested fix: Either make boot_disk_storage_tier optional (only pass --boot-disk-storage-tier when a value is available), or move the default_storage_tier fixture to the top-level tests/conftest.py.

grpc.delete_compute_instance(ci_id=uuid)
wait_for_deletion(k8s=k8s_hub_client, name=ci_name)
finally:
private_grpc.delete_compute_instance_catalog_item(catalog_item_id=catalog_item_id)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] logic-error

verify_datavolume_storage_classes retrieves vmi_ns via get_compute_instance_vm_namespace but never uses it. The DataVolume lookup calls use k8s_virt_client.get_json which scopes to self.namespace (osac-devel), not the VMI namespace. Currently commented out at all call sites (no runtime impact) with a note referencing PR #257.

Suggested fix: When uncommenting after PR #257, pass vmi_ns to get_datavolume_storage_class or construct a properly-scoped client.

"spec": {
"catalog_item": {"id": catalog_item_id},
"instance_type": {"name": default_instance_type},
"boot_disk": {"size_gib": 20}, # Uses CatalogItem default tier

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] code-organization

import json inside test_compute_instance_tier_immutability is a function-body import. The codebase convention is module-level imports.

Suggested fix: Move import json to the top of the file alongside the other imports.

@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 1:23 PM UTC · Completed 1:36 PM UTC

Commit: c1fa03a · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $5.72

Merged via the queue into osac-project:main with commit 4148211 Aug 31, 2026
146 of 153 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants