Skip to content

Production deployment#245

Merged
konstantinoscs merged 3 commits intomainfrom
develop
Apr 10, 2026
Merged

Production deployment#245
konstantinoscs merged 3 commits intomainfrom
develop

Conversation

@konstantinoscs
Copy link
Copy Markdown
Contributor

@konstantinoscs konstantinoscs commented Apr 10, 2026

  • Changes to use API key from environment if available
  • Add environment variable column to show catalog command

Summary by CodeRabbit

  • New Features

    • Added support for environment variables on catalog properties, allowing configurations to reference dynamic values.
    • Updated CLI catalog display to show a new "Runtime Var" column for environment variable references.
  • Updates

    • Updated OpenAPI client library version reference from v0.10.15 to v0.10.17.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 10, 2026

📝 Walkthrough

Walkthrough

This pull request updates the OpenAPI API client from version v0.10.15 to v0.10.17 across hundreds of generated files in Rust and Python. It introduces an optional environment_variable field to catalog property models and updates the CLI to display this field when listing catalog properties. Test infrastructure is refactored to support interactive CLI input.

Changes

Cohort / File(s) Summary
OpenAPI Version Update
crates/tower-api/README.md, crates/tower-api/src/apis/configuration.rs, crates/tower-api/src/apis/default_api.rs, crates/tower-api/src/apis/feature_flags_api.rs, crates/tower-api/src/models/*.rs (200+ files)
Updated embedded OpenAPI document version string from v0.10.15 to v0.10.17 in file header comments across all generated API client code. No functional code changes.
Catalog Property Environment Variable
crates/tower-api/src/models/catalog_property.rs, crates/tower-api/src/models/exported_catalog_property.rs, src/tower/tower_api_client/models/catalog_property.py, src/tower/tower_api_client/models/exported_catalog_property.py
Added optional environment_variable: Option<String> field (Rust) and `environment_variable: str
CLI Catalog Display & Test Infrastructure
crates/tower-cmd/src/catalogs.rs, tests/integration/features/cli_api_key_auth.feature, tests/integration/features/environment.py, tests/integration/features/steps/cli_steps.py
Added "Runtime Var" column to catalog properties table output. Refactored CLI step execution into shared run_command_with_env() helper to support interactive input. Updated test environment setup to populate context.api_key from environment variable and added new step for CLI commands with input.

Possibly related PRs

Suggested reviewers

  • giray123
  • bradhe
  • jo-sm
  • sammuti

Poem

🐰 A catalog now whispers where runners must play,
With environment variables in a new Runtime Var display,
Through v0.10.17's gentle refrain,
The properties dance in a clearer domain,
And tests click through input with style and flair! ✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Production deployment' is vague and generic, providing no meaningful information about the specific changes in the changeset. Provide a more descriptive title that captures the primary changes, such as 'Update OpenAPI client to v0.10.17 and add environment_variable field to catalog properties' or similar.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot requested review from bradhe, giray123, jo-sm and sammuti April 10, 2026 09:48
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (1)
tests/integration/features/steps/cli_steps.py (1)

23-25: ⚠️ Potential issue | 🟡 Minor

Validate command shape before dropping the first token.

Line [24] assumes the first token is always tower. If not, args are silently shifted and can produce misleading failures.

Suggested fix
 def run_command_with_env(context, command, env, input=None):
     cli_path = context.tower_binary
@@
-    cmd_parts = shlex.split(command)
-    full_command = [cli_path] + cmd_parts[1:]  # Skip 'tower' prefix
+    cmd_parts = shlex.split(command)
+    if not cmd_parts:
+        raise AssertionError("Expected a non-empty CLI command")
+    if cmd_parts[0] != "tower":
+        raise AssertionError(
+            f"Expected command to start with 'tower', got: {cmd_parts[0]!r}"
+        )
+    full_command = [cli_path, *cmd_parts[1:]]  # Replace 'tower' with resolved binary
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/integration/features/steps/cli_steps.py` around lines 23 - 25, The code
currently blindly drops the first token when building full_command by using
cmd_parts[1:], which assumes cmd_parts[0] == 'tower' and can silently shift
arguments; update the logic around cmd_parts and full_command to validate that
cmd_parts is non-empty and that cmd_parts[0] == 'tower' before removing it
(e.g., raise a clear exception or fail the test if the prefix is missing), and
otherwise keep the original tokens so you don't silently change arguments—look
for the variables cmd_parts and full_command in the CLI step and add the check
and explicit error handling there.
🧹 Nitpick comments (1)
tests/integration/features/steps/cli_steps.py (1)

69-77: Deduplicate repeated API-key test environment construction.

Both handlers build the same env payload; extracting one helper will keep future changes consistent.

Refactor sketch
+def _api_key_test_env(context):
+    env = os.environ.copy()
+    env["FORCE_COLOR"] = "1"
+    env["CLICOLOR_FORCE"] = "1"
+    env["TOWER_URL"] = context.tower_url
+    env["TOWER_API_KEY"] = context.api_key
+    env["HOME"] = context.temp_dir
+    return env
+
 `@step`('I run "{command}" via CLI with API key')
 def step_run_cli_command_with_api_key(context, command):
@@
-    test_env = os.environ.copy()
-    test_env["FORCE_COLOR"] = "1"
-    test_env["CLICOLOR_FORCE"] = "1"
-    test_env["TOWER_URL"] = context.tower_url
-    test_env["TOWER_API_KEY"] = context.api_key
-
-    # Use a temp HOME with no session.json to prove API key auth works standalone
-    test_env["HOME"] = context.temp_dir
-
-    return run_command_with_env(context, command, test_env)
+    return run_command_with_env(context, command, _api_key_test_env(context))
@@
 def step_run_cli_command_with_api_key_and_input(context, command, input):
@@
-    test_env = os.environ.copy()
-    test_env["FORCE_COLOR"] = "1"
-    test_env["CLICOLOR_FORCE"] = "1"
-    test_env["TOWER_URL"] = context.tower_url
-    test_env["TOWER_API_KEY"] = context.api_key
-
-    # Use a temp HOME with no session.json to prove API key auth works standalone
-    test_env["HOME"] = context.temp_dir
-
-    return run_command_with_env(context, command, test_env, input=input)
+    return run_command_with_env(
+        context, command, _api_key_test_env(context), input=input
+    )

Also applies to: 84-93

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/integration/features/steps/cli_steps.py` around lines 69 - 77,
Duplicate environment construction for API-key tests should be extracted into a
single helper function (e.g., build_test_env or make_test_env) so both blocks
use the same logic; implement a function in the steps module that accepts the
context and returns a dict populated with FORCE_COLOR="1", CLICOLOR_FORCE="1",
TOWER_URL=context.tower_url, TOWER_API_KEY=context.api_key and
HOME=context.temp_dir, then replace the repeated inline assignments in the two
locations (the blocks around the current test_env assignments) with a call to
that helper to obtain test_env.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@tests/integration/features/steps/cli_steps.py`:
- Around line 23-25: The code currently blindly drops the first token when
building full_command by using cmd_parts[1:], which assumes cmd_parts[0] ==
'tower' and can silently shift arguments; update the logic around cmd_parts and
full_command to validate that cmd_parts is non-empty and that cmd_parts[0] ==
'tower' before removing it (e.g., raise a clear exception or fail the test if
the prefix is missing), and otherwise keep the original tokens so you don't
silently change arguments—look for the variables cmd_parts and full_command in
the CLI step and add the check and explicit error handling there.

---

Nitpick comments:
In `@tests/integration/features/steps/cli_steps.py`:
- Around line 69-77: Duplicate environment construction for API-key tests should
be extracted into a single helper function (e.g., build_test_env or
make_test_env) so both blocks use the same logic; implement a function in the
steps module that accepts the context and returns a dict populated with
FORCE_COLOR="1", CLICOLOR_FORCE="1", TOWER_URL=context.tower_url,
TOWER_API_KEY=context.api_key and HOME=context.temp_dir, then replace the
repeated inline assignments in the two locations (the blocks around the current
test_env assignments) with a call to that helper to obtain test_env.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9fa983eb-7eea-47c8-873a-c2eee7f6fe54

📥 Commits

Reviewing files that changed from the base of the PR and between 6636aa9 and c1558f7.

📒 Files selected for processing (223)
  • crates/tower-api/README.md
  • crates/tower-api/src/apis/configuration.rs
  • crates/tower-api/src/apis/default_api.rs
  • crates/tower-api/src/apis/feature_flags_api.rs
  • crates/tower-api/src/models/account.rs
  • crates/tower-api/src/models/acknowledge_alert_response.rs
  • crates/tower-api/src/models/acknowledge_all_alerts_response.rs
  • crates/tower-api/src/models/alert.rs
  • crates/tower-api/src/models/api_key.rs
  • crates/tower-api/src/models/app.rs
  • crates/tower-api/src/models/app_statistics.rs
  • crates/tower-api/src/models/app_summary.rs
  • crates/tower-api/src/models/app_version.rs
  • crates/tower-api/src/models/authentication_context.rs
  • crates/tower-api/src/models/batch_schedule_params.rs
  • crates/tower-api/src/models/batch_schedule_response.rs
  • crates/tower-api/src/models/cancel_run_response.rs
  • crates/tower-api/src/models/catalog.rs
  • crates/tower-api/src/models/catalog_property.rs
  • crates/tower-api/src/models/claim_device_login_ticket_params.rs
  • crates/tower-api/src/models/claim_device_login_ticket_response.rs
  • crates/tower-api/src/models/create_account_params.rs
  • crates/tower-api/src/models/create_account_params_flags_struct.rs
  • crates/tower-api/src/models/create_account_response.rs
  • crates/tower-api/src/models/create_api_key_params.rs
  • crates/tower-api/src/models/create_api_key_response.rs
  • crates/tower-api/src/models/create_app_params.rs
  • crates/tower-api/src/models/create_app_response.rs
  • crates/tower-api/src/models/create_authenticator_params.rs
  • crates/tower-api/src/models/create_authenticator_response.rs
  • crates/tower-api/src/models/create_catalog_params.rs
  • crates/tower-api/src/models/create_catalog_response.rs
  • crates/tower-api/src/models/create_device_login_ticket_response.rs
  • crates/tower-api/src/models/create_environment_params.rs
  • crates/tower-api/src/models/create_environment_response.rs
  • crates/tower-api/src/models/create_guest_params.rs
  • crates/tower-api/src/models/create_guest_response.rs
  • crates/tower-api/src/models/create_password_reset_params.rs
  • crates/tower-api/src/models/create_password_reset_response.rs
  • crates/tower-api/src/models/create_sandbox_secrets_params.rs
  • crates/tower-api/src/models/create_sandbox_secrets_response.rs
  • crates/tower-api/src/models/create_schedule_params.rs
  • crates/tower-api/src/models/create_schedule_response.rs
  • crates/tower-api/src/models/create_secret_params.rs
  • crates/tower-api/src/models/create_secret_response.rs
  • crates/tower-api/src/models/create_session_params.rs
  • crates/tower-api/src/models/create_session_response.rs
  • crates/tower-api/src/models/create_team_params.rs
  • crates/tower-api/src/models/create_team_response.rs
  • crates/tower-api/src/models/create_webhook_params.rs
  • crates/tower-api/src/models/create_webhook_response.rs
  • crates/tower-api/src/models/delete_api_key_params.rs
  • crates/tower-api/src/models/delete_api_key_response.rs
  • crates/tower-api/src/models/delete_app_response.rs
  • crates/tower-api/src/models/delete_authenticator_params.rs
  • crates/tower-api/src/models/delete_authenticator_response.rs
  • crates/tower-api/src/models/delete_catalog_response.rs
  • crates/tower-api/src/models/delete_guest_output_body.rs
  • crates/tower-api/src/models/delete_schedule_params.rs
  • crates/tower-api/src/models/delete_schedule_response.rs
  • crates/tower-api/src/models/delete_secret_response.rs
  • crates/tower-api/src/models/delete_session_params.rs
  • crates/tower-api/src/models/delete_session_response.rs
  • crates/tower-api/src/models/delete_team_invitation_params.rs
  • crates/tower-api/src/models/delete_team_invitation_response.rs
  • crates/tower-api/src/models/delete_team_params.rs
  • crates/tower-api/src/models/delete_team_response.rs
  • crates/tower-api/src/models/delete_webhook_response.rs
  • crates/tower-api/src/models/deploy_app_request.rs
  • crates/tower-api/src/models/deploy_app_response.rs
  • crates/tower-api/src/models/describe_account_body.rs
  • crates/tower-api/src/models/describe_app_response.rs
  • crates/tower-api/src/models/describe_app_version_response.rs
  • crates/tower-api/src/models/describe_authentication_context_body.rs
  • crates/tower-api/src/models/describe_catalog_response.rs
  • crates/tower-api/src/models/describe_device_login_session_response.rs
  • crates/tower-api/src/models/describe_email_preferences_body.rs
  • crates/tower-api/src/models/describe_plan_response.rs
  • crates/tower-api/src/models/describe_run_graph_response.rs
  • crates/tower-api/src/models/describe_run_links.rs
  • crates/tower-api/src/models/describe_run_logs_response.rs
  • crates/tower-api/src/models/describe_run_response.rs
  • crates/tower-api/src/models/describe_secrets_key_response.rs
  • crates/tower-api/src/models/describe_session_response.rs
  • crates/tower-api/src/models/describe_team_response.rs
  • crates/tower-api/src/models/describe_webhook_response.rs
  • crates/tower-api/src/models/email_subscriptions.rs
  • crates/tower-api/src/models/encrypted_catalog_property.rs
  • crates/tower-api/src/models/environment.rs
  • crates/tower-api/src/models/error_detail.rs
  • crates/tower-api/src/models/error_model.rs
  • crates/tower-api/src/models/event_alert.rs
  • crates/tower-api/src/models/event_error.rs
  • crates/tower-api/src/models/event_log.rs
  • crates/tower-api/src/models/event_shouldertap.rs
  • crates/tower-api/src/models/event_warning.rs
  • crates/tower-api/src/models/export_catalogs_params.rs
  • crates/tower-api/src/models/export_catalogs_response.rs
  • crates/tower-api/src/models/export_secrets_params.rs
  • crates/tower-api/src/models/export_secrets_response.rs
  • crates/tower-api/src/models/exported_catalog.rs
  • crates/tower-api/src/models/exported_catalog_property.rs
  • crates/tower-api/src/models/exported_secret.rs
  • crates/tower-api/src/models/feature.rs
  • crates/tower-api/src/models/featurebase_identity.rs
  • crates/tower-api/src/models/generate_app_statistics_response.rs
  • crates/tower-api/src/models/generate_authenticator_response.rs
  • crates/tower-api/src/models/generate_run_statistics_response.rs
  • crates/tower-api/src/models/generate_runner_credentials_response.rs
  • crates/tower-api/src/models/get_feature_flag_response_body.rs
  • crates/tower-api/src/models/guest.rs
  • crates/tower-api/src/models/invite_team_member_params.rs
  • crates/tower-api/src/models/invite_team_member_response.rs
  • crates/tower-api/src/models/leave_team_response.rs
  • crates/tower-api/src/models/list_alerts_response.rs
  • crates/tower-api/src/models/list_api_keys_response.rs
  • crates/tower-api/src/models/list_app_environments_response.rs
  • crates/tower-api/src/models/list_app_versions_response.rs
  • crates/tower-api/src/models/list_apps_response.rs
  • crates/tower-api/src/models/list_authenticators_response.rs
  • crates/tower-api/src/models/list_catalogs_response.rs
  • crates/tower-api/src/models/list_environments_response.rs
  • crates/tower-api/src/models/list_guests_response.rs
  • crates/tower-api/src/models/list_my_team_invitations_response.rs
  • crates/tower-api/src/models/list_runners_response.rs
  • crates/tower-api/src/models/list_runs_response.rs
  • crates/tower-api/src/models/list_schedules_response.rs
  • crates/tower-api/src/models/list_secret_environments_response.rs
  • crates/tower-api/src/models/list_secrets_response.rs
  • crates/tower-api/src/models/list_team_invitations_response.rs
  • crates/tower-api/src/models/list_team_members_response.rs
  • crates/tower-api/src/models/list_teams_response.rs
  • crates/tower-api/src/models/list_webhooks_response.rs
  • crates/tower-api/src/models/organization.rs
  • crates/tower-api/src/models/organization_usage.rs
  • crates/tower-api/src/models/pagination.rs
  • crates/tower-api/src/models/parameter.rs
  • crates/tower-api/src/models/plan.rs
  • crates/tower-api/src/models/refresh_session_params.rs
  • crates/tower-api/src/models/refresh_session_response.rs
  • crates/tower-api/src/models/regenerate_guest_login_url_params.rs
  • crates/tower-api/src/models/regenerate_guest_login_url_response.rs
  • crates/tower-api/src/models/remove_team_member_params.rs
  • crates/tower-api/src/models/remove_team_member_response.rs
  • crates/tower-api/src/models/resend_team_invitation_params.rs
  • crates/tower-api/src/models/resend_team_invitation_response.rs
  • crates/tower-api/src/models/run.rs
  • crates/tower-api/src/models/run_app_initiator_data.rs
  • crates/tower-api/src/models/run_app_params.rs
  • crates/tower-api/src/models/run_app_response.rs
  • crates/tower-api/src/models/run_attempt.rs
  • crates/tower-api/src/models/run_failure_alert.rs
  • crates/tower-api/src/models/run_graph_node.rs
  • crates/tower-api/src/models/run_graph_run_id.rs
  • crates/tower-api/src/models/run_initiator.rs
  • crates/tower-api/src/models/run_initiator_details.rs
  • crates/tower-api/src/models/run_log_line.rs
  • crates/tower-api/src/models/run_parameter.rs
  • crates/tower-api/src/models/run_results.rs
  • crates/tower-api/src/models/run_retry_policy.rs
  • crates/tower-api/src/models/run_run_initiator_details.rs
  • crates/tower-api/src/models/run_statistics.rs
  • crates/tower-api/src/models/run_timeseries_point.rs
  • crates/tower-api/src/models/runner.rs
  • crates/tower-api/src/models/runner_credentials.rs
  • crates/tower-api/src/models/schedule.rs
  • crates/tower-api/src/models/schedule_run_initiator_details.rs
  • crates/tower-api/src/models/search_runs_response.rs
  • crates/tower-api/src/models/secret.rs
  • crates/tower-api/src/models/server_sent_events_inner.rs
  • crates/tower-api/src/models/server_sent_events_inner_1.rs
  • crates/tower-api/src/models/server_sent_events_inner_2.rs
  • crates/tower-api/src/models/session.rs
  • crates/tower-api/src/models/shoulder_tap.rs
  • crates/tower-api/src/models/sse_warning.rs
  • crates/tower-api/src/models/statistics_settings.rs
  • crates/tower-api/src/models/team.rs
  • crates/tower-api/src/models/team_invitation.rs
  • crates/tower-api/src/models/team_membership.rs
  • crates/tower-api/src/models/test_webhook_response.rs
  • crates/tower-api/src/models/token.rs
  • crates/tower-api/src/models/unverified_authenticator.rs
  • crates/tower-api/src/models/update_account_params.rs
  • crates/tower-api/src/models/update_account_response.rs
  • crates/tower-api/src/models/update_app_params.rs
  • crates/tower-api/src/models/update_app_response.rs
  • crates/tower-api/src/models/update_catalog_params.rs
  • crates/tower-api/src/models/update_catalog_response.rs
  • crates/tower-api/src/models/update_email_preferences_body.rs
  • crates/tower-api/src/models/update_environment_params.rs
  • crates/tower-api/src/models/update_environment_response.rs
  • crates/tower-api/src/models/update_my_team_invitation_params.rs
  • crates/tower-api/src/models/update_my_team_invitation_response.rs
  • crates/tower-api/src/models/update_organization_params.rs
  • crates/tower-api/src/models/update_organization_response.rs
  • crates/tower-api/src/models/update_password_reset_params.rs
  • crates/tower-api/src/models/update_password_reset_response.rs
  • crates/tower-api/src/models/update_plan_params.rs
  • crates/tower-api/src/models/update_plan_response.rs
  • crates/tower-api/src/models/update_schedule_params.rs
  • crates/tower-api/src/models/update_schedule_response.rs
  • crates/tower-api/src/models/update_secret_params.rs
  • crates/tower-api/src/models/update_secret_response.rs
  • crates/tower-api/src/models/update_team_member_params.rs
  • crates/tower-api/src/models/update_team_member_response.rs
  • crates/tower-api/src/models/update_team_params.rs
  • crates/tower-api/src/models/update_team_response.rs
  • crates/tower-api/src/models/update_user_params.rs
  • crates/tower-api/src/models/update_user_response.rs
  • crates/tower-api/src/models/update_webhook_params.rs
  • crates/tower-api/src/models/update_webhook_response.rs
  • crates/tower-api/src/models/usage_limit.rs
  • crates/tower-api/src/models/user.rs
  • crates/tower-api/src/models/verified_authenticator.rs
  • crates/tower-api/src/models/verify_email_params.rs
  • crates/tower-api/src/models/verify_email_response.rs
  • crates/tower-api/src/models/webhook.rs
  • crates/tower-cmd/src/catalogs.rs
  • src/tower/tower_api_client/models/catalog_property.py
  • src/tower/tower_api_client/models/exported_catalog_property.py
  • tests/integration/features/cli_api_key_auth.feature
  • tests/integration/features/environment.py
  • tests/integration/features/steps/cli_steps.py

@konstantinoscs konstantinoscs merged commit 1a66144 into main Apr 10, 2026
32 checks passed
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