Skip to content

Avoid eager vault lookup for YAML secrets#2172

Open
ideaship wants to merge 3 commits intomainfrom
rl_graceful_non-vault_deployment
Open

Avoid eager vault lookup for YAML secrets#2172
ideaship wants to merge 3 commits intomainfrom
rl_graceful_non-vault_deployment

Conversation

@ideaship
Copy link
Copy Markdown

@ideaship ideaship commented Apr 8, 2026

Add load_yaml_file and reuse it in the CLI paths that read OpenStack, RabbitMQ, Octavia, and database secrets from YAML files.

Several commands called get_vault() before checking whether the file was actually vault-encrypted. In deployments that keep secrets as plain YAML, this produced repeated 'Unable to get ansible vault password' errors for a path that is never needed.

Read the file first and only initialize the vault when the content is encrypted. This removes noisy false-error output during checks and deployments while preserving decryption for encrypted secrets.

AI-assisted: Codex

@ideaship ideaship force-pushed the rl_graceful_non-vault_deployment branch 2 times, most recently from 61417df to d021d66 Compare April 13, 2026 12:42
@ideaship ideaship marked this pull request as ready for review April 13, 2026 12:43
Copy link
Copy Markdown

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey - I've left some high level feedback:

  • In load_yaml_file, the initial os.path.exists check duplicates existence checks already done in some callers and always logs an error; consider either removing the internal existence check or returning a more specific error to avoid double logging for the same missing file.
  • load_yaml_file currently catches a broad Exception and converts all failures into None; consider narrowing the exception handling (e.g., separate decryption vs. I/O errors) or propagating specific exceptions so callers can distinguish between missing files, decryption errors, and invalid YAML content.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In `load_yaml_file`, the initial `os.path.exists` check duplicates existence checks already done in some callers and always logs an error; consider either removing the internal existence check or returning a more specific error to avoid double logging for the same missing file.
- `load_yaml_file` currently catches a broad `Exception` and converts all failures into `None`; consider narrowing the exception handling (e.g., separate decryption vs. I/O errors) or propagating specific exceptions so callers can distinguish between missing files, decryption errors, and invalid YAML content.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Copy link
Copy Markdown
Member

@osfrickler osfrickler left a comment

Choose a reason for hiding this comment

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

lgtm in general

Add load_yaml_file and reuse it in the CLI paths that read
OpenStack, RabbitMQ, Octavia, and database secrets from YAML files.

Several commands called get_vault() before checking whether the file
was actually vault-encrypted. In deployments that keep secrets as
plain YAML, this produced repeated 'Unable to get ansible vault
password' errors for a path that is never needed.

Read the file first and only initialize the vault when the content is
encrypted. This removes noisy false-error output during checks and
deployments while preserving decryption for encrypted secrets.

AI-assisted: Codex
Signed-off-by: Roger Luethi <luethi@osism.tech>
Callers already log at their own preferred level (error or warning)
when load_yaml_file returns None. Having load_yaml_file also log at
error produced double logging for the same failure.

Downgrade the messages in load_yaml_file to debug so that callers
remain in control of the log level. This matters because not all
callers treat a failure the same way: get_cloud_password has a
fallback to secure.yml, so a missing secrets.yml is not an error
there.

An alternative would be to raise specific exceptions from
load_yaml_file instead of returning None so that callers can
distinguish file-not-found, decryption errors, and YAML parse
errors. That would require a larger refactoring of all call sites.

AI-assisted: Claude Code
Signed-off-by: Roger Luethi <luethi@osism.tech>
Replace the broad except Exception with specific catches for
yaml.YAMLError, AnsibleError (vault decryption), and OSError
(file I/O). Unexpected exceptions now propagate to the caller,
which is the Pythonic convention -- all callers already have their
own except Exception safety nets with context-appropriate messages.

AI-assisted: Claude Code
Signed-off-by: Roger Luethi <luethi@osism.tech>
@ideaship ideaship force-pushed the rl_graceful_non-vault_deployment branch from d021d66 to dbdb131 Compare April 14, 2026 12:41
@berendt berendt requested a review from osfrickler April 14, 2026 15:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants