Skip to main content

Jobs Models

Overview

The Jobs models provide a structured way to track and monitor job status and details in Palo Alto Networks' Strata Cloud Manager. These models support both individual job status queries and paginated job list responses. The models handle validation and serialization of job data when interacting with the SCM API.

Attributes

JobDetails Model

AttributeTypeRequiredDefaultDescription
infoList[str]No[]List of informational messages
errorsList[str]No[]List of error messages
warningsList[str]No[]List of warning messages
descriptionstrNoNoneDescription of the job

JobStatusData Model

AttributeTypeRequiredDefaultDescription
idstrYesNoneUnique identifier for the job
cfg_idstrNo""Configuration ID
detailsstrYesNoneJob details in JSON format
dev_serialstrNo""Device serial number
dev_uuidstrNo""Device UUID
device_namestrNo""Name of the device
device_typestrNo""Type of device
end_tsdatetimeNoNoneJob end timestamp
insert_tsdatetimeYesNoneJob creation timestamp
job_resultstrYesNoneResult of the job
job_statusstrYesNoneCurrent status of the job
job_typestrYesNoneType of job
last_updatedatetimeYesNoneLast update timestamp
ownerstrYesNoneJob owner
parent_idstrNo"0"Parent job ID
percentstrYesNoneJob completion percentage
result_istrYesNoneNumeric result code
result_strstrYesNoneString result description
session_idstrNo""Session ID
start_tsdatetimeYesNoneJob start timestamp
status_istrYesNoneNumeric status code
status_strstrYesNoneString status description
summarystrNo""Job summary
type_istrYesNoneNumeric job type code
type_strstrYesNoneString job type description
unamestrYesNoneUsername

JobListItem Model

AttributeTypeRequiredDefaultDescription
idstrYesNoneUnique identifier for the job
device_namestrNo""Name of the device
end_tsstrNoNoneJob end timestamp
job_resultstrYesNoneResult of the job
job_statusstrYesNoneCurrent status of the job
job_typestrYesNoneType of job
parent_idstrYesNoneParent job ID
percentstrNo""Job completion percentage
result_strstrYesNoneString result description
start_tsstrYesNoneJob start timestamp
status_strstrYesNoneString status description
summarystrNo""Job summary
type_strstrYesNoneString job type description
unamestrYesNoneUsername
descriptionstrNo""Job description

JobStatusResponse Model

AttributeTypeRequiredDefaultDescription
dataList[JobStatusData]YesNoneList of job status objects

JobListResponse Model

AttributeTypeRequiredDefaultDescription
dataList[JobListItem]YesNoneList of job list items
totalintYesNoneTotal number of jobs available
limitintYesNoneMax number of jobs per page
offsetintYesNoneCurrent offset in result set

Exceptions

The Jobs models can raise the following exceptions during validation:

  • ValueError: Raised when required fields are missing or have invalid values
  • ValidationError: Raised when field formats or data types are incorrect
  • TypeError: Raised when incompatible types are provided

Model Validators

Timestamp Validation

The JobListItem model validates timestamp fields to handle empty strings:

from scm.models.operations import JobListItem

# Empty string timestamps are converted to None
job = JobListItem(
id="123",
job_result="SUCCESS",
job_status="COMPLETED",
job_type="CONFIG",
parent_id="0",
result_str="Success",
start_ts="2023-01-01T00:00:00",
end_ts="", # Will be converted to None
status_str="Completed",
type_str="Configuration",
uname="admin"
)
print(job.end_ts) # None

Datetime Serialization

The JobStatusData model automatically serializes datetime fields to ISO format strings:

from datetime import datetime
from scm.models.operations import JobStatusData

job = JobStatusData(
id="123",
details="{}",
insert_ts=datetime.now(),
job_result="SUCCESS",
job_status="COMPLETED",
job_type="CONFIG",
last_update=datetime.now(),
owner="admin",
percent="100",
result_i="1",
result_str="Success",
start_ts=datetime.now(),
status_i="2",
status_str="Completed",
type_i="3",
type_str="Configuration",
uname="admin"
)

data = job.model_dump()
print(data["start_ts"]) # "2023-12-20T10:15:30.123456"

Usage Examples

Working with Job Details

from scm.models.operations import JobDetails

# Create job details with messages
details = JobDetails(
info=["Starting configuration push", "Configuration applied"],
warnings=["Device connection slow"],
errors=[],
description="Configuration update job"
)

# Access job details
print(details.info) # ["Starting configuration push", "Configuration applied"]
print(details.warnings) # ["Device connection slow"]
print(details.description) # "Configuration update job"

Processing Job Status Data

from scm.models.operations import JobStatusResponse, JobStatusData
from datetime import datetime

# Create job status data
job_data = JobStatusData(
id="123",
details="{}",
insert_ts=datetime.now(),
job_result="SUCCESS",
job_status="COMPLETED",
job_type="CONFIG",
last_update=datetime.now(),
owner="admin",
percent="100",
result_i="1",
result_str="Success",
start_ts=datetime.now(),
status_i="2",
status_str="Completed",
type_i="3",
type_str="Configuration",
uname="admin"
)

# Create response with job data
response = JobStatusResponse(data=[job_data])

# Access job status information
for job in response.data:
print(f"Job {job.id}: {job.status_str} ({job.percent}%)")

Working with Job Lists

from scm.models.operations import JobListResponse, JobListItem

# Create job list items
jobs = [
JobListItem(
id="123",
job_result="SUCCESS",
job_status="COMPLETED",
job_type="CONFIG",
parent_id="0",
result_str="Success",
start_ts="2023-01-01T00:00:00",
status_str="Completed",
type_str="Configuration",
uname="admin"
),
JobListItem(
id="124",
job_result="IN_PROGRESS",
job_status="RUNNING",
job_type="COMMIT",
parent_id="0",
result_str="In Progress",
start_ts="2023-01-01T00:15:00",
status_str="Running",
type_str="Commit",
uname="admin"
)
]

# Create paginated response
response = JobListResponse(
data=jobs,
total=100,
limit=10,
offset=0
)

# Process job list
for job in response.data:
print(f"Job {job.id}: {job.type_str} - {job.status_str}")

# Access pagination info
print(f"Showing {len(response.data)} of {response.total} jobs")

Using Jobs with Unified Client

from scm.client import Scm

# Initialize client
client = Scm(
client_id="your_client_id",
client_secret="your_client_secret",
tsg_id="your_tsg_id"
)

# Get status of a specific job
job_id = "123e4567-e89b-12d3-a456-426655440000"
job_status = client.operations.get_job_status(job_id)

# Display job information
print(f"Job ID: {job_status.data[0].id}")
print(f"Status: {job_status.data[0].status_str}")
print(f"Result: {job_status.data[0].result_str}")
print(f"Progress: {job_status.data[0].percent}%")

# List recent jobs with pagination
recent_jobs = client.operations.list_jobs(limit=10, offset=0)
print(f"Found {recent_jobs.total} total jobs")

# Display list of jobs
for job in recent_jobs.data:
print(f"Job {job.id}: {job.type_str} - {job.status_str}")

# Filter jobs by parent ID
parent_jobs = client.operations.list_jobs(
limit=5,
parent_id="0" # Only top-level jobs
)

print(f"Found {parent_jobs.total} top-level jobs")

Monitoring Long-Running Jobs

from scm.client import Scm
import time

# Initialize client
client = Scm(
client_id="your_client_id",
client_secret="your_client_secret",
tsg_id="your_tsg_id"
)

# Make a configuration change
commit_result = client.operations.commit(
folders=["Security Policies"],
description="Updated security rules",
admin=["admin@example.com"]
)

# Get the job ID
job_id = commit_result.job_id
print(f"Monitoring job {job_id}")

# Poll for job completion
max_attempts = 12
attempt = 0
completed = False

while not completed and attempt < max_attempts:
# Wait between checks
time.sleep(5)
attempt += 1

# Get current job status
status = client.operations.get_job_status(job_id)
job = status.data[0]

# Print progress
print(f"Status: {job.status_str} ({job.percent}%)")

# Check if job is completed or failed
if job.job_status in ["FIN", "FAIL"]:
completed = True
if job.job_status == "FIN":
print(f"Job completed successfully: {job.summary}")
else:
print(f"Job failed: {job.summary}")

# Handle timeout
if not completed:
print("Job monitoring timed out. Check status later.")