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

Add create and teardown cluster playbooks - #2

Merged
adriengentil merged 11 commits into
osac-project:mainfrom
adriengentil:create-teardown-hosted-cluster
Apr 3, 2025
Merged

adriengentil merged 11 commits into
osac-project:mainfrom
adriengentil:create-teardown-hosted-cluster

Conversation

@adriengentil

@adriengentil adriengentil commented Apr 1, 2025

Copy link
Copy Markdown
Contributor

This PR creates 2 playbooks to create and delete hosted cluster. To perform this action,I created 3 roles:

  • cluster_working_namespace: find and return the namespace name in which all the resources will be created
  • cluster_settings: contains the logic to compute the settings which will be used to create the hosted cluster, it basically merges settings set at template level the ones provided by the user
  • hosted_cluster: creates the resources in the namespace returned by cluster_working_namespace and use the settings returned cluster_settings to customize the deployment

Summary by CodeRabbit

  • Documentation

    • Added a new "Pre-requisites" section with clear setup instructions and dependency installation steps.
  • New Features

    • Enhanced automation workflows for creating and tearing down hosted control plane clusters using an updated, order-driven approach.
    • Improved hosted cluster management with dynamic configuration of secrets, settings, node pools, and refined namespace detection.
    • Introduced a new YAML configuration file for defining cluster orders and default settings.
    • Added support for managing Kubernetes resources related to hosted clusters.
  • Chores

    • Updated project configuration to enforce Python 3.13 and manage dependency requirements.
    • Refined tool settings and internal defaults for improved consistency.

@adriengentil
adriengentil force-pushed the create-teardown-hosted-cluster branch from 91cea3d to 0d31709 Compare April 1, 2025 16:41
@adriengentil adriengentil changed the title create teardown hosted cluster Add create and teardown cluster playbooks Apr 1, 2025
@adriengentil
adriengentil force-pushed the create-teardown-hosted-cluster branch from 0d31709 to ce49052 Compare April 1, 2025 16:44
Comment thread roles/hosted_cluster/tasks/main.yml Outdated
Comment on lines +108 to +127
- name: Create ManagedCluster resource
kubernetes.core.k8s:
state: "{{ hosted_cluster_state }}"
definition:
apiVersion: cluster.open-cluster-management.io/v1
kind: ManagedCluster
metadata:
name: "{{ hosted_cluster_name }}"
namespace: "{{ hosted_cluster_namespace }}"
annotations:
import.open-cluster-management.io/hosting-cluster-name: "{{ hosted_cluster_name }}"
import.open-cluster-management.io/klusterlet-deploy-mode: Hosted
open-cluster-management/created-via: hypershift
labels:
name: "{{ hosted_cluster_name }}"
cloud: BareMetal
vendor: OpenShift
cluster.open-cluster-management.io/clusterset: default
spec:
hubAcceptsClient: true

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Do we to create this in the playbook? In the past when I've deployed a hostedcluster, I haven't needed to create the ManagedCluster resource explicitly.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Not sure, I basically copy-pasted what the OCM UI does when creating a hosted cluster. I'm happy to remove it if it's not needed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Comment thread roles/hosted_cluster/tasks/main.yml Outdated
platform:
type: Agent
agent:
agentNamespace: ''

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Doesn't this need to be set to the namespace that contains the target infraenv?

Comment thread roles/hosted_cluster/tasks/main.yml Outdated
agent:
agentLabelSelector:
matchLabels:
infraenvs.agent-install.openshift.io: "{{ hosted_cluster_template.infraenv }}"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Flagging this for discussion, because I think it's odd that we have ended up with infraenv as a template parameter. I think -- at least for POC1, and possibly going forward -- that we will also want to match agents on cluster name, and some other component will be responsible for assigning agents to a cluster (e.g., we would do that by hand for POC1).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I agree that something more functional would be great.

About the var file used as a template, I was thinking about the parameters section to be merged with the parameters provided by the user in the cluster order, so everything outside this section would be hard-coded by the template.

@adriengentil
adriengentil force-pushed the create-teardown-hosted-cluster branch from 45e3d96 to 655f265 Compare April 2, 2025 12:01
@adriengentil
adriengentil force-pushed the create-teardown-hosted-cluster branch 5 times, most recently from fe10e1b to 439eb76 Compare April 2, 2025 13:27
@adriengentil
adriengentil force-pushed the create-teardown-hosted-cluster branch from 439eb76 to 5cf5aea Compare April 2, 2025 13:33
rules:
- name: Create hosted cluster
condition: event.payload.message == "create_hosted_cluster"
condition: event.meta.endpoint == "create-hosted-cluster"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@larsks I updated the rulebook to route the event based on the URL path:

  • <eda url>/create-hosted-cluster will trigger the cluster creation
  • <eda url>/delete-hosted-cluster will trigger the cluster deletion

split the hosted_cluster roles in order to insolate the logic that
determines in which namespace we should create the cluster object should
be created, and the logic that computes the cluster settings based on a
default template and user-provided parameters.
@adriengentil
adriengentil force-pushed the create-teardown-hosted-cluster branch 2 times, most recently from 482ea21 to b70f54a Compare April 3, 2025 12:07
@adriengentil
adriengentil marked this pull request as ready for review April 3, 2025 12:07
@adriengentil
adriengentil enabled auto-merge (squash) April 3, 2025 12:08
@coderabbitai

coderabbitai Bot commented Apr 3, 2025

Copy link
Copy Markdown

Walkthrough

The pull request introduces several updates across configuration files, playbooks, and role definitions. Changes include additions to the .gitignore with entries for .ansible and .vscode, and the creation of a new .python-version file specifying Python 3.13. The README.md now includes a "Pre-requisites" section with setup instructions for using the uv tool and installing Ansible collections. The Ansible configuration is updated with a new jinja2_native=True setting, and the dependencies in collections/requirements.yml now include the kubernetes.core collection version 5.2.0. Two playbooks for creating and tearing down hosted control plane clusters have been restructured to use a ClusterOrder payload with associated roles such as cluster_working_namespace, cluster_settings, and hosted_cluster. A new pyproject.toml file details the project settings and dependencies. Additionally, several new YAML files provide default variables, tasks for managing Kubernetes resources, and sample extra variables for cluster configurations. Rulebook conditions were modified to use event.meta.endpoint for triggering actions.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b70f54a and 56ca53f.

📒 Files selected for processing (6)
  • playbook_cloudkit_create_hosted_cluster.yml (1 hunks)
  • playbook_cloudkit_delete_hosted_cluster.yml (1 hunks)
  • roles/cluster_settings/tasks/main.yml (1 hunks)
  • roles/hosted_cluster/defaults/main.yml (1 hunks)
  • roles/hosted_cluster/tasks/main.yml (1 hunks)
  • samples/hosted_cluster_extra_vars.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • samples/hosted_cluster_extra_vars.yml
  • roles/cluster_settings/tasks/main.yml
  • roles/hosted_cluster/defaults/main.yml
  • playbook_cloudkit_create_hosted_cluster.yml
  • roles/hosted_cluster/tasks/main.yml
🔇 Additional comments (5)
playbook_cloudkit_delete_hosted_cluster.yml (5)

2-2: Updated Playbook Name Reflects New Functionality
The playbook name now clearly indicates that it is used to teardown a hosted control plane cluster using a ClusterOrder. Ensure that related documentation and naming conventions across projects are consistent.


6-8: Correct Initialization of the ClusterOrder Variable
The variable cluster_order is correctly initialized from ansible_eda.event.payload, which will provide the needed context to all subsequent roles.


10-14: Proper Variable Mapping in the cluster_working_namespace Role
The role now maps cluster_order.metadata.name to cluster_working_namespace_cluster_order_name and cluster_order.metadata.namespace to cluster_working_namespace_cluster_order_namespace. This correction addresses the previous mapping concern where the assignments were reversed.


15-19: Accurate Variable Assignment in the cluster_settings Role
The variables cluster_settings_template_id and cluster_settings_template_parameters correctly extract values from cluster_order.spec.templateID and cluster_order.spec.templateParameters. This ensures the role has the necessary configuration to compute the hosted cluster settings.


20-25: Verification of Role Output Dependencies in the hosted_cluster Role
The hosted_cluster role leverages outputs from previous roles by referencing cluster_working_namespace_result and cluster_settings_result, and explicitly sets hosted_cluster_state to absent. Please verify that the cluster_working_namespace and cluster_settings roles properly register these output variables so that they are reliably accessible during playbook execution. Consider incorporating default values or additional error handling if there is any risk of these outputs being undefined.


🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai plan to trigger planning for file edits and PR creation.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@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: 3

🧹 Nitpick comments (9)
README.md (2)

10-13: Specify Language for Fenced Code Block

The fenced code block that shows the commands ($ uv sync and $ source .venv/bin/activate) does not specify a language. Adding a language identifier (e.g., bash) would help satisfy markdownlint MD040 and improve readability.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

10-10: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


11-11: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


12-12: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


17-19: Include Language Identifier for Command Block

Similarly, the fenced code block starting at line 17 (with the ansible-galaxy command) would benefit from a language specifier (e.g., bash) to comply with markdownlint guidelines (MD040, MD014) and to better indicate that these are shell commands rather than plain text.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

17-17: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


18-18: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)

roles/cluster_settings/defaults/main.yml (1)

1-4: Define Cluster Settings Defaults

The YAML file clearly defines the default credentials secret name and namespace. For enhanced maintainability, consider adding brief inline comments to explain the purpose of each variable.

roles/hosted_cluster/defaults/main.yml (1)

1-6: Configure Hosted Cluster Defaults

The default settings for the hosted cluster role are defined effectively. The use of a Jinja template variable ({{ hosted_cluster_name }}) in the label selector is appropriate. Optionally, inline comments describing what these defaults represent could further improve clarity.

roles/cluster_settings/vars/ocp.4-17.small.yml (1)

1-8: Set Up OCP 4.17 Small Cluster Settings

This configuration file sets the cluster settings for an OpenShift Container Platform (OCP) 4.17 small cluster variant clearly. Adding inline comments to briefly describe the purpose of sections like cluster_settings_result and cluster_settings_template_defaults may be beneficial for future maintainers.

pyproject.toml (1)

1-11: Project Configuration and Metadata

The pyproject.toml file correctly sets the project metadata, including dependencies and required Python version. The configuration is clear; however, consider expanding the description field to provide a more detailed summary of the project’s purpose, which would help new contributors.

roles/cluster_settings/tasks/main.yml (1)

16-25: Nitpick: Simplify Jinja expressions in combine filter.
Instead of nesting Jinja templating within the combine filter, consider directly referencing the variables. This improves readability.

Example diff:

-      {{ cluster_settings_template_defaults | combine({
-          'pull_secret': '{{ default_cluster_credentials.resources[0].data.pull_secret }}',
-          'ssh_key': '{{ default_cluster_credentials.resources[0].data.pull_secret_pub }}'
-          })
-      }}
+      {{ cluster_settings_template_defaults | combine({
+          'pull_secret': default_cluster_credentials.resources[0].data.pull_secret,
+          'ssh_key': default_cluster_credentials.resources[0].data.ssh_key_pub
+          })
+      }}
roles/cluster_working_namespace/tasks/main.yml (1)

2-8: Nitpick: Correct typo in task name.
Consider changing “CusterOrder” to “ClusterOrder” in the task title for clarity.

Example diff:

- - name: Retrieve working cluster namespace from CusterOrder name and namespace
+ - name: Retrieve working cluster namespace from ClusterOrder name and namespace
roles/hosted_cluster/tasks/main.yml (1)

2-8: Typo in Task Name
There is a minor typo in the task title at line 2: “Manage Secret resource containning pull-secret” should be corrected to “Manage Secret resource containing pull-secret” for clarity.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9f8bacd and b70f54a.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (17)
  • .gitignore (1 hunks)
  • .python-version (1 hunks)
  • README.md (1 hunks)
  • ansible.cfg (1 hunks)
  • collections/requirements.yml (1 hunks)
  • playbook_cloudkit_create_hosted_cluster.yml (1 hunks)
  • playbook_cloudkit_delete_hosted_cluster.yml (1 hunks)
  • pyproject.toml (1 hunks)
  • roles/cluster_settings/defaults/main.yml (1 hunks)
  • roles/cluster_settings/tasks/main.yml (1 hunks)
  • roles/cluster_settings/vars/ocp.4-17.small.yml (1 hunks)
  • roles/cluster_working_namespace/defaults/main.yml (1 hunks)
  • roles/cluster_working_namespace/tasks/main.yml (1 hunks)
  • roles/hosted_cluster/defaults/main.yml (1 hunks)
  • roles/hosted_cluster/tasks/main.yml (1 hunks)
  • rulebooks/cluster_fulfillment.yml (1 hunks)
  • samples/hosted_cluster_extra_vars.yml (1 hunks)
🧰 Additional context used
🪛 markdownlint-cli2 (0.17.2)
README.md

10-10: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


11-11: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


12-12: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)


17-17: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


18-18: Dollar signs used before commands without showing output
null

(MD014, commands-show-output)

🔇 Additional comments (27)
.gitignore (1)

173-174: Good additions to .gitignore

Adding .ansible and .vscode to the gitignore is appropriate as these directories contain local environment configurations that shouldn't be committed to the repository. This helps keep the repository clean of personal development environment files.

ansible.cfg (1)

5-7: Appropriate Jinja2 configuration for working with Kubernetes manifests

The addition of jinja2_native=True is a good practice when generating Kubernetes manifests, as it ensures numeric values are rendered without quotes. This is particularly useful when working with the newly added kubernetes.core collection which may require specific data types in manifests.

collections/requirements.yml (1)

2-4: Good addition of kubernetes.core collection

Adding the kubernetes.core collection as a dependency aligns well with the PR objectives of creating playbooks for hosted cluster management. Version 5.2.0 is a specific version which helps ensure consistency across environments.

README.md (1)

6-8: Introduce "Pre-requisites" Section Clearly

The new "Pre-requisites" section is well organized and clearly outlines the steps to set up the project environment using the uv tool. This addition helps users understand the installation process.

roles/cluster_working_namespace/defaults/main.yml (1)

1-3: LGTM: YAML defaults are correctly defined.
The variables for the cluster order labels are clear and align with the intended use in the playbooks and roles.

samples/hosted_cluster_extra_vars.yml (2)

1-10: LGTM: Cluster order configuration is well structured.
The cluster_order block properly defines metadata and specifications, making it clear how the payload should be structured.


11-13: LGTM: Default settings for credentials and environments.
The additional default variables for secret namespaces and infrastructure settings are defined properly and should integrate well with dependent roles.

rulebooks/cluster_fulfillment.yml (2)

10-10: LGTM: Condition for creating hosted cluster is correct.
Using event.meta.endpoint == "create-hosted-cluster" complies with the new event structure and improves clarity.


17-17: LGTM: Condition for deleting hosted cluster is correct.
The update to check event.meta.endpoint == "delete-hosted-cluster" ensures consistency in event handling across rules.

roles/cluster_settings/tasks/main.yml (4)

2-5: LGTM: Retrieval of default parameters is implemented correctly.
The task uses ansible.builtin.include_vars to load the configuration based on the dynamic template ID. Ensure that the referenced file exists during runtime.


6-15: LGTM: Fetching default credentials is handled securely.
Using kubernetes.core.k8s_info with proper conditions and no_log: true ensures secure retrieval of sensitive data.


27-31: LGTM: Merging default and user-provided parameters.
The use of the combine filter to merge template parameters is clear and correctly implemented.


33-37: LGTM: Merging with read-only settings is implemented well.
This final merge ensures that the computed settings appropriately integrate both user inputs and system defaults.

roles/cluster_working_namespace/tasks/main.yml (2)

10-14: LGTM: Proper failure handling when namespace is not uniquely found.
The conditional check using | length != 1 is effective in ensuring a unique match, triggering an appropriate error message if not.


15-18: LGTM: Setting the working namespace result is clear and correct.
The fact is set from the first resource returned, correctly capturing the namespace name for subsequent tasks.

playbook_cloudkit_create_hosted_cluster.yml (4)

2-3: Clarify Playbook Naming and Purpose
The updated name “Create a hosted control plane cluster from a ClusterOrder” clearly indicates the playbook’s intent.


6-7: Good Initialization of cluster_order Variable
Initializing cluster_order with the payload from ansible_eda.event is clear and follows the intended design.


15-19: Configuration of Role cluster_settings is Clear
The template ID and template parameters are sourced directly from the cluster_order, which is consistent with the design objectives.


20-25: Good Usage of Dynamic Variables in the hosted_cluster Role
The hosted cluster role correctly receives its name from cluster_order.metadata.name and dynamically sets the namespace and settings via cluster_working_namespace_result and cluster_settings_result. Assigning hosted_cluster_state as present clearly indicates this is the create playbook.

roles/hosted_cluster/tasks/main.yml (4)

2-15: Pull Secret Definition is Well-Configured
The secret resource for the pull secret is properly defined with the appropriate API version, kind, metadata, and data format. The use of no_log: true helps to prevent sensitive data exposure.


17-28: SSH Key Secret Task Looks Good
This task correctly defines the SSH key Secret with dynamic metadata and data from hosted_cluster_settings. Since this secret is for an SSH public key, omitting no_log is acceptable.


29-78: HostedCluster Resource Task is Comprehensive
The manifest for the HostedCluster resource is detailed and leverages dynamic variables effectively for image, networking, platform, and service configurations. Ensure that the hard-coded network CIDRs and availability policies align with the operational requirements.


79-100: NodePool Resource Definition is Clear
The NodePool resource configuration correctly ties in the hosted cluster name, replica count (with an explicit conversion to int), and upgrade management. The use of dynamic variables provides flexibility in deployment.

playbook_cloudkit_delete_hosted_cluster.yml (4)

2-3: Clear Playbook Renaming for Teardown
Changing the playbook name to “Teardown a hosted control plane cluster from a ClusterOrder” accurately reflects its purpose.


6-8: Consistent Variable Initialization
Initializing cluster_order here mirrors the create playbook and ensures consistency across the playbook designs.


15-19: cluster_settings Role Configuration is Consistent
The task passes the template ID and parameters as expected from the cluster order, maintaining consistency with the create playbook.


20-25: Proper Configuration for Cluster Teardown
Within the hosted_cluster role, the resources are set for deletion by configuring hosted_cluster_state as absent. Dynamic variables for name, namespace (from cluster_working_namespace_result), and settings (from cluster_settings_result) ensure that the proper resources are targeted during teardown.

Comment thread .python-version
Comment thread playbook_cloudkit_create_hosted_cluster.yml
Comment thread playbook_cloudkit_delete_hosted_cluster.yml
@adriengentil
adriengentil force-pushed the create-teardown-hosted-cluster branch from b70f54a to 56ca53f Compare April 3, 2025 12:36
@adriengentil
adriengentil merged commit d38cfa0 into osac-project:main Apr 3, 2025
jkary pushed a commit to jkary/cloudkit-aap that referenced this pull request Sep 4, 2025
wgordon17 added a commit to wgordon17/osac-aap that referenced this pull request May 12, 2026
…rd compat, and storage provision tests

- Replaces VAST_STORAGE_TIERS single env var approach with safe raw-string
  parsing: _vast_storage_tiers_raw in defaults, from_json in configure_backend
  with explicit empty-check assert for actionable error messages (finding osac-project#2)
- Adds 5 tier validation tasks: non-empty list, SDR-016 type/mapping check,
  SDR-009 protocol enum, DNS label names, uniqueness, SDR-010 max_tiers guard
- Moves credential resolution before CSI install (fail-fast, SDR-001 outer
  block/always clears 9 credential facts in all exit paths, SDR-017)
- Rewrites ensure_csi_operator.yaml for multi-protocol: per-protocol CSIDriver
  check, _vast_protocols_needing_install derivation, single OLM Subscription
  (SDR-002 preserved), per-protocol VastCSIDriver CRs, per-protocol wait
- Replaces single View/Quota tasks with per-tier loops (no_log, SDR-008);
  removes non-functional QoS view policy tasks
- Adds Jinja2 comprehension _vast_sc_tiers, replace_default additive override,
  per-tier VolumeSnapshotClass (vast-snapshot-{tenant}-{tier} naming)
- Updates tenant config Secret to store storage_tiers JSON (replaces
  storage_tier, storage_protocol, storage_path, view_policy_name fields)
- Adds two-format reader to cleanup_backend: reads storage_tiers JSON if
  present, falls back to storage_tier/storage_protocol for pre-hardening
  Secrets; loops View and VSC deletions over tiers (finding osac-project#3)
- Adds storage_provision integration test target: single-tier NFS,
  dual-tier NFS+block with quota, validation failures, replace_default (finding osac-project#1)
- Updates configmap sample to VAST_STORAGE_TIERS JSON format
- Updates secret-vast-tenant-config-test fixture to new Secret format

Generated-By: Claude Code (Anthropic)
Signed-off-by: Will Gordon <wgordon@redhat.com>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants