Skip to content
This repository was archived by the owner on Sep 9, 2026. It is now read-only.

OSAC-43: adds VAST storage provider - #296

Merged
openshift-merge-bot[bot] merged 6 commits into
osac-project:mainfrom
wgordon17:MGMT-23930-ansible-storage-mvp
May 27, 2026
Merged

openshift-merge-bot[bot] merged 6 commits into
osac-project:mainfrom
wgordon17:MGMT-23930-ansible-storage-mvp

Conversation

@wgordon17

@wgordon17 wgordon17 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Summary

Summary by CodeRabbit

Release Notes

  • New Features

    • Added storage provider framework enabling multi-tier storage provisioning and lifecycle management (setup, provisioning, teardown).
    • Integrated VAST storage support with NFS and block storage protocols, including QoS policies, quotas, and optional snapshots.
    • Added just-in-time storage provisioning for compute instances to dynamically provision required storage classes at creation time.
  • Documentation

    • Updated documentation with comprehensive storage provider configuration guide and architecture overview.
  • Tests

    • Added integration tests for storage provisioning workflows and mock VMS API server for testing.

@openshift-ci

openshift-ci Bot commented May 13, 2026

Copy link
Copy Markdown

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci-robot

openshift-ci-robot commented May 13, 2026

Copy link
Copy Markdown

@wgordon17: This pull request references MGMT-23930 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 epic to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

  • Generalized storage provider interface with security-validated dispatcher and JIT consumption path
  • VAST Data as first provider: VMS tenant/VIP pool/view provisioning, dual-source credentials, EP Write our own version of the openstack.cloud.floating_ip module #26 labeled StorageClasses
  • Self-healing VAST CSI Operator installation via OLM with idempotent VastCSIDriver CR management

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.

@wgordon17 wgordon17 changed the title MGMT-23930: Storage provider MVP with VAST Data and self-healing CSI OSAC-43: refactors storage provider for multi-tier support and credential isolation May 13, 2026
@openshift-ci-robot

openshift-ci-robot commented May 13, 2026

Copy link
Copy Markdown

@wgordon17: This pull request references OSAC-43 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 epic to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

  • Replaces single-provider dispatch with per-tier provider model supporting mix-and-match providers per deployment
  • Eliminates admin credential leakage into tenant-namespace CSI Secrets by creating per-tenant VAST users with random passwords
  • Collapses CaaS from a separate provider type to provisioning target stubs within existing providers

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.

@wgordon17
wgordon17 force-pushed the MGMT-23930-ansible-storage-mvp branch from 017c5f9 to 33907a7 Compare May 13, 2026 21:05
@wgordon17 wgordon17 changed the title OSAC-43: refactors storage provider for multi-tier support and credential isolation MGMT-23930: adds VAST storage provider with multi-tier provisioning and tenant credential isolation May 13, 2026
@openshift-ci-robot

openshift-ci-robot commented May 13, 2026

Copy link
Copy Markdown

@wgordon17: This pull request references MGMT-23930 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 epic to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

  • Adds VAST Data as the first storage provider with per-tenant credential isolation, multi-tier support, and CSI operator lifecycle management
  • Replaces admin credential leakage into tenant-namespace CSI Secrets with per-tenant VAST users scoped to data-plane operations only
  • Aligns AAP template names (osac-create-org / osac-delete-org) with osac-operator PR MGMT-23327: Support project SCM from archive/tarball URI #210 for automatic tenant storage provisioning

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.

@wgordon17 wgordon17 changed the title MGMT-23930: adds VAST storage provider with multi-tier provisioning and tenant credential isolation MGMT-23930: adds VAST storage provider May 13, 2026
@wgordon17 wgordon17 changed the title MGMT-23930: adds VAST storage provider OSAC-43: adds VAST storage provider May 13, 2026
@openshift-ci-robot

openshift-ci-robot commented May 13, 2026

Copy link
Copy Markdown

@wgordon17: This pull request references OSAC-43 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 epic to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

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.

@wgordon17
wgordon17 force-pushed the MGMT-23930-ansible-storage-mvp branch 2 times, most recently from 02b9a70 to 3a64be2 Compare May 15, 2026 19:40
@wgordon17
wgordon17 force-pushed the MGMT-23930-ansible-storage-mvp branch 13 times, most recently from 09f1235 to 79db59d Compare May 17, 2026 18:51
@omer-vishlitzky

Copy link
Copy Markdown
Contributor

/retest

1 similar comment
@omer-vishlitzky

Copy link
Copy Markdown
Contributor

/retest

wgordon17 added 4 commits May 26, 2026 15:25
Signed-off-by: Will Gordon <wgordon@redhat.com>
Generated-By: Claude Code (Anthropic)
…rovider

Correctness: moves _provider_tiers into vars: on include_role, moves _vast_vms_conn before VIP pool creation, adds backward-compat default tier list in delete playbook, changes SC short-circuit to subset check, creates per-protocol view policies with proper name/ID separation, fixes view policy deletion for per-protocol loop with failure accumulator, fails explicitly on missing view_policy_name. Style: extracts _unique_providers and _dispatch_action to main.yaml, removes dead code. Testing: adds block tier and encryption passphrase coverage, adds admin cred absence assertion, fixes test assertions, adds max_tiers validation, removes smoke test from tracking.
Signed-off-by: Will Gordon <wgordon@redhat.com>
Generated-By: Claude Code (Anthropic)
Signed-off-by: Will Gordon <wgordon@redhat.com>
@akshaynadkarni
akshaynadkarni force-pushed the MGMT-23930-ansible-storage-mvp branch from 0015679 to acfdba3 Compare May 26, 2026 19:27
@coderabbitai

coderabbitai Bot commented May 26, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@akshaynadkarni, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 50 minutes and 22 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

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

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: b312f251-c527-4c42-b16f-b7eb3f71ffe5

📥 Commits

Reviewing files that changed from the base of the PR and between acfdba3 and 0593dc2.

⛔ Files ignored due to path filters (1)
  • vendor/ansible_collections/vastdata/vms/meta/runtime.yml is excluded by !vendor/**
📒 Files selected for processing (1)
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/ensure_storage_class.yaml

Walkthrough

This PR introduces a comprehensive storage provider framework with VAST Data as the first implementation. It adds just-in-time storage provisioning during compute instance creation, event-driven tenant lifecycle management, a mock VMS REST API server for testing, and extensive integration test coverage alongside AAP controller configuration for automated storage operations.

Changes

Storage Provider Framework & VAST Implementation

Layer / File(s) Summary
Storage Provider Dispatcher & Validation
collections/ansible_collections/osac/service/roles/storage_provider/meta/argument_specs.yaml, tasks/main.yaml, tasks/_dispatch_provider.yaml, tasks/setup.yaml, tasks/ensure_storage_class.yaml, tasks/teardown.yaml
Dispatcher role validates storage_provider_tiers (DNS labels, required fields, uniqueness), action/target enums, and tenant metadata, then dispatches to provider-specific implementations grouped by unique provider names.
VAST Tenant Provisioning & Rollback
collections/ansible_collections/osac/templates/roles/vast_storage/defaults/main.yaml, meta/osac.yaml, tasks/setup.yaml
VAST setup creates tenants in VMS API, per-tenant manager accounts, hub Kubernetes Secret with credentials, ensures shared VIP pool exists, and installs CSI operator; comprehensive rescue/rollback deletes partial resources on failure.
VAST StorageClass & VolumeSnapshot Provisioning
collections/ansible_collections/osac/templates/roles/vast_storage/tasks/ensure_storage_class.yaml
Ensures per-tier StorageClasses for NFS and block protocols with CSI parameters, optional host-encryption for block, and conditional VolumeSnapshotClass support when CRD exists and snapshots enabled.
VAST Resource Creation & Credential Helpers
collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_*.yaml, read_*.yaml, delete_*.yaml, ensure_csi_operator.yaml
Support tasks: create views/view-policies/QoS/quotas, manage per-tenant manager with role provisioning, read admin/tenant credentials with validation, delete VMS resources by tenant, ensure VAST CSI operator via OLM.

Compute Instance & Workflow Integration

Layer / File(s) Summary
JIT Storage Provisioning During VM Creation
playbook_osac_create_compute_instance.yml
Compute instance creation now parses STORAGE_TIERS environment variable, filters tiers by requested name, and invokes storage_provider ensure_storage_class to provision storage just-in-time when tiers match.
Event-Driven Tenant Lifecycle Playbooks
playbook_osac_configure_tenant_storage.yml, playbook_osac_delete_tenant_storage.yml, collections/ansible_collections/osac/workflows/playbooks/compute_instance/create.yml
EDA-driven playbooks handle tenant storage setup (initial provisioning + class creation), deletion, and VM creation workflow guard to surface storage class requirements early.
AAP Controller Storage Operations
collections/ansible_collections/osac/config_as_code/roles/aap/vars/controller.yml, templates/compute-instance-operations-ig.j2, templates/storage-operations-ig.j2
New job templates (create-org, delete-org), inventory, and instance group with pod template to execute storage operations; pod template configures environment from storage-operations Secret and ConfigMap.

Mock VMS Server & Integration Test Scaffold

Layer / File(s) Summary
Mock VAST VMS REST API
tests/integration/mock_vms_server.py
Python HTTP server simulates VMS endpoints (GET/POST/PATCH/DELETE for tenants, views, managers, quotas, policies, QoS, roles); includes auth token, call logging with sensitive redaction, state reset, and failure injection for testing.
Test Environment & Storage Setup
tests/integration/setup_test_env.sh, teardown_test_env.sh, run_tests.sh
Setup installs snapshot CRDs, applies fixtures, generates TLS, launches mock VMS server; teardown stops server; run_tests.sh gates storage suite on STORAGE_TESTS_ENABLED environment variable.

Storage Provider Integration Tests

Layer / File(s) Summary
Dispatcher Unit Tests
collections/ansible_collections/osac/service/roles/storage_provider/tests/test.yml
12 scenarios validate dispatcher validation: empty tiers, missing fields, invalid DNS labels, duplicate names, invalid enums (action/target/protocol/provider), tier count exceeded, missing tenant metadata.
Setup/Teardown/Rollback Integration Tests
tests/integration/targets/storage_provider_setup/, storage_provider_teardown/, storage_provider_setup_rollback/tasks/main.yml
End-to-end tests verify tenant setup (hub Secret, manager creation, VMS calls), full teardown (K8s + VMS resource deletion), and rollback behavior when setup fails mid-operation.
StorageClass & Onboarding Tests
tests/integration/targets/storage_provider_ensure_sc/, storage_provider_onboarding/tasks/main.yml
Verify StorageClass creation (NFS/block, parameters, labels, secrets), conditional VolumeSnapshotClass, short-circuit re-run preservation, and end-to-end onboarding (setup → ensure_storage_class).
Compute Instance Storage Integration
tests/integration/targets/compute_instance_*/tasks/baseline.yml, overrides.yml
Test fixtures now include tenant_storage_class_name variable for validating storage-aware VM provisioning in baseline and override scenarios.

Configuration, Documentation & Dependencies

Layer / File(s) Summary
Storage Operations Config Examples
config/base/configmap-storage-operations-ig-example.yaml, secret-storage-operations-ig-example.yaml
Example ConfigMap with STORAGE_TIERS JSON array (NFS/block tiers), snapshot flag, and TLS toggle; Secret template with VAST endpoint/username/password placeholders and usage scope comments.
Test Fixtures & Config Templates
tests/integration/fixtures/storage/*, integration_config.yml.template
Kubernetes fixtures for Tenant, Secret, StorageClass; integration config template for Tier 3 live API tests with VAST credential and tier tier config placeholders.
README & Dependencies
collections/ansible_collections/osac/templates/README.md, collections/requirements.yml
README adds storage provider authoring guide (tier dispatch, naming, credential isolation, provisioning targets, encryption, QoS) and architecture lifecycle diagram; requirements add vastdata.vms v1.2.0.
Miscellaneous Updates
.gitignore, collections/.../ocp_virt_vm/tasks/create_resources.yaml, find_template_roles.py, .github/workflows/tests.yml
Gitignore storage artifacts; VM task now passes tier-derived storage tier variable; template discovery recognizes storage_provider type; CI enables storage tests via environment flag.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

This PR is substantial and heterogeneous: it introduces a new architectural pattern (pluggable storage providers via dispatcher role), a complete VAST provider implementation with complex credential/VMS API interactions, event-driven playbooks, a realistic mock server for integration testing (348 lines of Python), comprehensive test coverage (multiple integration test playbooks), and AAP configuration changes. While most individual pieces follow clear patterns, the interconnections between storage dispatch, JIT provisioning, teardown/rollback, and test infrastructure demand careful review to ensure credential isolation, state cleanup, idempotency, and error handling are sound. Risk severity is medium-high: improperly managed VMS credentials, incomplete rollback, or race conditions in short-circuit logic could leave orphaned resources or expose credentials.

Possibly related PRs

  • osac-project/osac-aap#246: Both modify find_template_roles.py template discovery—main adds storage_provider type skipping, #246 adds compute-instance parameter defaults serialization.
  • osac-project/osac-aap#291: Main PR updates ocp_virt_vm to pass tier-derived tenant_storage_class_storage_tier; #291 implements tier-aware tenant_storage_class role argument selection logic.

Suggested labels

lgtm

Suggested reviewers

  • larsks
  • eranco74

🌟 From tiers of VAST to views that persist,
Tenants now provision what storage they've missed.
Rollback on fail, and cleanup so clean—
The finest JIT storage flow we've seen! 🚀

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

coderabbitai[bot]
coderabbitai Bot previously requested changes May 26, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 22

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
.github/workflows/tests.yml (1)

19-57: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Security risk: GitHub Actions must be pinned by full commit SHA, not mutable tags.

Actions are currently pinned by tags (v6, v7, v1) which are mutable references. An attacker who compromises the action repository or gains control of the tag could inject malicious code into your CI pipeline.

Risk severity: Major
Impact: Supply chain attack vector enabling arbitrary code execution in CI environment with access to repository secrets and GITHUB_TOKEN.

🔒 Recommended fix: Pin all actions by full SHA
       - name: Checkout
-        uses: actions/checkout@v6
+        uses: actions/checkout@<full-sha>  # v6

       - name: Install uv
-        uses: astral-sh/setup-uv@v7
+        uses: astral-sh/setup-uv@<full-sha>  # v7

       - name: "Set up Python"
-        uses: actions/setup-python@v6
+        uses: actions/setup-python@<full-sha>  # v6

       - name: Install kind
-        uses: helm/kind-action@v1
+        uses: helm/kind-action@<full-sha>  # v1

Look up the current commit SHAs for each action version and replace <full-sha> with the 40-character commit hash. Keep the version tag in a comment for readability.

As per coding guidelines: "Pin actions by full SHA, not tag" for CI/CD security.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/tests.yml around lines 19 - 57, Replace mutable tag pins
for GitHub Actions with immutable full commit SHAs: find every uses: entry
referencing actions/checkout@v6, astral-sh/setup-uv@v7, actions/setup-python@v6,
and helm/kind-action@v1 (appearing in both jobs) and replace the tag with the
corresponding 40-character commit SHA (you may keep the original tag as a
comment for readability); ensure you look up and paste the exact commit SHA for
each action and apply the same change to any other action usages added later to
eliminate mutable tag usage.
tests/integration/setup_test_env.sh (1)

77-80: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Pin external manifest sources to immutable refs.

Severity: major (supply-chain/reliability). Impact: fetching CRDs from main can silently change behavior and destabilize test security posture. Use tagged release URLs or commit SHAs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/integration/setup_test_env.sh` around lines 77 - 80, The test script
currently applies CRDs from mutable "main" branches using the two kubectl apply
commands that fetch URLs for stolostron/managedcluster-import-controller and
kubevirt/hyperconverged-cluster-operator; change those URLs to point to
immutable refs (a specific release tag or commit SHA) or introduce variables
(e.g., MANAGED_CLUSTER_CRD_REF and HCO_CRD_REF) that default to a known release
tag/sha and are referenced in the kubectl apply commands, and update the echo
messages accordingly so the CRDs are fetched from pinned URLs instead of the
main branch.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@collections/ansible_collections/osac/config_as_code/roles/aap/templates/storage-operations-ig.j2`:
- Around line 6-31: Add explicit pod/container hardening for the "worker"
container in the storage-operations-ig.j2 template: set a
podSecurityContext/runAsNonRoot (e.g., runAsNonRoot: true and optional runAsUser
non-zero) and add a container-level securityContext for the "worker" container
that sets readOnlyRootFilesystem: true, allowPrivilegeEscalation: false and
drops all capabilities (capabilities.drop: ["ALL"]). Ensure these controls are
added adjacent to the "containers - name: worker" block so the pod and
container-level security contexts are enforced.

In
`@collections/ansible_collections/osac/service/roles/storage_provider/tasks/_dispatch_provider.yaml`:
- Around line 30-33: The dynamic include_role call that builds
"osac.templates.{{ _current_provider }}_storage" must be guarded by an explicit
allow-list check: validate _current_provider against a predefined list (e.g.,
storage_providers_allowed or providers_map) before calling
ansible.builtin.include_role; if the value is not in the allow-list, fail or
default to a safe provider. Update the task that uses include_role (the block
referencing _current_provider and _dispatch_action) to perform the allow-list
membership test (using a when or prereq task that sets/validates a
safe_provider) and only include the role when the provider is allowed. Ensure
the allow-list variable name is clear and documented and that failure paths
produce a descriptive error rather than proceeding with an unchecked provider.

In
`@collections/ansible_collections/osac/service/roles/storage_provider/tasks/main.yaml`:
- Around line 81-83: The when expression currently assumes
storage_provider_provisioning_target and storage_provider_action exist and can
raise an error if unset; update the conditional checks in the tasks that use
these variables (the when clauses around storage_provider_provisioning_target
not in [...] and the later checks for storage_provider_action) to first ensure
the variable is defined (e.g. "storage_provider_provisioning_target is defined
and storage_provider_provisioning_target not in [...]" and
"storage_provider_action is defined and storage_provider_action in [...]" or use
a safe default like "| default('')" ), so the fail task can run predictably and
validation logic won’t error when inputs are missing.
- Around line 14-16: The current when condition only checks defined/non-empty
for storage_provider_tiers and can allow non-list types; update the when clause
that guards the task using the storage_provider_tiers variable to also assert it
is a sequence/list and has length > 0 (e.g., require storage_provider_tiers is
defined and storage_provider_tiers is sequence and storage_provider_tiers |
length > 0) so downstream loops receive a proper list; if you prefer stricter
failure handling, add an assert task that checks storage_provider_tiers is
sequence before any tasks that iterate over it.

In
`@collections/ansible_collections/osac/service/roles/storage_provider/tasks/teardown.yaml`:
- Line 13: The task currently using "ignore_errors: true" hides individual
provider teardown failures; instead, remove that global ignore and register each
provider's teardown result (e.g., register: teardown_result in the per-provider
task or loop over providers), collect failures by inspecting
teardown_result.results | selectattr('failed') into a list, and at the end add a
final task that fails with the fail module if any failures exist, including
context (provider name and error message) so the playbook surfaces teardown
errors rather than masking them.

In `@collections/ansible_collections/osac/templates/README.md`:
- Around line 212-214: The README incorrectly states that a hardcoded provider
allowlist exists in osac.service.storage_provider/tasks/main.yaml; update the
documentation to reflect the actual dispatcher validation/dispatch model by
removing or correcting the claim about a hardcoded allowlist and describing how
the dispatcher currently validates providers (mentioning the dispatcher
component and any runtime/variable-driven checks it uses). Reference
osac.service.storage_provider/tasks/main.yaml and the dispatcher when editing
the text so provider authors see the accurate source of truth and behavior.
- Around line 187-192: Fix the markdownlint MD031/MD022 spacing issues in
README.md by ensuring proper blank lines around the touched fenced code blocks
and headings: add a single blank line between headings and the opening fenced
blocks (e.g., before the ```bash and ```yaml blocks shown) and ensure a blank
line after closing fenced blocks where required; apply the same spacing
correction to the other reported fenced blocks (the occurrences flagged at the
other touched spots) and remove any extra trailing blank lines so the file
conforms to MD031/MD022.

In
`@collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_qos_policy.yaml`:
- Around line 60-80: The task "Create QoS policies that do not yet exist" is
using validate_certs: "{{ _vast_vms_conn.validate_certs }}" which allows
disabling TLS verification and exposes bearer tokens (Authorization header) to
MITM; update the role to require validate_certs be true for the
ansible.builtin.uri call (or replace the templated value with a hard true) and
add a pre-check (e.g., a task that fails when _vast_vms_conn.validate_certs is
false) so the POST to /api/qospolicies/ never runs with validate_certs disabled;
ensure the change is applied to the task registering _vast_qos_create_results
and any related token-fetching requests that use _vast_vms_conn.validate_certs.
- Around line 45-58: The task "Check if QoS policy already exists per tier"
currently uses the external flag _vast_vms_conn.validate_certs which can disable
TLS certificate validation and expose the Authorization bearer token; change the
task to enforce secure TLS by replacing the variable with validate_certs: true
(or add a pre-task that fails if _vast_vms_conn.validate_certs is not true) so
the ansible.builtin.uri call always validates certificates when querying
/api/qospolicies/ (the task that registers _vast_qos_check_results and loops
over _vast_qos_tiers should be updated accordingly).
- Around line 32-43: The task currently passes validate_certs: "{{
_vast_vms_conn.validate_certs }}" to ansible.builtin.uri, allowing TLS
verification to be disabled via vast_storage_validate_certs/VAST_VALIDATE_CERTS;
change this to enforce TLS verification by either setting validate_certs: true
unconditionally in create_qos_policy.yaml or add an explicit pre-task that fails
(with a clear error) when vast_storage_validate_certs is false (and reference
the variable _vast_vms_conn.validate_certs and the ansible.builtin.uri call so
reviewers can find where to apply the change).

In
`@collections/ansible_collections/osac/templates/roles/vast_storage/tasks/delete_tenant_manager.yaml`:
- Around line 103-107: The current set_fact uses Jinja tests comparing variables
to the literal "failed", which misses real failure flags; change the expression
assigning _vast_manager_delete_failed to explicitly check the registered result
objects' .failed attributes and guard existence: e.g. set
_vast_manager_delete_failed to true if (_vast_manager_delete_result is defined
and _vast_manager_delete_result.failed) or (_vast_manager_lookup is defined and
_vast_manager_lookup.failed); ensure both _vast_manager_delete_result and
_vast_manager_lookup are checked with "is defined" before accessing .failed so
callers accurately see teardown failures.

In
`@collections/ansible_collections/osac/templates/roles/vast_storage/tasks/ensure_storage_class.yaml`:
- Around line 3-4: The top-of-file security comment is misleading: although
admin credentials are not placed into the CSI Secret, this file does load admin
credentials via the include of read_credentials.yaml (see the
include/read_credentials.yaml usage around the VMS API tasks), so update the
comment to accurately state that admin credentials are referenced/loaded here
but are never written into the CSI Secret (only tenant manager credentials are
stored in the CSI Secret). Change the sentence "Admin credentials are NEVER
loaded or referenced in this file." to a precise statement referencing the
include (read_credentials.yaml) and clarifying the actual guarantee (admin creds
are used for VMS API operations but never injected into the CSI Secret).

In
`@collections/ansible_collections/osac/templates/roles/vast_storage/tasks/read_tenant_credentials.yaml`:
- Around line 58-67: The current set_fact decodes several secret fields without
checking they exist on _vast_tenant_config_secret, which causes opaque errors
later; add an explicit pre-validation task (e.g., ansible.builtin.assert or
ansible.builtin.fail) that checks _vast_tenant_config_secret.resources[0].data
contains required keys like vast_tenant_id, tenant_manager_username,
tenant_manager_password, vip_pool_name, vast_endpoint (and optionally
view_policy_names/block_encryption_passphrase if required), and only then run
the ansible.builtin.set_fact that decodes into _vast_tenant_id,
_vast_tenant_csi_username, _vast_tenant_csi_password, _vast_tenant_vip_pool,
_vast_tenant_endpoint, _vast_view_policy_name,
_vast_tenant_block_encryption_passphrase, and _vast_view_policy_names_raw;
ensure the assert/fail produces a clear message naming the missing key(s).

In `@config/base/secret-storage-operations-ig-example.yaml`:
- Around line 3-5: The example Secret manifest omits metadata.namespace which
can create the Secret in the cluster default namespace; update the manifest for
the Secret named "storage-operations-ig" (type Opaque) to include an explicit
metadata.namespace (e.g., the intended ops namespace) so it is pinned to a known
namespace; ensure any consumers/RBAC or deployment manifests reference that same
namespace after you add metadata.namespace.

In `@playbook_osac_configure_tenant_storage.yml`:
- Around line 13-15: The playbook currently logs the entire EDA event payload
(ansible_eda.event.payload), which may expose secrets; change the debug to avoid
printing the full payload and instead output only non-sensitive identifiers such
as tenant name and namespace (e.g., ansible_eda.event.payload.tenant_name and
ansible_eda.event.payload.namespace or equivalent fields), or redact sensitive
keys before logging; update the task referenced by the debug call (the "Show EDA
Event" task) to only emit those safe identifiers and remove any full-payload
debug statements.

In `@playbook_osac_create_compute_instance.yml`:
- Around line 59-65: The fail task "Fail on malformed STORAGE_TIERS JSON"
currently echoes the raw value _storage_tiers_raw which may leak secrets; update
this task to redact or truncate the value before logging (e.g., show only a safe
prefix and suffix or replace with "[REDACTED]" when length/exposure thresholds
are met) so the ansible.builtin.fail msg still indicates malformed JSON but
never prints the full _storage_tiers_raw; ensure the logic used to produce the
redacted string is applied where _storage_tiers_raw is referenced for error
output.

In `@playbook_osac_delete_tenant_storage.yml`:
- Around line 12-14: Remove or redact the debug task "Show EDA Event" that
prints ansible_eda.event.payload in playbook_osac_delete_tenant_storage.yml;
either delete the ansible.builtin.debug task entirely or replace it with a
targeted debug that logs only non-sensitive, whitelisted fields (e.g., event id
or status) and explicitly omit tenant/customer fields, ensuring no full payload
or PII is emitted.

In `@tests/integration/mock_vms_server.py`:
- Around line 323-324: The log_message method currently uses a parameter named
format which shadows the Python builtin; rename the parameter in the
BaseHTTPRequestHandler override from format to fmt (i.e., def log_message(self,
fmt, *args)) and update any references inside log_message (if any) to use fmt so
linters won't complain while preserving the original behavior of the log_message
override.

In `@tests/integration/setup_test_env.sh`:
- Around line 168-177: The script currently materializes plaintext credentials
into .storage_env (variables like VAST_PASSWORD, VAST_USERNAME and
STORAGE_TIERS); change it to read secrets from the environment at runtime
instead of hardcoding them into the heredoc, and ensure the created file is
protected (set umask 077 before writing or explicitly chmod 600 after creation).
Specifically, replace hardcoded string literals for VAST_* and STORAGE_TIERS
with references that pull from existing env vars (e.g., ${VAST_PASSWORD}) so
tests rely on externally supplied secrets, and add a file-permissions step
around the write of .storage_env to prevent world-readable artifacts.

In `@tests/integration/targets/storage_provider_setup_rollback/tasks/main.yml`:
- Around line 41-45: The playbook currently hardcodes credentials in the
environment block (VAST_USERNAME, VAST_PASSWORD, VAST_ENDPOINT,
VAST_VIP_POOL_NAME); replace these string literals with environment-driven or
injected variables so secrets aren’t committed: read VAST_USERNAME and
VAST_PASSWORD from the runtime environment or test harness variables (with safe
empty/defaults or vault lookup) and make VAST_ENDPOINT and VAST_VIP_POOL_NAME
configurable via vars or CI-provided envs instead of fixed strings so tests use
injected values rather than "admin"/"admin".

In `@tests/integration/targets/storage_provider_setup/tasks/main.yml`:
- Around line 12-14: The playbook currently hardcodes credentials (VAST_USERNAME
and VAST_PASSWORD) and the endpoint (VAST_ENDPOINT); replace these literals by
reading them from environment/CI variables or test fixtures and fail fast if
missing — update the task that sets VAST_ENDPOINT, VAST_USERNAME, and
VAST_PASSWORD to use lookup of env vars (or variables injected from fixtures)
and add a pre-check that aborts the run with a clear error when any of those
variables is undefined or empty.

In `@tests/integration/targets/storage_provider_teardown/tasks/main.yml`:
- Around line 92-93: Replace the hardcoded secrets (tenant_manager_password,
tenant_manager_id, CSI token, and any admin env credentials) with
runtime-injected variables from the test harness or environment (e.g., Ansible
lookups or test fixture variables) so credentials are not committed; update
occurrences of tenant_manager_password, tenant_manager_id and the CSI
token/admin env vars in this task (and the other occurrences called out) to
reference injected vars (environment/test-harness variables or vaulted vars) and
ensure defaults are not hardcoded in the YAML.

---

Outside diff comments:
In @.github/workflows/tests.yml:
- Around line 19-57: Replace mutable tag pins for GitHub Actions with immutable
full commit SHAs: find every uses: entry referencing actions/checkout@v6,
astral-sh/setup-uv@v7, actions/setup-python@v6, and helm/kind-action@v1
(appearing in both jobs) and replace the tag with the corresponding 40-character
commit SHA (you may keep the original tag as a comment for readability); ensure
you look up and paste the exact commit SHA for each action and apply the same
change to any other action usages added later to eliminate mutable tag usage.

In `@tests/integration/setup_test_env.sh`:
- Around line 77-80: The test script currently applies CRDs from mutable "main"
branches using the two kubectl apply commands that fetch URLs for
stolostron/managedcluster-import-controller and
kubevirt/hyperconverged-cluster-operator; change those URLs to point to
immutable refs (a specific release tag or commit SHA) or introduce variables
(e.g., MANAGED_CLUSTER_CRD_REF and HCO_CRD_REF) that default to a known release
tag/sha and are referenced in the kubectl apply commands, and update the echo
messages accordingly so the CRDs are fetched from pinned URLs instead of the
main branch.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

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

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 7fde91bd-f28b-4388-adb7-bd01632fb54e

📥 Commits

Reviewing files that changed from the base of the PR and between 0255559 and acfdba3.

⛔ Files ignored due to path filters (113)
  • vendor/ansible_collections/vastdata.vms-1.2.0.info/GALAXY.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/CHANGELOG.md is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/FILES.json is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/MANIFEST.json is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/README.md is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/docs/.gitkeep is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/meta/runtime.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/__init__.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/_build_info.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/auth.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/client.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/diff.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/errors.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/module_customizations.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/protectionpolicies_utils.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/resource.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/s3_attachment_utils.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/schema_overrides.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/sub_endpoint_resource.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/timeouts.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/module_utils/vast/version.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/dns.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/eventdefinitionconfigs.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/globalsnapstreams.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/groups.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/ldaps.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/nativereplicationremotetargets.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/nonlocal_group.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/nonlocal_user.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/protectedpaths.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/protectionpolicies.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/quotas.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/s3policies.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/snapshots.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/tenants.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/user_key.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/users.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/viewpolicies.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/views.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/plugins/modules/vippools.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/.gitignore is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/__init__.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/requirements.txt is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/.gitkeep is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/cnodes/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/cnodes/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/dns/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/dns/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/eventdefinitionconfigs/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/eventdefinitionconfigs/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/globalsnapstreams/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/globalsnapstreams/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/groups/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/groups/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/ldaps/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/ldaps/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/nativereplicationremotetargets/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/nativereplicationremotetargets/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/nonlocal_group/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/nonlocal_group/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/nonlocal_user/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/nonlocal_user/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/protectedpaths/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/protectedpaths/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/protectionpolicies/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/protectionpolicies/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/quotas/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/quotas/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/s3_policy_attachment_group/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/s3_policy_attachment_group/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/s3_policy_attachment_user/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/s3_policy_attachment_user/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/s3policies/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/s3policies/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/snapshots/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/snapshots/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/tenants/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/tenants/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/user_key/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/user_key/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/users/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/users/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/viewpolicies/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/viewpolicies/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/views/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/views/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/vippools/defaults/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/integration/targets/vippools/tasks/main.yml is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/.gitkeep is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/__init__.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/__init__.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/module_utils/__init__.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/module_utils/test_delete_params.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/__init__.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_dns.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_eventdefinitionconfigs.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_globalsnapstreams.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_groups.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_ldaps.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_nativereplicationremotetargets.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_nonlocal_group.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_nonlocal_user.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_protectedpaths.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_protectionpolicies.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_quotas.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_s3policies.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_snapshots.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_tenants.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_user_key.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_users.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_viewpolicies.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_views.py is excluded by !vendor/**
  • vendor/ansible_collections/vastdata/vms/tests/unit/plugins/modules/test_vippools.py is excluded by !vendor/**
📒 Files selected for processing (53)
  • .github/workflows/tests.yml
  • .gitignore
  • collections/ansible_collections/osac/config_as_code/roles/aap/templates/compute-instance-operations-ig.j2
  • collections/ansible_collections/osac/config_as_code/roles/aap/templates/storage-operations-ig.j2
  • collections/ansible_collections/osac/config_as_code/roles/aap/vars/controller.yml
  • collections/ansible_collections/osac/service/plugins/filter/find_template_roles.py
  • collections/ansible_collections/osac/service/roles/storage_provider/meta/argument_specs.yaml
  • collections/ansible_collections/osac/service/roles/storage_provider/tasks/_dispatch_provider.yaml
  • collections/ansible_collections/osac/service/roles/storage_provider/tasks/ensure_storage_class.yaml
  • collections/ansible_collections/osac/service/roles/storage_provider/tasks/main.yaml
  • collections/ansible_collections/osac/service/roles/storage_provider/tasks/setup.yaml
  • collections/ansible_collections/osac/service/roles/storage_provider/tasks/teardown.yaml
  • collections/ansible_collections/osac/service/roles/storage_provider/tests/test.yml
  • collections/ansible_collections/osac/templates/README.md
  • collections/ansible_collections/osac/templates/roles/ocp_virt_vm/tasks/create_resources.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/defaults/main.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/meta/osac.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_qos_policy.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_quotas.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_tenant_manager.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_view_policy.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/create_views.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/delete_tenant_manager.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/delete_vms_resources_by_tenant.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/ensure_csi_operator.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/ensure_storage_class.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/read_credentials.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/read_tenant_credentials.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/setup.yaml
  • collections/ansible_collections/osac/templates/roles/vast_storage/tasks/teardown.yaml
  • collections/ansible_collections/osac/workflows/playbooks/compute_instance/create.yml
  • collections/requirements.yml
  • config/base/configmap-storage-operations-ig-example.yaml
  • config/base/secret-storage-operations-ig-example.yaml
  • playbook_osac_configure_tenant_storage.yml
  • playbook_osac_create_compute_instance.yml
  • playbook_osac_delete_tenant_storage.yml
  • tests/integration/fixtures/storage/secret-vast-tenant-config-test.yaml
  • tests/integration/fixtures/storage/storageclass-vast-test.yaml
  • tests/integration/fixtures/storage/tenant-storage-test.yaml
  • tests/integration/integration_config.yml.template
  • tests/integration/mock_vms_server.py
  • tests/integration/run_tests.sh
  • tests/integration/setup_test_env.sh
  • tests/integration/targets/compute_instance_create/tasks/baseline.yml
  • tests/integration/targets/compute_instance_create/tasks/overrides.yml
  • tests/integration/targets/compute_instance_with_gpu_create/tasks/baseline.yml
  • tests/integration/targets/storage_provider_ensure_sc/tasks/main.yml
  • tests/integration/targets/storage_provider_onboarding/tasks/main.yml
  • tests/integration/targets/storage_provider_setup/tasks/main.yml
  • tests/integration/targets/storage_provider_setup_rollback/tasks/main.yml
  • tests/integration/targets/storage_provider_teardown/tasks/main.yml
  • tests/integration/teardown_test_env.sh

Comment thread tests/integration/mock_vms_server.py
Comment thread tests/integration/setup_test_env.sh
Comment thread tests/integration/targets/storage_provider_setup/tasks/main.yml
Comment thread tests/integration/targets/storage_provider_teardown/tasks/main.yml
The vendored vastdata.vms collection pins requires_ansible to
>=2.19.0,<2.20.0, but ansible-core 2.21.0 is now the latest stable
release. The collection only uses ansible.module_utils.basic.AnsibleModule,
which is stable across all 2.x versions, so the upper bound is overly
conservative. Widen to <3.0.0 to unblock the EE build.

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
The comment claimed admin credentials are never loaded in this file,
but the file includes read_credentials.yaml which loads them from env
vars for VMS API calls. The actual guarantee is that admin credentials
are never written into the CSI Secret or tenant-namespace resources.

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
@akshaynadkarni
akshaynadkarni dismissed coderabbitai[bot]’s stale review May 27, 2026 03:38

All findings addressed or refuted with rationale. Follow-ups tracked in OSAC-1042, OSAC-1043, OSAC-1044.

@akshaynadkarni

Copy link
Copy Markdown
Contributor

/override ci/prow/temp

@openshift-ci

openshift-ci Bot commented May 27, 2026

Copy link
Copy Markdown

@akshaynadkarni: Overrode contexts on behalf of akshaynadkarni: ci/prow/temp

Details

In response to this:

/override ci/prow/temp

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 kubernetes-sigs/prow repository.

@akshaynadkarni akshaynadkarni left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Changes LGTM overall. However, this is a big PR. In case something breaks, we will have to do a fast follow-up. cc: @zszabo-rh .

I don't want to keep this PR open too long as then there's more work:

  • merge conflicts
  • coderabbit comments
    etc.

Approving the PR.

@openshift-ci

openshift-ci Bot commented May 27, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: akshaynadkarni, wgordon17

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants