Skip to content

Enhance add-access-rule command UX with intuitive name-based flags#3758

Draft
rkoster wants to merge 3 commits intomainfrom
enhance-add-access-rule-ux
Draft

Enhance add-access-rule command UX with intuitive name-based flags#3758
rkoster wants to merge 3 commits intomainfrom
enhance-add-access-rule-ux

Conversation

@rkoster
Copy link
Copy Markdown

@rkoster rkoster commented Apr 10, 2026

Summary

This PR enhances the user experience of the access-rules commands by providing intuitive name-based flags and aligning with recent RFC updates that removed rule names.

Related to: cloudfoundry/community#1438

Motivation

The original add-access-rule command required users to manually construct GUID-based selectors (e.g., cf:app:d76446a1-f429-4444-8797-be2f78b75b08), which was cumbersome and error-prone. This PR follows CF CLI conventions from commands like add-network-policy to provide a more user-friendly interface.

Additionally, per RFC commits 882b69a and 11752f2, access rules no longer have user-provided names. They are now identified by their selector only, with labels/annotations used for metadata instead.

Changes

RFC Alignment: Removed Rule Names

Key Changes:

  • Removed RULE_NAME positional argument from add-access-rule command
  • Removed Name field from AccessRule API resource
  • Updated access-rules list command to show 4 columns: route, selector, scope, source
    • The source column shows the resolved name of the app/space/org from the selector
  • Updated remove-access-rule to use --selector flag instead of rule name
  • Renamed DeleteAccessRule() to DeleteAccessRuleBySelector()

Command Interface Improvements

Before:

cf add-access-rule RULE_NAME DOMAIN SELECTOR --hostname HOST
cf remove-access-rule RULE_NAME DOMAIN --hostname HOST

After:

# add-access-rule examples
cf add-access-rule apps.identity --source-app frontend-app --hostname backend
cf add-access-rule apps.identity --source-space monitoring --hostname api
cf add-access-rule apps.identity --source-org platform --hostname shared-api
cf add-access-rule apps.identity --source-any --hostname public-api

# Cross-space/org access
cf add-access-rule apps.identity --source-app client --source-space prod-space --source-org prod-org --hostname api

# Advanced: raw selector still supported
cf add-access-rule apps.identity --selector cf:app:GUID --hostname backend

# remove-access-rule
cf remove-access-rule apps.identity --selector cf:app:GUID --hostname backend

New Flags

add-access-rule:

  • --source-app APP_NAME - Specify source app by name (resolves to GUID)
  • --source-space SPACE_NAME - Specify space context for app lookup or create space-level rule
  • --source-org ORG_NAME - Specify org context for space/app lookup or create org-level rule
  • --source-any - Allow any authenticated app
  • --selector SELECTOR - Raw GUID-based selector for advanced users

remove-access-rule:

  • --selector SELECTOR - Required. Specify the selector to remove

Terminology Update

  • Renamed all "target" terminology to "source" throughout codebase
  • Access rules specify the source (who can access), not the target
  • Updated AccessRuleWithRoute.TargetNameSourceName
  • Updated resolveAccessRuleTarget()resolveAccessRuleSource()
  • Updated access-rules list command table header: "target" → "source"

Enhanced Output

add-access-rule:

Adding access rule for route backend.apps.identity as admin...
  scope: app, source: frontend-app
  selector: cf:app:d76446a1-f429-4444-8797-be2f78b75b08
OK

access-rules:

route                            selector                                       scope   source
backend.apps.identity            cf:app:d76446a1-f429-4444-8797-be2f78b75b08    app     frontend-app
api.apps.identity/metrics        cf:space:2b26e210-1b48-4e60-8432-f24bc5927789  space   monitoring
public-api.apps.identity         cf:any                                         any     

Validation & Error Handling

  • Validates exactly one primary source is specified
  • Provides helpful error messages when app not found in current space
  • Suggests using --source-space and --source-org flags for cross-space/org access
  • Follows CF CLI patterns from add-network-policy command

Domain Integration

  • Added --enforce-access-rules and --access-rules-scope flags to create-shared-domain and create-private-domain commands
  • Updated domain resource with new fields

Testing

  • ✅ 17 comprehensive test cases for add-access-rule command
  • ✅ Updated actor tests to remove Name field references
  • ✅ All tests passing
  • ✅ Covers validation, resolution, error handling, and cross-space/org scenarios

Breaking Changes

  • Removed RULE_NAME positional argument from add-access-rule command
  • Removed Name field from AccessRule API resource
  • Updated remove-access-rule to require --selector flag instead of rule name
  • These are acceptable breaking changes since the access rules feature has not been released yet

Checklist

  • Tests added/updated and passing
  • Documentation (help text) updated
  • Breaking changes documented
  • Follows CF CLI conventions
  • Aligned with RFC updates (removed rule names)
  • Manual testing against live CF deployment (requires CAPI backend support)

Next Steps

This PR is marked as draft pending:

  1. Manual testing against a CF deployment with access rules API support
  2. Integration testing with full CF ecosystem
  3. Review from CF CLI maintainers

This commit improves the user experience for the add-access-rule command
by replacing the positional GUID-based SELECTOR argument with intuitive
flags that accept human-readable names and support cross-space/org resolution.

Changes:

**Command Interface:**
- Remove positional SELECTOR argument (breaking change, acceptable for unreleased feature)
- Add new flags: --source-app, --source-space, --source-org, --source-any, --selector
- Support hierarchical name resolution:
  - --source-app APP_NAME (looks in current space)
  - --source-app APP_NAME --source-space SPACE (cross-space in current org)
  - --source-app APP_NAME --source-space SPACE --source-org ORG (cross-org)
  - --source-space SPACE (space-level rule)
  - --source-org ORG (org-level rule)
  - --source-any (allow any authenticated app)
  - --selector SELECTOR (raw GUID-based selector for advanced users)
- Validate exactly one primary source is specified
- Display verbose output showing resolved selector for transparency

**Terminology Update:**
- Rename all "target" terminology to "source" throughout codebase
- Access rules specify the source (who can access), not the target
- Update AccessRuleWithRoute.TargetName → SourceName
- Update resolveAccessRuleTarget() → resolveAccessRuleSource()
- Update access-rules list command table header: "target" → "source"

**Error Handling:**
- Provide helpful error messages when app not found in current space
- Suggest using --source-space and --source-org flags for cross-space/org access
- Follow CF CLI patterns from add-network-policy command

**Testing:**
- Add 17 comprehensive test cases for add-access-rule command
- Update 19 actor tests to use new SourceName field
- All tests passing (36/36)

**Domain Integration:**
- Add enforce_access_rules support to create-shared-domain and create-private-domain
- Add --enforce-access-rules and --access-rules-scope flags
- Update domain resource with new fields

Examples:

  # Simple case - app in current space
  cf add-access-rule allow-frontend apps.identity --source-app frontend-app --hostname backend

  # Cross-space access
  cf add-access-rule allow-other apps.identity --source-app api-client --source-space other-space --hostname backend

  # Cross-org access
  cf add-access-rule allow-prod apps.identity --source-app client --source-space prod-space --source-org prod-org --hostname api

  # Space-level rule
  cf add-access-rule allow-monitoring apps.identity --source-space monitoring --hostname api

  # Org-level rule
  cf add-access-rule allow-platform apps.identity --source-org platform --hostname shared-api

  # Any authenticated app
  cf add-access-rule allow-all apps.identity --source-any --hostname public-api

Related to: cloudfoundry/community#1438
@rkoster
Copy link
Copy Markdown
Author

rkoster commented Apr 10, 2026

Don't worry about this PR just yet, just doing some more POC work on the RFC: cloudfoundry/community#1438

rkoster added 2 commits April 15, 2026 08:20
Per RFC commits 882b69a and 11752f2, access rules no longer have
user-provided names. They are identified by their selector only,
with labels/annotations used for metadata instead.

Changes:
- Removed RULE_NAME argument from add-access-rule command
- Removed Name field from AccessRule API resource
- Updated access-rules list to show 4 columns (route, selector, scope, source)
  - SourceName now represents resolved app/space/org name from selector
- Updated remove-access-rule to use --selector flag instead of rule name
- Renamed DeleteAccessRule() to DeleteAccessRuleBySelector()
- Updated all tests to remove Name field references

All tests passing.
…lumns

Changed table format from:
  route                    selector  scope  source
  backend.apps.identity    ...       app    frontend-app

To:
  host     domain          path     selector  scope  source
  backend  apps.identity            ...       app    frontend-app
  api      apps.identity   /metrics ...       space  monitoring

This provides better clarity by separating the route components into
individual columns, making it easier to scan and filter visually.
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