Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions examples/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,31 +67,31 @@ def main():
)

try:
run_list = client.runs.list(args.workspace_id, options)
print("running inside run list")
run_list = list(client.runs.list(args.workspace_id, options))
except Exception as e:
print(f"Error listing runs: {e}")
if args.organization:
print("Trying organization-level listing instead...")
else:
return

if "run_list" in locals():
print(f"Total runs: {run_list.total_count}")
print(f"Page {run_list.current_page} of {run_list.total_pages}")
if "run_list" in locals() and run_list:
print(f"Total runs fetched: {len(run_list)}")
print()

for run in run_list.items:
Copy link
Collaborator

Choose a reason for hiding this comment

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

Share the output results of examples/run.py file in the conversation.

for run in run_list:
print(f"- {run.id} | status={run.status} | created={run.created_at}")
print(f"message: {run.message}")
print(f"has_changes: {run.has_changes} | is_destroy: {run.is_destroy}")

if not run_list.items:
if not run_list:
print("No runs found.")
else:
# 2) Read the most recent run with details
_print_header("Reading most recent run details")

latest_run = run_list.items[0]
latest_run = run_list[0]
read_options = RunReadOptions(
include=[
RunIncludeOpt.RUN_PLAN,
Expand Down Expand Up @@ -188,10 +188,12 @@ def main():
status="applied,planned,errored",
)

org_runs = client.runs.list_for_organization(args.organization, org_options)
print(f"Found {len(org_runs.items)} runs across organization")
org_runs = list(
client.runs.list_for_organization(args.organization, org_options)
)
print(f"Found {len(org_runs)} runs across organization")

for run in org_runs.items[:3]: # Show first 3
for run in org_runs[:3]: # Show first 3
print(f"- {run.id} | status={run.status}")
if run.workspace:
print(f"workspace: {run.workspace.name}")
Expand All @@ -204,15 +206,15 @@ def main():
_print_header("Run Actions Demo (Safe Mode)")

# Get runs first if not already available
if "run_list" not in locals() or not run_list.items:
if "run_list" not in locals() or not run_list:
try:
options = RunListOptions(page_size=1)
run_list = client.runs.list(args.workspace_id, options)
run_list = list(client.runs.list(args.workspace_id, options))
except Exception as e:
print(f"Error getting runs for actions demo: {e}")
return

if not run_list.items:
if not run_list:
print("No runs available for actions demo")
return

Expand Down
69 changes: 19 additions & 50 deletions src/pytfe/resources/run.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

from collections.abc import Iterator
from typing import Any

from ..errors import (
Expand All @@ -10,14 +11,12 @@
TerraformVersionValidForPlanOnlyError,
)
from ..models.run import (
OrganizationRunList,
Run,
RunApplyOptions,
RunCancelOptions,
RunCreateOptions,
RunDiscardOptions,
RunForceCancelOptions,
RunList,
RunListForOrganizationOptions,
RunListOptions,
RunReadOptions,
Expand All @@ -27,63 +26,33 @@


class Runs(_Service):
def list(self, workspace_id: str, options: RunListOptions | None = None) -> RunList:
def list(
self, workspace_id: str, options: RunListOptions | None = None
) -> Iterator[Run]:
"""List all the runs of the given workspace."""
if not valid_string_id(workspace_id):
raise InvalidWorkspaceIDError()
params = (
options.model_dump(by_alias=True, exclude_none=True) if options else None
)
r = self.t.request(
"GET",
f"/api/v2/workspaces/{workspace_id}/runs",
params=params,
)
jd = r.json()
items = []
meta = jd.get("meta", {})
pagination = meta.get("pagination", {})
for d in jd.get("data", []):
attrs = d.get("attributes", {})
attrs["id"] = d.get("id")
items.append(Run.model_validate(attrs))
return RunList(
items=items,
current_page=pagination.get("current-page"),
total_pages=pagination.get("total-pages"),
prev_page=pagination.get("prev-page"),
next_page=pagination.get("next-page"),
total_count=pagination.get("total-count"),
)
params = options.model_dump(by_alias=True) if options else {}
path = f"/api/v2/workspaces/{workspace_id}/runs"
for item in self._list(path, params=params):
attrs = item.get("attributes", {})
attrs["id"] = item.get("id")
yield Run.model_validate(attrs)

def list_for_organization(
self, organization: str, options: RunListForOrganizationOptions | None = None
) -> OrganizationRunList:
) -> Iterator[Run]:
"""List all the runs of the given organization."""
if not valid_string_id(organization):
raise InvalidOrgError()
params = (
options.model_dump(by_alias=True, exclude_none=True) if options else None
)
r = self.t.request(
"GET",
f"/api/v2/organizations/{organization}/runs",
params=params,
)
jd = r.json()
items = []
meta = jd.get("meta", {})
pagination = meta.get("pagination", {})
for d in jd.get("data", []):
attrs = d.get("attributes", {})
attrs["id"] = d.get("id")
items.append(Run.model_validate(attrs))
return OrganizationRunList(
items=items,
current_page=pagination.get("current-page"),
prev_page=pagination.get("prev-page"),
next_page=pagination.get("next-page"),
)
path = f"/api/v2/organizations/{organization}/runs"
params = options.model_dump(by_alias=True, exclude_none=True) if options else {}
# meta = jd.get("meta", {})
# pagination = meta.get("pagination", {})
for item in self._list(path, params=params):
attrs = item.get("attributes", {})
attrs["id"] = item.get("id")
yield Run.model_validate(attrs)

def create(self, options: RunCreateOptions) -> Run:
"""Create a new run for the given workspace."""
Expand Down
Loading
Loading