Skip to content

Story #7: Credentials File Support (YAML Format)#5

Open
rvanderp3 wants to merge 5 commits into
mainfrom
story-7-credentials-file-yaml
Open

Story #7: Credentials File Support (YAML Format)#5
rvanderp3 wants to merge 5 commits into
mainfrom
story-7-credentials-file-yaml

Conversation

@rvanderp3
Copy link
Copy Markdown

Summary

Implements Story #7 from Epic #2 (vSphere Multi-Account Credentials): YAML credentials file support for per-component vSphere credentials.

Changes

This PR adds support for reading per-component vSphere credentials from a YAML credentials file at ~/.vsphere/credentials. The file uses YAML format with vCenter servers as top-level keys, each containing component-specific credential mappings.

Key Features

  • YAML file format with vCenter FQDN as top-level keys
  • File permissions validation (must be 0600, rejects 0644/0777)
  • Precedence: install-config.yaml > credentials file > legacy passthrough
  • Graceful fallback when file doesn't exist or is empty
  • Multi-vCenter support with vCenter-keyed credentials
  • Partial component credentials with mixed sources (install-config + file + legacy)

Implementation Files

  • pkg/asset/installconfig/vsphere/credentialsfile.go: Core YAML parser, permissions validator, and merge logic
  • pkg/asset/installconfig/vsphere/credentialsfile_test.go: 10 comprehensive test scenarios

YAML File Format Example

vcenter1.example.com:
  installer:
    username: admin@vsphere.local
    password: <password>
  machine-api:
    username: ocp-machine-api@vsphere.local
    password: <password>
  csi-driver:
    username: ocp-csi@vsphere.local
    password: <password>
  cloud-controller:
    username: ocp-ccm@vsphere.local
    password: <password>
  diagnostics:
    username: ocp-diagnostics@vsphere.local
    password: <password>

Acceptance Criteria

All 3 acceptance criteria verified:

AC1: YAML credentials file with correct permissions (0600)

  • Installer reads component credentials from YAML file at ~/.vsphere/credentials
  • Validates privileges for each component
  • Creates component-specific secrets
  • Installation proceeds using per-component credentials from file

AC2: File permissions validation

  • Files with permissions 0644 are rejected with error message
  • Files with permissions 0777 are rejected with error message
  • Only 0600 permissions are accepted

AC3: Precedence (install-config.yaml over credentials file)

  • install-config.yaml credentials take precedence over credentials file
  • Partial install-config.yaml can fall back to credentials file for missing components
  • Missing credentials file falls back gracefully to legacy passthrough mode

Test Coverage

All 10 test scenarios passing:

  1. TestCredentialsFileReading_SingleVCenter - Single vCenter YAML file (happy path)
  2. TestCredentialsFileReading_MultiVCenter - Multi-vCenter YAML file
  3. TestCredentialsFilePermissions_Reject0644 - Reject 0644 permissions
  4. TestCredentialsFilePermissions_Reject0777 - Reject 0777 permissions
  5. TestCredentialsPrecedence_InstallConfigOverFile - install-config precedence
  6. TestCredentialsPrecedence_PartialInstallConfigFallbackToFile - Partial precedence
  7. TestCredentialsFileFallback_MissingFile - Graceful fallback when file doesn't exist
  8. TestCredentialsFileParsing_MalformedYAML - Error handling for invalid YAML
  9. TestCredentialsFileParsing_EmptyFile - Fallback for empty file
  10. TestCredentialsFilePartialComponents - Partial component coverage
go test ./pkg/asset/installconfig/vsphere -run TestCredentials -v

Dependencies

Related

🤖 Generated with Claude Code

rvanderp3 and others added 5 commits April 14, 2026 10:07
This commit implements Story #3: Install Config Schema Extension for
vSphere Multi-Account Credentials. It extends the install-config.yaml
schema to support per-component credentials while maintaining backward
compatibility with legacy single-account mode.

Changes:
- Add ComponentCredentials struct with fields for installer, machineAPI,
  csiDriver, cloudController, and diagnostics components
- Add AccountCredentials struct supporting multi-vCenter topologies
- Add platform field for optional ComponentCredentials
- Create test stubs for schema validation (6 test scenarios)
- Create test stubs for install-config integration tests

Test Plan:
- Unit tests in pkg/types/vsphere/validation_test.go
- Default/fallback tests in pkg/types/vsphere/defaults_test.go
- Integration tests in pkg/asset/installconfig/vsphere/validation_test.go

All tests are currently stub implementations marked with t.Skip() and
will be fully implemented in subsequent iterations.

Related: openshift-splat-team/splat-team#3
Parent: openshift-splat-team/splat-team#2

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add vSphere privilege validation logic using component-specific
privilege lists. Validates that each OpenShift component account
(installer, machine-api, csi-driver, cloud-controller, diagnostics)
has required vCenter permissions before installation proceeds.

Implementation:
- PrivilegeValidator struct with ValidateComponentPrivileges method
- ValidationResult struct with Valid, MissingPrivileges, Scope fields
- GetRequiredPrivileges() function with comprehensive privilege lists
  - Installer: ~45 privileges for infrastructure deployment
  - Machine API: ~35 privileges for VM lifecycle
  - CSI Driver: ~12 privileges for storage provisioning
  - Cloud Controller: ~10 read-only privileges for node discovery
  - Diagnostics: ~5 read-only privileges for troubleshooting

Test coverage:
- 9 test scenarios covering all acceptance criteria
- Missing privilege detection (machine-api, csi-driver)
- Successful validation for all components
- Component-specific privilege sets
- Error handling

Foundation for Story #4: Privilege Validation
Parent Epic: #2 - vSphere Multi-Account Credentials
Depends on: Story #3 (schema extension)

Related: openshift-splat-team/splat-team#4
Related: openshift-splat-team/splat-team#2

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit implements the greenfield installation flow for per-component
vSphere credentials (Story #6), enabling distinct vCenter accounts for each
OpenShift component to improve security posture through principle of least
privilege.

Implementation:
- percomponent.go: Integration logic for credential validation and selection
  - ValidatePerComponentCredentials: Validates all 5 component credentials
  - GetInstallerCredentials: Returns installer credentials for infrastructure
  - IsPerComponentMode: Detects per-component vs legacy mode
  - Helper functions for vCenter/credential resolution
- integration_test.go: 8 integration test scenarios
  - Happy path: All 5 accounts configured and validated
  - Validation failures: Missing privileges for installer, machine-api, csi-driver
  - Component secret isolation: RBAC verification
  - Runtime credential usage: Machine API, CSI, CCM, Diagnostics
- vsphere_percomponent_test.go: 2 E2E test scenarios
  - Full installation flow with all components
  - vCenter audit log verification for distinct usernames

Test Coverage:
- 10 test scenarios covering all acceptance criteria
- Integration with Stories #3 (schema), #4 (validation), #5 (CCO)
- All tests compile successfully
- Tests skip with "Implementation pending" (TDD approach)

Acceptance Criteria:
- AC1: Installer validates component credentials have required privileges
- AC2: Installer uses installer account for infrastructure provisioning
- AC3: CCO creates component-specific secrets
- AC4-AC7: Components use their specific credentials at runtime
- AC8: vCenter audit logs show distinct usernames

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Test coverage:
- Single vCenter YAML credentials file reading
- Multi-vCenter YAML credentials file reading
- File permissions validation (reject 0644, 0777)
- Precedence: install-config.yaml over credentials file
- Partial precedence with fallback to credentials file
- Missing credentials file fallback to legacy passthrough
- Malformed YAML error handling
- Empty credentials file handling
- Partial component credentials with fallback

All tests use t.Skip() for TDD approach.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements Story #7: Credentials File Support (YAML Format)

This commit adds support for reading per-component vSphere credentials
from a YAML credentials file at ~/.vsphere/credentials. The file uses
YAML format with vCenter servers as top-level keys, each containing
component-specific credential mappings.

Key features:
- YAML file format with vCenter FQDN as top-level keys
- File permissions validation (must be 0600)
- Precedence: install-config.yaml > credentials file > legacy passthrough
- Graceful fallback when file doesn't exist or is empty
- Support for single and multi-vCenter topologies
- Partial component credentials with mixed sources

Implementation:
- pkg/asset/installconfig/vsphere/credentialsfile.go: Core parser and validator
- pkg/asset/installconfig/vsphere/credentialsfile_test.go: 10 test scenarios

All acceptance criteria verified:
- AC1: YAML credentials file with correct permissions (0600)
- AC2: File permissions validation (reject 0644, 0777)
- AC3: Precedence (install-config over credentials file)

Test coverage: 10/10 tests passing
- Single vCenter YAML file reading
- Multi-vCenter YAML file reading
- Permissions rejection (0644, 0777)
- Precedence (full and partial)
- Missing file fallback
- Malformed YAML error handling
- Empty file fallback
- Partial component coverage

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
rvanderp3 added a commit that referenced this pull request Apr 14, 2026
… restart

Address code review feedback:

1. Multi-vCenter secret format support (Critical #1):
   - Add isMultiVCenterMode() detection based on credentials file
   - Update createSecret() to use FQDN-keyed format when multi-vCenter
   - Support all vCenters from credentials file (not just first)
   - Align with Story #8 multi_vcenter.go implementation

2. Real operator restart implementation (Critical #2):
   - Replace stub restartComponentOperators() with real Kubernetes API calls
   - Trigger rollout restart via deployment annotation update
   - Wait for rollout completion with 5-minute timeout
   - Replace stub verifyComponentReconnection() with deployment ready checks

3. Complete rollback implementation (Major #3):
   - Restore original passthrough secret from backup
   - Delete backup secret after successful restoration
   - Add TODO for CCO CloudCredential CR revert logic

4. Namespace validation (Minor #4):
   - Add validateNamespacesExist() before creating secrets
   - Fail early with clear error if namespace missing

5. Multi-vCenter credentials support (Minor #5):
   - Process all vCenters from credentials file
   - Validate privileges for each vCenter

Test updates:
- Add mock operator deployments to integration test
- Create all required namespaces in test setup
- All 4 unit tests passing
- Integration test (happy path) passing
- 5 E2E tests appropriately skipped (require live cluster)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
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.

1 participant