Provisioning Module¶
Python API reference for the tlm_cli.manufacturing.provisioning package.
Use this package to provision, unprovision, and retrieve agent configuration files for devices programmatically. DeviceProvisioner
drives the full device lifecycle; the request and result models define the inputs and outputs for each operation; the exception
hierarchy lets you handle specific failure modes precisely.
For a conceptual explanation of what provisioning does, see Provisioning Workflow.
DeviceProvisioner¶
tlm_cli.manufacturing.provisioning.device.DeviceProvisioner
¶
Provisioning service for devices in PMS.
Orchestrates the full provisioning lifecycle across PMS (JSON:API), IoT, and ToloMEO Manager (plain REST via httpx2).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
pms_client
|
PMSClient
|
PMS JSON:API client for customer and device operations. |
required |
iot_client
|
RestClientProtocol
|
Authenticated REST client for the IoT endpoint. |
required |
tolomeo_client
|
RestClientProtocol
|
Authenticated REST client for the ToloMEO manager endpoint. |
required |
instance
|
str
|
Instance name, e.g. "tolomeo.io". Used in generated config files. |
required |
Examples:
>>> provisioner = DeviceProvisioner(pms_client, iot_client, tolomeo_client, "tolomeo.io")
>>> result = provisioner.provision(ProvisioningRequest(serial_number="DEV123", customer_code="ACME"))
Source code in tlm_cli/manufacturing/provisioning/device.py
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 | |
get_certificate(request)
¶
Retrieve the agent configuration file for an already-provisioned device.
Fetches the ConnHex ID from PMS and the init key from the IoT API, then writes the agent.env config file to disk. The file content is stable — it will not change between calls unless the device is unprovisioned and reprovisioned.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
CertificateRequest
|
Certificate request containing the device serial number and output path for the configuration file. |
required |
Returns:
| Type | Description |
|---|---|
CertificateResult
|
CertificateResult with status SUCCESS and the written config file path, |
CertificateResult
|
or status FAILED with an error message on any failure. |
Note
Failures are not raised (DeviceNotFoundError, CertificateRetrievalError, ConfigurationError); they are
returned as status FAILED with the cause in error_message.
Source code in tlm_cli/manufacturing/provisioning/device.py
provision(request)
¶
Provision a device and write its agent configuration file.
Executes the full provisioning sequence: verifies the device does not already exist, resolves the customer tenant ID, calls the bulk provisioning API, fetches the ConnHex ID from PMS, retrieves the init key from the IoT API, and writes the agent.env config file to disk.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
ProvisioningRequest
|
Provisioning request containing serial number, customer code, and output path for the configuration file. |
required |
Returns:
| Type | Description |
|---|---|
ProvisioningResult
|
ProvisioningResult with status SUCCESS and the written config file path, |
ProvisioningResult
|
or status FAILED with an error message on any failure. |
Note
Failures are not raised (DeviceAlreadyExistsError, CustomerNotFoundError, DeviceProvisioningError,
CertificateRetrievalError, ConfigurationError); they are returned as status FAILED with the cause in
error_message.
Source code in tlm_cli/manufacturing/provisioning/device.py
unprovision(request)
¶
Permanently remove all provisioning records for a device via the bulk API.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
UnprovisioningRequest
|
Unprovisioning request containing the device serial number. |
required |
Returns:
| Type | Description |
|---|---|
UnprovisioningResult
|
UnprovisioningResult with status SUCCESS, or status FAILED with an |
UnprovisioningResult
|
error message on any failure. |
Note
Failures are not raised (DeviceNotFoundError, UnprovisioningError); they are returned as status FAILED with
the cause in error_message.
Source code in tlm_cli/manufacturing/provisioning/device.py
Request models¶
tlm_cli.manufacturing.provisioning.models.ProvisioningRequest
¶
Bases: DeviceRequestBase
Request model for provisioning a device.
Contains all necessary information for provisioning, including customer details, configuration output, and optional manufacturing data.
Attributes:
| Name | Type | Description |
|---|---|---|
serial_number |
str
|
Device serial number (inherited). |
customer_code |
str
|
Customer code for tenant identification. |
config_output_path |
Path
|
Path where the configuration file will be created. |
manufacturing_data |
Dict
|
Optional manufacturing metadata. |
Examples:
Basic request:
Custom config path:
>>> ProvisioningRequest(
... serial_number="DEV123",
... customer_code="ACME",
... config_output_path=Path("/opt/configs/device.env")
... )
With manufacturing data:
>>> ProvisioningRequest(
... serial_number="DEV123",
... customer_code="ACME",
... manufacturing_data={"batch": "B001", "revision": "v2.1"}
... )
Source code in tlm_cli/manufacturing/provisioning/models.py
tlm_cli.manufacturing.provisioning.models.UnprovisioningRequest
¶
Bases: DeviceRequestBase
Request model for unprovisioning a device.
Currently only requires a serial number, but designed to be extensible for future use.
Attributes:
| Name | Type | Description |
|---|---|---|
serial_number |
str
|
Device serial number (inherited). |
Examples:
Source code in tlm_cli/manufacturing/provisioning/models.py
tlm_cli.manufacturing.provisioning.models.CertificateRequest
¶
Bases: DeviceRequestBase
Request model for retrieving the agent configuration of an already-provisioned device.
Attributes:
| Name | Type | Description |
|---|---|---|
serial_number |
str
|
Device serial number (inherited). |
config_output_path |
Path
|
Path where the configuration file will be written.
Defaults to |
Examples:
>>> CertificateRequest(serial_number="DEV123")
>>> CertificateRequest(serial_number="DEV123", config_output_path=Path("/opt/configs/agent.env"))
Source code in tlm_cli/manufacturing/provisioning/models.py
Result models¶
tlm_cli.manufacturing.provisioning.models.ProvisioningResult
¶
Bases: ResultBase
Result model for device provisioning operations.
Contains all information returned from a successful or failed provisioning operation, including device identifiers and configuration.
Attributes:
| Name | Type | Description |
|---|---|---|
status |
ProvisioningStatus
|
Operation status (inherited). |
serial_number |
str
|
Device serial number (inherited). |
error_message |
Optional[str]
|
Error description (inherited). |
connhex_id |
Optional[str]
|
ConnHex ID assigned (on success). |
config_file_path |
Optional[Path]
|
Path to configuration file (on success). |
tenant_id |
Optional[str]
|
Tenant ID used for provisioning (on success). |
Examples:
Successful result:
>>> ProvisioningResult(
... status=ProvisioningStatus.SUCCESS,
... serial_number="DEV123",
... connhex_id="cx-12345",
... config_file_path=Path("agent.env"),
... tenant_id="tenant-456"
... )
Failed result:
>>> ProvisioningResult(
... status=ProvisioningStatus.FAILED,
... serial_number="DEV123",
... error_message="Customer not found"
... )
Source code in tlm_cli/manufacturing/provisioning/models.py
tlm_cli.manufacturing.provisioning.models.UnprovisioningResult
¶
Bases: ResultBase
Result model for device unprovisioning operations.
Contains information returned from a successful or failed unprovisioning operation.
Attributes:
| Name | Type | Description |
|---|---|---|
status |
ProvisioningStatus
|
Operation status (inherited). |
serial_number |
str
|
Device serial number (inherited). |
error_message |
Optional[str]
|
Error description (inherited). |
Examples:
Successful result:
Failed result:
>>> UnprovisioningResult(
... status=ProvisioningStatus.FAILED,
... serial_number="DEV123",
... error_message="Device not found"
... )
Source code in tlm_cli/manufacturing/provisioning/models.py
tlm_cli.manufacturing.provisioning.models.CertificateResult
¶
Bases: ResultBase
Result model for certificate/configuration retrieval operations.
Contains information returned from a successful or failed certificate retrieval operation for existing devices.
Attributes:
| Name | Type | Description |
|---|---|---|
status |
ProvisioningStatus
|
Operation status (inherited). |
serial_number |
str
|
Device serial number (inherited). |
error_message |
Optional[str]
|
Error description (inherited). |
connhex_id |
Optional[str]
|
ConnHex ID retrieved (on success). |
config_file_path |
Optional[Path]
|
Path to configuration file (on success). |
Examples:
Successful result:
>>> CertificateResult(
... status=ProvisioningStatus.SUCCESS,
... serial_number="DEV123",
... connhex_id="cx-12345",
... config_file_path=Path("agent.env")
... )
Failed result:
>>> CertificateResult(
... status=ProvisioningStatus.FAILED,
... serial_number="DEV123",
... error_message="Device not found in manufacturing"
... )
Source code in tlm_cli/manufacturing/provisioning/models.py
tlm_cli.manufacturing.provisioning.models.ProvisioningStatus
¶
Bases: StrEnum
Enumeration of provisioning operation statuses.
Defines standardized outcomes for provisioning and unprovisioning operations.
Attributes:
| Name | Type | Description |
|---|---|---|
SUCCESS |
str
|
Operation completed successfully. |
FAILED |
str
|
Operation failed due to an error. |
Examples:
>>> status = ProvisioningStatus.SUCCESS
>>> print(status.value)
success
>>> if status is ProvisioningStatus.SUCCESS:
... print("Operation succeeded")
Source code in tlm_cli/manufacturing/provisioning/models.py
Exceptions¶
tlm_cli.manufacturing.provisioning.exceptions.ProvisioningError
¶
Bases: Exception
Base exception for all provisioning-related errors.
This is the parent class for all provisioning exceptions, allowing callers to catch all provisioning-related errors with a single handler if desired.
Examples:
>>> try:
... provisioner.provision(request)
... except ProvisioningError as e:
... print(f"Provisioning failed: {e}")
Source code in tlm_cli/manufacturing/provisioning/exceptions.py
tlm_cli.manufacturing.provisioning.exceptions.CustomerNotFoundError
¶
Bases: ProvisioningError
Exception raised when a customer record is missing or invalid.
This error occurs in cases such as
- The customer code does not exist in the PMS system.
- The customer exists but has no associated tenant ID.
- Retrieving customer information from the API fails.
Examples:
Source code in tlm_cli/manufacturing/provisioning/exceptions.py
tlm_cli.manufacturing.provisioning.exceptions.DeviceProvisioningError
¶
Bases: ProvisioningError
Exception raised when device provisioning or unprovisioning fails.
This error occurs in cases such as
- The bulk provisioning API returns an error.
- The bulk unprovisioning API returns an error.
- Network or communication errors occur during API calls.
Examples:
Source code in tlm_cli/manufacturing/provisioning/exceptions.py
tlm_cli.manufacturing.provisioning.exceptions.DeviceAlreadyExistsError
¶
Bases: DeviceProvisioningError
Exception raised when attempting to provision a device that already exists.
This is a specific case of DeviceProvisioningError that occurs when a device serial number already exists in the manufacturing system during provisioning attempts.
Examples:
Source code in tlm_cli/manufacturing/provisioning/exceptions.py
tlm_cli.manufacturing.provisioning.exceptions.DeviceNotFoundError
¶
Bases: ProvisioningError
Exception raised when a device cannot be found in the PMS system.
This error occurs in cases such as
- A device serial number does not exist in manufacturing.
- A device exists but has no associated ConnHex ID.
- Retrieving device information from the API fails.
Examples:
Source code in tlm_cli/manufacturing/provisioning/exceptions.py
tlm_cli.manufacturing.provisioning.exceptions.ConfigurationError
¶
Bases: ProvisioningError
Exception raised when device configuration operations fail.
This error occurs in cases such as
- The configuration API returns an error.
- The API response contains no payload or invalid data.
- The initialization key is missing from the response.
- Configuration file creation fails.
Examples:
Source code in tlm_cli/manufacturing/provisioning/exceptions.py
tlm_cli.manufacturing.provisioning.exceptions.CertificateRetrievalError
¶
Bases: ConfigurationError
Exception raised when certificate/configuration retrieval fails.
This is a specific case of ConfigurationError that occurs during certificate retrieval operations for existing devices.
Examples:
Source code in tlm_cli/manufacturing/provisioning/exceptions.py
tlm_cli.manufacturing.provisioning.exceptions.UnprovisioningError
¶
Bases: DeviceProvisioningError
Exception raised when device unprovisioning operations fail.
This is a specific case of DeviceProvisioningError that occurs during device removal from the manufacturing system.
Examples: