diff --git a/.agents/update-openapi-changelog/SKILL.md b/.agents/update-openapi-changelog/SKILL.md new file mode 100644 index 0000000..88b93d9 --- /dev/null +++ b/.agents/update-openapi-changelog/SKILL.md @@ -0,0 +1,86 @@ +--- +name: update-openapi-changelog +description: Generates accurate changelog bullets for Meraki OpenAPI spec updates by analyzing the generated code diff, then writes them into CHANGELOG.md. Use when reviewing or processing an OpenAPI update PR, when asked to fill in changelog bullets for a spec bump, or when CHANGELOG.md contains a TODO placeholder from an automated OpenAPI update. +--- + +# Update OpenAPI Changelog + +Use this skill when CHANGELOG.md has a TODO placeholder from an automated OpenAPI version bump, or when you need to write changelog bullets for a generated SDK update. + +## Workflow + +### 1. Identify versions + +```bash +# New version (already written by the update workflow) +cat .api-version + +# Old version (from the previous commit) +git show HEAD~1:.api-version 2>/dev/null || git log --oneline | head -5 +``` + +### 2. Collect the generated diff + +Limit the diff to generated output only — this keeps the context focused: + +```bash +git diff HEAD~1 -- meraki_client/ tests/generated/ docs/api_reference/ ':(exclude)meraki_client/aio/' +``` + +`meraki_client/aio/` mirrors `meraki_client/_api/` exactly, so excluding it avoids duplicate noise. + +If the diff is very large (> ~500 lines), summarize it by focusing on: + +- New/deleted files (new or removed endpoint modules) +- Added/removed function signatures +- Added/removed parameters and response fields + +### 3. Generate bullets + +Use the following prompt exactly. Fill in `old_api_version`, `new_api_version`, and `generated_diff` from the steps above. + +``` +[system] +You write concise, accurate changelog bullets for a generated Python SDK. +Never invent changes that are not supported by the provided diff context. + +[user] +We are updating Meraki OpenAPI from v{{old_api_version}} to v{{new_api_version}}. + +Generated code diff context: +{{generated_diff}} + +Draft changelog bullets for: +#### Update to Meraki API v{{new_api_version}} + +Requirements: +- Return ONLY markdown bullet lines that begin with "- ". +- Return 3-8 bullets. +- Focus on user-visible SDK changes from generated code. +- Prioritize: + - added or removed endpoints + - added or removed request parameters + - added or removed response fields + - removed modules +- Use operation IDs or snake_case names exactly as shown in the diff. +- If unsure, omit the item. +- No headings, no prose, no code fences. +``` + +### 4. Apply bullets to CHANGELOG.md + +Edit `CHANGELOG.md`. Place the bullets under `### Changed` in the `## Unreleased` section: + +```markdown +### Changed + +#### Update to Meraki API v + +- +- +``` + +## Quality bar + +- Do not describe internal codegen machinery — only user-visible SDK surface changes. +- If the diff shows no meaningful user-visible changes, write a single bullet: `- No user-visible SDK changes in this spec update.` diff --git a/.api-version b/.api-version index 65ee095..ee2f4ca 100644 --- a/.api-version +++ b/.api-version @@ -1 +1 @@ -1.67.0 +1.68.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 8101bcc..fd8d2d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -- +### Changed + +#### Update to Meraki API v1.68.0 + +- Added `connect_network_appliance_umbrella_account` and `disconnect_network_appliance_umbrella_account` endpoints to connect/disconnect a Cisco Umbrella account from a network. +- Added `get_organization_integrations_deployable` and `get_organization_integrations_deployed` endpoints to list available and active integrations for an organization. +- Added `get_organization_wireless_devices_provisioning_deployments`, `create_organization_wireless_devices_provisioning_deployment`, `update_organization_wireless_devices_provisioning_deployments`, and `delete_organization_wireless_devices_provisioning_deployment` endpoints for zero touch wireless AP provisioning deployments. +- Camera endpoints `get_device_camera_quality_and_retention`, `update_device_camera_quality_and_retention`, `get_device_camera_sense`, `update_device_camera_sense`, `get_device_camera_video_link`, `get_device_camera_wireless_profiles`, `update_device_camera_wireless_profiles`, and `update_organization_camera_onboarding_statuses` now return typed response schemas instead of `DictResponse`. +- Added `ecmpUplinkConfigs` field to appliance VPN peer responses (`get_network_appliance_vpn_bgp`, `update_network_appliance_vpn_bgp`). +- Added `vrf`, `vrfType`, and `ipVersion` fields to device multicast routing response. +- Added `model` field to network clients response; added `open-enhanced-with-radius` as a valid SSID `auth_mode` value. ## v0.10.3 diff --git a/meraki_client/__init__.py b/meraki_client/__init__.py index 7a22b7f..84254b6 100644 --- a/meraki_client/__init__.py +++ b/meraki_client/__init__.py @@ -42,7 +42,7 @@ "types", ] __version__ = "0.10.3" -__api_version__ = "v1.67.0" +__api_version__ = "v1.68.0" class MerakiClient: diff --git a/meraki_client/_api/appliance.py b/meraki_client/_api/appliance.py index 6dfabdd..834a095 100644 --- a/meraki_client/_api/appliance.py +++ b/meraki_client/_api/appliance.py @@ -13,6 +13,8 @@ from meraki_client.schemas import ( BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateItemsItem, BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateResponse, + ConnectNetworkApplianceUmbrellaAccountApi, + ConnectNetworkApplianceUmbrellaAccountResponse, CreateDeviceApplianceVmxAuthenticationTokenResponse, CreateNetworkAppliancePrefixesDelegatedStaticOrigin, CreateNetworkApplianceRfProfileFiveGhzSettings, @@ -2286,7 +2288,7 @@ def update_network_appliance_firewall_settings( def get_network_appliance_ports( self, network_id: str ) -> PaginatedResponse[GetNetworkAppliancePortsResponseItem]: - """List per-port VLAN settings for all ports of a MX. + """List per-port VLAN settings for all ports of a secure router or security appliance. [API documentation: getNetworkAppliancePorts](https://developer.cisco.com/meraki/api-v1/#!get-network-appliance-ports) @@ -2330,7 +2332,7 @@ def get_network_appliance_ports( def get_network_appliance_port( self, *, network_id: str, port_id: str ) -> GetNetworkAppliancePortResponse: - """Return per-port VLAN settings for a single MX port. + """Return per-port VLAN settings for a single secure router or security appliance port. [API documentation: getNetworkAppliancePort](https://developer.cisco.com/meraki/api-v1/#!get-network-appliance-port) @@ -2378,7 +2380,7 @@ def update_network_appliance_port( allowed_vlans: str | None = None, access_policy: str | None = None, ) -> UpdateNetworkAppliancePortResponse: - """Update the per-port VLAN settings for a single MX port. + """Update the per-port VLAN settings for a single secure router or security appliance port. [API documentation: updateNetworkAppliancePort](https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-port) @@ -5019,6 +5021,66 @@ def update_network_appliance_traffic_shaping_vpn_exclusions( response_schema=UpdateNetworkApplianceTrafficShapingVpnExclusionsResponse, ) + def connect_network_appliance_umbrella_account( + self, *, network_id: str, api: ConnectNetworkApplianceUmbrellaAccountApi + ) -> ConnectNetworkApplianceUmbrellaAccountResponse: + """Connect a Cisco Umbrella account to this network. + + [API documentation: connectNetworkApplianceUmbrellaAccount](https://developer.cisco.com/meraki/api-v1/#!connect-network-appliance-umbrella-account) + + Args: + network_id: Network ID. + api: Umbrella API credentials. + + Returns: + Successful operation. + + Example API response: + ```json + { + "umbrella": { + "organization": { + "id": "8769012" + } + } + } + ``` + + """ + network_id = urllib.parse.quote(str(network_id), safe="") + path = f"/networks/{network_id}/appliance/umbrella/account/connect" + + payload: dict[str, Any] = {} + if api is not None: + payload["api"] = api.model_dump(by_alias=True, exclude_none=True) + + return self._session.post( + scope="appliance", + operation_id="connectNetworkApplianceUmbrellaAccount", + path=path, + json=payload, + response_schema=ConnectNetworkApplianceUmbrellaAccountResponse, + ) + + def disconnect_network_appliance_umbrella_account(self, network_id: str) -> None: + """Disconnect Umbrella account from this network. + + [API documentation: disconnectNetworkApplianceUmbrellaAccount](https://developer.cisco.com/meraki/api-v1/#!disconnect-network-appliance-umbrella-account) + + Args: + network_id: Network ID. + + Returns: + Successful operation. + + """ + network_id = urllib.parse.quote(str(network_id), safe="") + path = f"/networks/{network_id}/appliance/umbrella/account/disconnect" + + return self._session.post( + scope="appliance", operation_id="disconnectNetworkApplianceUmbrellaAccount", path=path + ) + def get_network_appliance_uplinks_usage_history( self, network_id: str, @@ -8072,6 +8134,19 @@ def get_organization_appliance_vpn_third_party_vpn_peers( "multiExitDiscriminator": 1, "weight": 10 }, + "ecmpUplinkConfigs": [ + { + "id": "7890", + "wan": "WAN 1", + "privateSubnets": [ + "169.254.10.0/30" + ], + "ebgpNeighbor": { + "neighborIp": "169.254.10.2", + "sourceIp": "169.254.10.1" + } + } + ], "priorityInGroup": 1, "group": { "number": 1, @@ -8189,6 +8264,19 @@ def update_organization_appliance_vpn_third_party_vpn_peers( "multiExitDiscriminator": 1, "weight": 10 }, + "ecmpUplinkConfigs": [ + { + "id": "7890", + "wan": "WAN 1", + "privateSubnets": [ + "169.254.10.0/30" + ], + "ebgpNeighbor": { + "neighborIp": "169.254.10.2", + "sourceIp": "169.254.10.1" + } + } + ], "priorityInGroup": 1, "group": { "number": 1, diff --git a/meraki_client/_api/batch/appliance.py b/meraki_client/_api/batch/appliance.py index 1ec44d7..cef78ea 100644 --- a/meraki_client/_api/batch/appliance.py +++ b/meraki_client/_api/batch/appliance.py @@ -10,6 +10,7 @@ from meraki_client.schemas import ( BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateItemsItem, + ConnectNetworkApplianceUmbrellaAccountApi, CreateNetworkAppliancePrefixesDelegatedStaticOrigin, CreateNetworkApplianceRfProfileFiveGhzSettings, CreateNetworkApplianceRfProfilePerSsidSettings, @@ -269,7 +270,7 @@ def update_network_appliance_port( allowed_vlans: str | None = None, access_policy: str | None = None, ) -> CreateOrganizationActionBatchActionsItem: - """Update the per-port VLAN settings for a single MX port. + """Update the per-port VLAN settings for a single secure router or security appliance port. [API documentation: updateNetworkAppliancePort](https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-port) @@ -1003,6 +1004,50 @@ def update_network_appliance_traffic_shaping_vpn_exclusions( body=payload, ) + def connect_network_appliance_umbrella_account( + self, *, network_id: str, api: ConnectNetworkApplianceUmbrellaAccountApi + ) -> CreateOrganizationActionBatchActionsItem: + """Connect a Cisco Umbrella account to this network. + + [API documentation: connectNetworkApplianceUmbrellaAccount](https://developer.cisco.com/meraki/api-v1/#!connect-network-appliance-umbrella-account) + + Args: + network_id: Network ID. + api: Umbrella API credentials. + + """ + network_id = urllib.parse.quote(str(network_id), safe="") + path = f"/networks/{network_id}/appliance/umbrella/account/connect" + + payload: dict[str, Any] = {} + if api is not None: + payload["api"] = api.model_dump(by_alias=True, exclude_none=True) + + return CreateOrganizationActionBatchActionsItem( + resource=path, + operation="action", + body=payload, + ) + + def disconnect_network_appliance_umbrella_account( + self, network_id: str + ) -> CreateOrganizationActionBatchActionsItem: + """Disconnect Umbrella account from this network. + + [API documentation: disconnectNetworkApplianceUmbrellaAccount](https://developer.cisco.com/meraki/api-v1/#!disconnect-network-appliance-umbrella-account) + + Args: + network_id: Network ID. + + """ + network_id = urllib.parse.quote(str(network_id), safe="") + path = f"/networks/{network_id}/appliance/umbrella/account/disconnect" + + return CreateOrganizationActionBatchActionsItem( + resource=path, + operation="disconnect", + ) + def create_network_appliance_vlan( self, *, diff --git a/meraki_client/_api/batch/wireless.py b/meraki_client/_api/batch/wireless.py index 7450e9e..4286dac 100644 --- a/meraki_client/_api/batch/wireless.py +++ b/meraki_client/_api/batch/wireless.py @@ -20,6 +20,8 @@ CreateNetworkWirelessRfProfileTransmission, CreateNetworkWirelessRfProfileTwoFourGhzSettings, CreateOrganizationActionBatchActionsItem, + CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem, + CreateOrganizationWirelessDevicesProvisioningDeploymentMeta, CreateOrganizationWirelessLocationScanningReceiverNetwork, CreateOrganizationWirelessLocationScanningReceiverRadio, CreateOrganizationWirelessSsidsFirewallIsolationAllowlistEntryClient, @@ -89,6 +91,8 @@ UpdateNetworkWirelessZigbeeDefaults, UpdateNetworkWirelessZigbeeIotController, UpdateNetworkWirelessZigbeeLockManagement, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta, UpdateOrganizationWirelessLocationScanningReceiverRadio, UpdateOrganizationWirelessMqttSettingsBle, UpdateOrganizationWirelessMqttSettingsMqtt, @@ -1068,10 +1072,10 @@ def update_network_wireless_ssid( name: The name of the SSID. enabled: Whether or not the SSID is enabled. auth_mode: The association control method for the SSID ('open', 'open-enhanced', 'psk', - 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', - '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', - 'ipsk-with-radius', 'ipsk-without-radius', 'ipsk-with-nac' or 'ipsk- - with-radius-easy-psk'). + 'open-with-radius', 'open-enhanced-with-radius', 'open-with-nac', + '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', + '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without- + radius', 'ipsk-with-nac' or 'ipsk-with-radius-easy-psk'). enterprise_admin_access: Whether or not an SSID is accessible by 'enterprise' administrators ('access disabled' or 'access enabled'). encryption_mode: The psk encryption mode for the SSID ('wep' or 'wpa'). This param is @@ -2063,6 +2067,91 @@ def update_network_wireless_zigbee( body=payload, ) + def update_organization_wireless_devices_provisioning_deployments( + self, + *, + organization_id: str, + items: list[UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem], + meta: UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta | None = None, + ) -> CreateOrganizationActionBatchActionsItem: + """Update a zero touch deployment. + + [API documentation: updateOrganizationWirelessDevicesProvisioningDeployments](https://developer.cisco.com/meraki/api-v1/#!update-organization-wireless-devices-provisioning-deployments) + + Args: + organization_id: Organization ID. + items: List of zero touch deployments to create. + meta: Metadata relevant to the paginated dataset. + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + payload: dict[str, Any] = {} + if items is not None: + payload["items"] = [item.model_dump(by_alias=True, exclude_none=True) for item in items] + if meta is not None: + payload["meta"] = meta.model_dump(by_alias=True, exclude_none=True) + + return CreateOrganizationActionBatchActionsItem( + resource=path, + operation="update", + body=payload, + ) + + def create_organization_wireless_devices_provisioning_deployment( + self, + *, + organization_id: str, + items: list[CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem], + meta: CreateOrganizationWirelessDevicesProvisioningDeploymentMeta | None = None, + ) -> CreateOrganizationActionBatchActionsItem: + """Create a zero touch deployment for a wireless access point. + + [API documentation: createOrganizationWirelessDevicesProvisioningDeployment](https://developer.cisco.com/meraki/api-v1/#!create-organization-wireless-devices-provisioning-deployment) + + Args: + organization_id: Organization ID. + items: List of zero touch deployments to create. + meta: Metadata relevant to the paginated dataset. + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + payload: dict[str, Any] = {} + if items is not None: + payload["items"] = [item.model_dump(by_alias=True, exclude_none=True) for item in items] + if meta is not None: + payload["meta"] = meta.model_dump(by_alias=True, exclude_none=True) + + return CreateOrganizationActionBatchActionsItem( + resource=path, + operation="create", + body=payload, + ) + + def delete_organization_wireless_devices_provisioning_deployment( + self, *, organization_id: str, deployment_id: str + ) -> CreateOrganizationActionBatchActionsItem: + """Delete a zero touch deployment. + + [API documentation: deleteOrganizationWirelessDevicesProvisioningDeployment](https://developer.cisco.com/meraki/api-v1/#!delete-organization-wireless-devices-provisioning-deployment) + + Args: + organization_id: Organization ID. + deployment_id: Deployment ID. + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + deployment_id = urllib.parse.quote(str(deployment_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments/{deployment_id}" + + return CreateOrganizationActionBatchActionsItem( + resource=path, + operation="destroy", + ) + def create_organization_wireless_location_scanning_receiver( self, *, diff --git a/meraki_client/_api/camera.py b/meraki_client/_api/camera.py index eab721c..83199c7 100644 --- a/meraki_client/_api/camera.py +++ b/meraki_client/_api/camera.py @@ -22,7 +22,6 @@ CreateOrganizationCameraRoleAppliedOnNetworksItem, CreateOrganizationCameraRoleAppliedOrgWideItem, CreateOrganizationCameraRoleResponse, - DictResponse, GenerateDeviceCameraSnapshotResponse, GetDeviceCameraAnalyticsLiveResponse, GetDeviceCameraAnalyticsOverviewResponseItem, @@ -30,8 +29,12 @@ GetDeviceCameraAnalyticsZoneHistoryResponseItem, GetDeviceCameraAnalyticsZonesResponseItem, GetDeviceCameraCustomAnalyticsResponse, - GetDeviceCameraSenseObjectDetectionModelsResponse, + GetDeviceCameraQualityAndRetentionResponse, + GetDeviceCameraSenseObjectDetectionModelsResponseItem, + GetDeviceCameraSenseResponse, + GetDeviceCameraVideoLinkResponse, GetDeviceCameraVideoSettingsResponse, + GetDeviceCameraWirelessProfilesResponse, GetNetworkCameraQualityRetentionProfileResponse, GetNetworkCameraQualityRetentionProfilesResponseItem, GetNetworkCameraSchedulesResponseItem, @@ -42,22 +45,26 @@ GetOrganizationCameraCustomAnalyticsArtifactResponse, GetOrganizationCameraCustomAnalyticsArtifactsResponseItem, GetOrganizationCameraDetectionsHistoryByBoundaryByIntervalResponseItem, - GetOrganizationCameraOnboardingStatusesResponse, + GetOrganizationCameraOnboardingStatusesResponseItem, GetOrganizationCameraPermissionResponse, GetOrganizationCameraPermissionsResponseItem, GetOrganizationCameraRoleResponse, GetOrganizationCameraRolesResponseItem, UpdateDeviceCameraCustomAnalyticsParametersItem, UpdateDeviceCameraCustomAnalyticsResponse, + UpdateDeviceCameraQualityAndRetentionResponse, UpdateDeviceCameraSenseAudioDetection, + UpdateDeviceCameraSenseResponse, UpdateDeviceCameraVideoSettingsResponse, UpdateDeviceCameraWirelessProfilesIds, + UpdateDeviceCameraWirelessProfilesResponse, UpdateNetworkCameraQualityRetentionProfileResponse, UpdateNetworkCameraQualityRetentionProfileSmartRetention, UpdateNetworkCameraQualityRetentionProfileVideoSettings, UpdateNetworkCameraWirelessProfileIdentity, UpdateNetworkCameraWirelessProfileResponse, UpdateNetworkCameraWirelessProfileSsid, + UpdateOrganizationCameraOnboardingStatusesResponse, UpdateOrganizationCameraRoleAppliedOnDevicesItem, UpdateOrganizationCameraRoleAppliedOnNetworksItem, UpdateOrganizationCameraRoleAppliedOrgWideItem, @@ -495,7 +502,9 @@ def generate_device_camera_snapshot( response_schema=GenerateDeviceCameraSnapshotResponse, ) - def get_device_camera_quality_and_retention(self, serial: str) -> DictResponse: + def get_device_camera_quality_and_retention( + self, serial: str + ) -> GetDeviceCameraQualityAndRetentionResponse: """Returns quality and retention settings for the given camera. [API documentation: getDeviceCameraQualityAndRetention](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-quality-and-retention) @@ -509,13 +518,13 @@ def get_device_camera_quality_and_retention(self, serial: str) -> DictResponse: Example API response: ```json { + "profileId": "1234", "motionBasedRetentionEnabled": false, "audioRecordingEnabled": false, "restrictedBandwidthModeEnabled": false, - "profileId": "1234", "quality": "Standard", - "motionDetectorVersion": 2, - "resolution": "1280x720" + "resolution": "1280x720", + "motionDetectorVersion": 2 } ``` @@ -527,7 +536,7 @@ def get_device_camera_quality_and_retention(self, serial: str) -> DictResponse: scope="camera", operation_id="getDeviceCameraQualityAndRetention", path=path, - response_schema=DictResponse, + response_schema=GetDeviceCameraQualityAndRetentionResponse, ) def update_device_camera_quality_and_retention( @@ -542,7 +551,7 @@ def update_device_camera_quality_and_retention( resolution: UpdateDeviceCameraQualityAndRetentionResolution | None = None, motion_detector_version: UpdateDeviceCameraQualityAndRetentionMotionDetectorVersion | None = None, - ) -> DictResponse: + ) -> UpdateDeviceCameraQualityAndRetentionResponse: """Update quality and retention settings for the given camera. [API documentation: updateDeviceCameraQualityAndRetention](https://developer.cisco.com/meraki/api-v1/#!update-device-camera-quality-and-retention) @@ -574,13 +583,13 @@ def update_device_camera_quality_and_retention( Example API response: ```json { + "profileId": "1234", "motionBasedRetentionEnabled": false, "audioRecordingEnabled": false, "restrictedBandwidthModeEnabled": false, - "profileId": "1234", "quality": "Standard", - "motionDetectorVersion": 2, - "resolution": "1280x720" + "resolution": "1280x720", + "motionDetectorVersion": 2 } ``` @@ -609,10 +618,10 @@ def update_device_camera_quality_and_retention( operation_id="updateDeviceCameraQualityAndRetention", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateDeviceCameraQualityAndRetentionResponse, ) - def get_device_camera_sense(self, serial: str) -> DictResponse: + def get_device_camera_sense(self, serial: str) -> GetDeviceCameraSenseResponse: """Returns sense settings for a given camera. [API documentation: getDeviceCameraSense](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-sense) @@ -627,14 +636,15 @@ def get_device_camera_sense(self, serial: str) -> DictResponse: ```json { "senseEnabled": true, - "audioDetection": { - "enabled": false - }, "mqttBrokerId": "1234", "mqttTopics": [ "/merakimv/Q2AA-AAAA-1111/raw_detections", "/merakimv/Q2AA-AAAA-1111/light" - ] + ], + "audioDetection": { + "enabled": false + }, + "detectionModelId": "1234" } ``` @@ -646,7 +656,7 @@ def get_device_camera_sense(self, serial: str) -> DictResponse: scope="camera", operation_id="getDeviceCameraSense", path=path, - response_schema=DictResponse, + response_schema=GetDeviceCameraSenseResponse, ) def update_device_camera_sense( @@ -657,7 +667,7 @@ def update_device_camera_sense( mqtt_broker_id: str | None = None, audio_detection: UpdateDeviceCameraSenseAudioDetection | None = None, detection_model_id: str | None = None, - ) -> DictResponse: + ) -> UpdateDeviceCameraSenseResponse: """Update sense settings for the given camera. [API documentation: updateDeviceCameraSense](https://developer.cisco.com/meraki/api-v1/#!update-device-camera-sense) @@ -678,14 +688,15 @@ def update_device_camera_sense( ```json { "senseEnabled": true, - "audioDetection": { - "enabled": false - }, "mqttBrokerId": "1234", "mqttTopics": [ "/merakimv/Q2AA-AAAA-1111/raw_detections", "/merakimv/Q2AA-AAAA-1111/light" - ] + ], + "audioDetection": { + "enabled": false + }, + "detectionModelId": "1234" } ``` @@ -708,12 +719,12 @@ def update_device_camera_sense( operation_id="updateDeviceCameraSense", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateDeviceCameraSenseResponse, ) def get_device_camera_sense_object_detection_models( self, serial: str - ) -> PaginatedResponse[GetDeviceCameraSenseObjectDetectionModelsResponse]: + ) -> PaginatedResponse[GetDeviceCameraSenseObjectDetectionModelsResponseItem]: """Returns the MV Sense object detection model list for the given camera. [API documentation: getDeviceCameraSenseObjectDetectionModels](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-sense-object-detection-models) @@ -747,7 +758,7 @@ def get_device_camera_sense_object_detection_models( scope="camera", operation_id="getDeviceCameraSenseObjectDetectionModels", path=path, - item_schema=GetDeviceCameraSenseObjectDetectionModelsResponse, + item_schema=GetDeviceCameraSenseObjectDetectionModelsResponseItem, ) def get_device_camera_video_settings(self, serial: str) -> GetDeviceCameraVideoSettingsResponse: @@ -820,7 +831,7 @@ def update_device_camera_video_settings( def get_device_camera_video_link( self, serial: str, *, timestamp: str | None = None - ) -> DictResponse: + ) -> GetDeviceCameraVideoLinkResponse: """Returns video link to the specified camera. [API documentation: getDeviceCameraVideoLink](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-video-link) @@ -837,8 +848,8 @@ def get_device_camera_video_link( Example API response: ```json { - "url": "https://nxx.meraki.com/office-cameras/n/bs0a1k/manage/nodes/new_list/29048243992402?timestamp=1535732570077", - "visionUrl": "https://vision.meraki.com/n/6482158978508419/cameras/29048243992402?ts=1535732570077" + "url": "https://n1.meraki.com/office-cameras/n/sample/manage/nodes/new_list/1284392014819?timestamp=1284392014819", + "visionUrl": "https://vision.meraki.com/n/2930418/cameras/1284392014819?ts=1284392014819" } ``` @@ -855,10 +866,12 @@ def get_device_camera_video_link( operation_id="getDeviceCameraVideoLink", path=path, params=params, - response_schema=DictResponse, + response_schema=GetDeviceCameraVideoLinkResponse, ) - def get_device_camera_wireless_profiles(self, serial: str) -> DictResponse: + def get_device_camera_wireless_profiles( + self, serial: str + ) -> GetDeviceCameraWirelessProfilesResponse: """Returns wireless profile assigned to the given camera. [API documentation: getDeviceCameraWirelessProfiles](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-wireless-profiles) @@ -888,12 +901,12 @@ def get_device_camera_wireless_profiles(self, serial: str) -> DictResponse: scope="camera", operation_id="getDeviceCameraWirelessProfiles", path=path, - response_schema=DictResponse, + response_schema=GetDeviceCameraWirelessProfilesResponse, ) def update_device_camera_wireless_profiles( self, *, serial: str, ids: UpdateDeviceCameraWirelessProfilesIds - ) -> DictResponse: + ) -> UpdateDeviceCameraWirelessProfilesResponse: """Assign wireless profiles to the given camera. [API documentation: updateDeviceCameraWirelessProfiles](https://developer.cisco.com/meraki/api-v1/#!update-device-camera-wireless-profiles) @@ -929,7 +942,7 @@ def update_device_camera_wireless_profiles( operation_id="updateDeviceCameraWirelessProfiles", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateDeviceCameraWirelessProfilesResponse, ) def get_network_camera_quality_retention_profiles( @@ -1929,7 +1942,7 @@ def get_organization_camera_onboarding_statuses( *, serials: list[str] | None = None, network_ids: list[str] | None = None, - ) -> PaginatedResponse[GetOrganizationCameraOnboardingStatusesResponse]: + ) -> PaginatedResponse[GetOrganizationCameraOnboardingStatusesResponseItem]: """Fetch onboarding status of cameras. [API documentation: getOrganizationCameraOnboardingStatuses](https://developer.cisco.com/meraki/api-v1/#!get-organization-camera-onboarding-statuses) @@ -1954,9 +1967,9 @@ def get_organization_camera_onboarding_statuses( [ { "networkId": "N_12345", - "serial": "Q2AB-CDEF-GHIJ", + "serial": "Q234-ABCD-5678", "status": "pending onboarding", - "updatedAt": "2021/03/24 15:23:47.101068 -0700" + "updatedAt": "2018-02-11T00:00:00.090210Z" } ] ``` @@ -1976,7 +1989,7 @@ def get_organization_camera_onboarding_statuses( operation_id="getOrganizationCameraOnboardingStatuses", path=path, params=params, - item_schema=GetOrganizationCameraOnboardingStatusesResponse, + item_schema=GetOrganizationCameraOnboardingStatusesResponseItem, ) def update_organization_camera_onboarding_statuses( @@ -1985,7 +1998,7 @@ def update_organization_camera_onboarding_statuses( *, serial: str | None = None, wireless_credentials_sent: bool | None = None, - ) -> DictResponse: + ) -> UpdateOrganizationCameraOnboardingStatusesResponse: """Notify that credential handoff to camera has completed. [API documentation: updateOrganizationCameraOnboardingStatuses](https://developer.cisco.com/meraki/api-v1/#!update-organization-camera-onboarding-statuses) @@ -2020,7 +2033,7 @@ def update_organization_camera_onboarding_statuses( operation_id="updateOrganizationCameraOnboardingStatuses", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateOrganizationCameraOnboardingStatusesResponse, ) def get_organization_camera_permissions( diff --git a/meraki_client/_api/devices.py b/meraki_client/_api/devices.py index 45bb712..b6aa7a7 100644 --- a/meraki_client/_api/devices.py +++ b/meraki_client/_api/devices.py @@ -964,6 +964,9 @@ def get_device_live_tools_multicast_routing( { "ip": "1.2.3.4", "name": "Vlan20", + "vrf": "IPv4 default", + "vrfType": "vrf", + "ipVersion": "ipv4", "subnet": "192.168.1.0/24", "flags": [ "PIM" @@ -977,6 +980,8 @@ def get_device_live_tools_multicast_routing( { "source": "1.2.3.4", "group": "1.2.3.5", + "vrf": "IPv4 default", + "ipVersion": "ipv4", "rendezvousPoint": "10.0.0.0/24", "incomingInterfaceName": "Vlan100", "outgoingInterfaceNames": [ diff --git a/meraki_client/_api/networks.py b/meraki_client/_api/networks.py index d6fe55c..108e3f7 100644 --- a/meraki_client/_api/networks.py +++ b/meraki_client/_api/networks.py @@ -1471,6 +1471,7 @@ def get_network_client(self, *, network_id: str, client_id: str) -> GetNetworkCl "firstSeen": 1518365681, "lastSeen": 1526087474, "manufacturer": "Apple", + "model": "iPhone", "os": "iOS", "user": "milesmeraki", "vlan": "100", diff --git a/meraki_client/_api/organizations.py b/meraki_client/_api/organizations.py index 7673d7d..ea82e2a 100644 --- a/meraki_client/_api/organizations.py +++ b/meraki_client/_api/organizations.py @@ -134,6 +134,8 @@ GetOrganizationFirmwareUpgradesResponseItem, GetOrganizationFloorPlansAutoLocateDevicesResponseItem, GetOrganizationFloorPlansAutoLocateStatusesResponseItem, + GetOrganizationIntegrationsDeployableResponseItemsItem, + GetOrganizationIntegrationsDeployedResponseItemsItem, GetOrganizationIntegrationsXdrNetworksResponseItemsItem, GetOrganizationInventoryDeviceResponse, GetOrganizationInventoryDevicesEoxOverviewResponse, @@ -157,6 +159,7 @@ GetOrganizationSamlResponse, GetOrganizationSamlRoleResponse, GetOrganizationSamlRolesResponseItem, + GetOrganizationSaseNetworksEligibleResponseItemsItem, GetOrganizationSnmpResponse, GetOrganizationSplashAssetResponse, GetOrganizationSplashThemesResponseItem, @@ -4621,8 +4624,8 @@ def get_organization_configuration_changes( timespan: The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 365 days. The default is 365 days. - per_page: The number of entries per page returned. Acceptable range is 3 - 5000. Default - is 5000. + per_page: The number of entries per page returned. Acceptable range is 3 - 100000. + Default is 5000. starting_after: A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, @@ -7877,6 +7880,120 @@ def get_organization_floor_plans_auto_locate_statuses( item_schema=GetOrganizationFloorPlansAutoLocateStatusesResponseItem, ) + def get_organization_integrations_deployable( + self, organization_id: str + ) -> PaginatedResponse[GetOrganizationIntegrationsDeployableResponseItemsItem]: + """Provides a list of integrations that can be enabled for an Organization. + + [API documentation: getOrganizationIntegrationsDeployable](https://developer.cisco.com/meraki/api-v1/#!get-organization-integrations-deployable) + + Args: + organization_id: Organization ID. + + Returns: + Successful operation. + + Note: + Returns a lazy PaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + { + "items": [ + { + "type": "Catalyst SD-WAN", + "name": "Catalyst SD-WAN", + "provider": "Cisco", + "tags": [ + "SD-WAN" + ], + "shortDescription": "Connect to a Catalyst SD-WAN overlay to enable simple SD-WAN interconnects.", + "isDeployable": true, + "releaseType": "Beta", + "logoUrl": "https://example.com", + "redirectUrl": "https://example.com", + "isCiscoProduct": true + } + ], + "meta": { + "counts": { + "items": { + "total": 100, + "remaining": 10 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/integrations/deployable" + + return self._session.get_pages( + scope="organizations", + operation_id="getOrganizationIntegrationsDeployable", + path=path, + item_schema=GetOrganizationIntegrationsDeployableResponseItemsItem, + ) + + def get_organization_integrations_deployed( + self, organization_id: str + ) -> PaginatedResponse[GetOrganizationIntegrationsDeployedResponseItemsItem]: + """Provides a list of integrations enabled for an Organization. + + [API documentation: getOrganizationIntegrationsDeployed](https://developer.cisco.com/meraki/api-v1/#!get-organization-integrations-deployed) + + Args: + organization_id: Organization ID. + + Returns: + Successful operation. + + Note: + Returns a lazy PaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + { + "items": [ + { + "id": "98765", + "type": "OAuth", + "name": "OAuth Application", + "provider": "partner", + "tags": [ + "Wayfinding", + "OAuth" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 100, + "remaining": 10 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/integrations/deployed" + + return self._session.get_pages( + scope="organizations", + operation_id="getOrganizationIntegrationsDeployed", + path=path, + item_schema=GetOrganizationIntegrationsDeployedResponseItemsItem, + ) + def get_organization_integrations_xdr_networks( self, organization_id: str, @@ -11499,6 +11616,110 @@ def delete_organization_saml_role(self, *, organization_id: str, saml_role_id: s scope="organizations", operation_id="deleteOrganizationSamlRole", path=path ) + def get_organization_sase_networks_eligible( + self, + organization_id: str, + *, + per_page: int | None = None, + starting_after: str | None = None, + ending_before: str | None = None, + search: str | None = None, + total_pages: int | Literal["all"] = "all", + direction: Literal["prev", "next"] = "next", + ) -> PaginatedResponse[GetOrganizationSaseNetworksEligibleResponseItemsItem]: + """List of MX networks or templates that can be enrolled into Secure Access. + + [API documentation: getOrganizationSaseNetworksEligible](https://developer.cisco.com/meraki/api-v1/#!get-organization-sase-networks-eligible) + + Args: + organization_id: Organization ID. + per_page: The number of entries per page returned. Acceptable range is 3 - 1000. Default + is 5. + starting_after: A token used by the server to indicate the start of the page. Often this + is a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + ending_before: A token used by the server to indicate the end of the page. Often this is + a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + search: If provided, filters results by network name. + total_pages: use with per_page to get total results up to total_pages * per_page; -1 or + "all" for all pages. + direction: direction to paginate, either "next" (default) or "prev" page. + + Returns: + Successful operation. + + Note: + Returns a lazy PaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + { + "items": [ + { + "networkId": "N_123", + "type": "Meraki spoke", + "name": "London Office", + "region": { + "name": "US East" + }, + "device": { + "primary": { + "model": "MX95" + } + }, + "address": { + "street": "123 Main St" + }, + "vpn": { + "type": "hub" + }, + "routing": { + "defaultRoute": { + "enabled": true + } + } + } + ], + "meta": { + "counts": { + "items": { + "total": 1, + "remaining": 0 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/sase/networks/eligible" + + params: dict[str, Any] = {} + if per_page is not None: + params["perPage"] = per_page + if starting_after is not None: + params["startingAfter"] = starting_after + if ending_before is not None: + params["endingBefore"] = ending_before + if search is not None: + params["search"] = search + + return self._session.get_pages( + scope="organizations", + operation_id="getOrganizationSaseNetworksEligible", + path=path, + params=params, + total_pages=total_pages, + direction=direction, + item_schema=GetOrganizationSaseNetworksEligibleResponseItemsItem, + ) + def get_organization_snmp(self, organization_id: str) -> GetOrganizationSnmpResponse: """Return the SNMP settings for an organization. @@ -11694,6 +11915,7 @@ def get_organization_splash_themes( { "id": "482367494044dbbb1d2cc8579d967cef5b4ce59f", "name": "My Custom Splash Theme", + "isSystemTheme": false, "themeAssets": [ { "id": "1284392014819", @@ -11735,6 +11957,7 @@ def create_organization_splash_theme( { "id": "482367494044dbbb1d2cc8579d967cef5b4ce59f", "name": "My Custom Splash Theme", + "isSystemTheme": false, "themeAssets": [ { "id": "1284392014819", @@ -12507,6 +12730,9 @@ def get_organization_summary_top_networks_by_status( "tag1", "tag2" ], + "group": { + "id": "1284392014819" + }, "clients": { "counts": { "total": 72 diff --git a/meraki_client/_api/wireless.py b/meraki_client/_api/wireless.py index 7ca9d74..09d0945 100644 --- a/meraki_client/_api/wireless.py +++ b/meraki_client/_api/wireless.py @@ -27,6 +27,9 @@ CreateNetworkWirelessRfProfileTransmission, CreateNetworkWirelessRfProfileTwoFourGhzSettings, CreateNetworkWirelessSsidIdentityPskResponse, + CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem, + CreateOrganizationWirelessDevicesProvisioningDeploymentMeta, + CreateOrganizationWirelessDevicesProvisioningDeploymentResponse, CreateOrganizationWirelessDevicesRadsecCertificatesAuthorityResponse, CreateOrganizationWirelessLocationScanningReceiverNetwork, CreateOrganizationWirelessLocationScanningReceiverRadio, @@ -93,6 +96,7 @@ GetOrganizationWirelessDevicesPacketLossByDeviceResponseItem, GetOrganizationWirelessDevicesPacketLossByNetworkResponseItem, GetOrganizationWirelessDevicesPowerModeHistoryResponseItemsItem, + GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsDeltasResponseItemsItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsResponseItemsItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponseItem, @@ -202,6 +206,9 @@ UpdateNetworkWirelessZigbeeIotController, UpdateNetworkWirelessZigbeeLockManagement, UpdateNetworkWirelessZigbeeResponse, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse, UpdateOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponse, UpdateOrganizationWirelessLocationScanningReceiverRadio, UpdateOrganizationWirelessLocationScanningReceiverResponse, @@ -253,6 +260,9 @@ GetNetworkWirelessLatencyStatsSsid, GetNetworkWirelessSignalQualityHistoryBand, GetNetworkWirelessUsageHistoryBand, + GetOrganizationWirelessDevicesProvisioningDeploymentsDeploymentType, + GetOrganizationWirelessDevicesProvisioningDeploymentsSortBy, + GetOrganizationWirelessDevicesProvisioningDeploymentsSortOrder, GetOrganizationWirelessRadioRrmByNetworkSortOrder, GetOrganizationWirelessRfProfilesAssignmentsByDeviceProductTypes, GetOrganizationWirelessSsidsFirewallIsolationAllowlistEntriesSsids, @@ -3675,7 +3685,7 @@ def update_network_wireless_radio_rrm( }, "ai": { "enabled": true, - "lastEnabledAt": "2026-01-04T09:07:45Z" + "lastEnabledAt": "2026-02-04T09:08:48Z" } } ``` @@ -5749,10 +5759,10 @@ def update_network_wireless_ssid( name: The name of the SSID. enabled: Whether or not the SSID is enabled. auth_mode: The association control method for the SSID ('open', 'open-enhanced', 'psk', - 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', - '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', - 'ipsk-with-radius', 'ipsk-without-radius', 'ipsk-with-nac' or 'ipsk- - with-radius-easy-psk'). + 'open-with-radius', 'open-enhanced-with-radius', 'open-with-nac', + '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', + '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without- + radius', 'ipsk-with-nac' or 'ipsk-with-radius-easy-psk'). enterprise_admin_access: Whether or not an SSID is accessible by 'enterprise' administrators ('access disabled' or 'access enabled'). encryption_mode: The psk encryption mode for the SSID ('wep' or 'wpa'). This param is @@ -9231,6 +9241,377 @@ def get_organization_wireless_devices_power_mode_history( item_schema=GetOrganizationWirelessDevicesPowerModeHistoryResponseItemsItem, ) + def get_organization_wireless_devices_provisioning_deployments( + self, + organization_id: str, + *, + per_page: int | None = None, + starting_after: str | None = None, + ending_before: str | None = None, + search: str | None = None, + sort_by: GetOrganizationWirelessDevicesProvisioningDeploymentsSortBy | None = None, + sort_order: GetOrganizationWirelessDevicesProvisioningDeploymentsSortOrder | None = None, + deployment_type: GetOrganizationWirelessDevicesProvisioningDeploymentsDeploymentType + | None = None, + total_pages: int | Literal["all"] = "all", + direction: Literal["prev", "next"] = "next", + ) -> PaginatedResponse[GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem]: + """List the zero touch deployments for wireless access points in an organization. + + [API documentation: getOrganizationWirelessDevicesProvisioningDeployments](https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-provisioning-deployments) + + Args: + organization_id: Organization ID. + per_page: The number of entries per page returned. Acceptable range is 3 - 1000. Default + is 20. + starting_after: A token used by the server to indicate the start of the page. Often this + is a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + ending_before: A token used by the server to indicate the end of the page. Often this is + a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + search: Filter by MAC address, serial number, new device name, old device name, or + model. + sort_by: Field used to sort results. Default is 'status'. + sort_order: Sort order. Default is 'asc'. + deployment_type: Filter deployments by type. + total_pages: use with per_page to get total results up to total_pages * per_page; -1 or + "all" for all pages. + direction: direction to paginate, either "next" (default) or "prev" page. + + Returns: + Successful operation. + + Note: + Returns a lazy PaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + [ + { + "items": [ + { + "deploymentId": "1284392014819", + "devices": { + "old": { + "serial": "Q234-ABCD-5678", + "afterAction": "unclaim", + "name": "My AP", + "model": "MR34", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + }, + "new": { + "serial": "Q234-ABCD-5678", + "name": "My AP", + "model": "CW9166I", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + } + }, + "status": "ready", + "type": "replace", + "network": { + "id": "N_24329156", + "name": "Main Office" + }, + "createdAt": "2018-02-11T00:00:00.090210Z", + "requestedAt": "2018-02-11T00:00:00.090210Z", + "lastUpdatedAt": "2018-02-11T00:00:00.090210Z", + "completedAt": "2018-02-11T00:00:00.090210Z", + "errors": [ + "error message1", + "error message2" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 20, + "remaining": 0 + } + } + } + } + ] + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + params: dict[str, Any] = {} + if per_page is not None: + params["perPage"] = per_page + if starting_after is not None: + params["startingAfter"] = starting_after + if ending_before is not None: + params["endingBefore"] = ending_before + if search is not None: + params["search"] = search + if sort_by is not None: + params["sortBy"] = sort_by + if sort_order is not None: + params["sortOrder"] = sort_order + if deployment_type is not None: + params["deploymentType"] = deployment_type + + return self._session.get_pages( + scope="wireless", + operation_id="getOrganizationWirelessDevicesProvisioningDeployments", + path=path, + params=params, + total_pages=total_pages, + direction=direction, + item_schema=GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem, + ) + + def update_organization_wireless_devices_provisioning_deployments( + self, + *, + organization_id: str, + items: list[UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem], + meta: UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta | None = None, + ) -> UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse: + """Update a zero touch deployment. + + [API documentation: updateOrganizationWirelessDevicesProvisioningDeployments](https://developer.cisco.com/meraki/api-v1/#!update-organization-wireless-devices-provisioning-deployments) + + Args: + organization_id: Organization ID. + items: List of zero touch deployments to create. + meta: Metadata relevant to the paginated dataset. + + Returns: + Successful operation. + + Example API response: + ```json + { + "items": [ + { + "deploymentId": "1284392014819", + "devices": { + "old": { + "serial": "Q234-ABCD-5678", + "afterAction": "unclaim", + "name": "My AP", + "model": "MR34", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + }, + "new": { + "serial": "Q234-ABCD-5678", + "name": "My AP", + "model": "CW9166I", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + } + }, + "status": "ready", + "type": "replace", + "network": { + "id": "N_24329156", + "name": "Main Office" + }, + "createdAt": "2018-02-11T00:00:00.090210Z", + "requestedAt": "2018-02-11T00:00:00.090210Z", + "lastUpdatedAt": "2018-02-11T00:00:00.090210Z", + "completedAt": "2018-02-11T00:00:00.090210Z", + "errors": [ + "error message1", + "error message2" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 20, + "remaining": 0 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + payload: dict[str, Any] = {} + if items is not None: + payload["items"] = [item.model_dump(by_alias=True, exclude_none=True) for item in items] + if meta is not None: + payload["meta"] = meta.model_dump(by_alias=True, exclude_none=True) + + return self._session.put( + scope="wireless", + operation_id="updateOrganizationWirelessDevicesProvisioningDeployments", + path=path, + json=payload, + response_schema=UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse, + ) + + def create_organization_wireless_devices_provisioning_deployment( + self, + *, + organization_id: str, + items: list[CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem], + meta: CreateOrganizationWirelessDevicesProvisioningDeploymentMeta | None = None, + ) -> CreateOrganizationWirelessDevicesProvisioningDeploymentResponse: + """Create a zero touch deployment for a wireless access point. + + [API documentation: createOrganizationWirelessDevicesProvisioningDeployment](https://developer.cisco.com/meraki/api-v1/#!create-organization-wireless-devices-provisioning-deployment) + + Args: + organization_id: Organization ID. + items: List of zero touch deployments to create. + meta: Metadata relevant to the paginated dataset. + + Returns: + Successful operation. + + Example API response: + ```json + { + "items": [ + { + "deploymentId": "1284392014819", + "devices": { + "old": { + "serial": "Q234-ABCD-5678", + "afterAction": "unclaim", + "name": "My AP", + "model": "MR34", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + }, + "new": { + "serial": "Q234-ABCD-5678", + "name": "My AP", + "model": "CW9166I", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + } + }, + "status": "ready", + "type": "replace", + "network": { + "id": "N_24329156", + "name": "Main Office" + }, + "createdAt": "2018-02-11T00:00:00.090210Z", + "requestedAt": "2018-02-11T00:00:00.090210Z", + "lastUpdatedAt": "2018-02-11T00:00:00.090210Z", + "completedAt": "2018-02-11T00:00:00.090210Z", + "errors": [ + "error message1", + "error message2" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 20, + "remaining": 0 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + payload: dict[str, Any] = {} + if items is not None: + payload["items"] = [item.model_dump(by_alias=True, exclude_none=True) for item in items] + if meta is not None: + payload["meta"] = meta.model_dump(by_alias=True, exclude_none=True) + + return self._session.post( + scope="wireless", + operation_id="createOrganizationWirelessDevicesProvisioningDeployment", + path=path, + json=payload, + response_schema=CreateOrganizationWirelessDevicesProvisioningDeploymentResponse, + ) + + def delete_organization_wireless_devices_provisioning_deployment( + self, *, organization_id: str, deployment_id: str + ) -> None: + """Delete a zero touch deployment. + + [API documentation: deleteOrganizationWirelessDevicesProvisioningDeployment](https://developer.cisco.com/meraki/api-v1/#!delete-organization-wireless-devices-provisioning-deployment) + + Args: + organization_id: Organization ID. + deployment_id: Deployment ID. + + Returns: + Successful operation. + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + deployment_id = urllib.parse.quote(str(deployment_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments/{deployment_id}" + + return self._session.delete( + scope="wireless", + operation_id="deleteOrganizationWirelessDevicesProvisioningDeployment", + path=path, + ) + def get_organization_wireless_devices_radsec_certificates_authorities( self, organization_id: str, *, certificate_authority_ids: list[str] | None = None ) -> PaginatedResponse[GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponseItem]: @@ -10423,7 +10804,7 @@ def get_organization_wireless_radio_rrm_by_network( }, "ai": { "enabled": true, - "lastEnabledAt": "2026-01-04T09:07:45Z" + "lastEnabledAt": "2026-02-04T09:08:48Z" } } ], diff --git a/meraki_client/aio/__init__.py b/meraki_client/aio/__init__.py index 4f36268..8b3257d 100644 --- a/meraki_client/aio/__init__.py +++ b/meraki_client/aio/__init__.py @@ -44,7 +44,7 @@ "types", ] __version__ = "0.10.3" -__api_version__ = "v1.67.0" +__api_version__ = "v1.68.0" class AsyncMerakiClient: diff --git a/meraki_client/aio/_api/appliance.py b/meraki_client/aio/_api/appliance.py index 1e0a538..d955167 100644 --- a/meraki_client/aio/_api/appliance.py +++ b/meraki_client/aio/_api/appliance.py @@ -13,6 +13,8 @@ from meraki_client.schemas import ( BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateItemsItem, BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateResponse, + ConnectNetworkApplianceUmbrellaAccountApi, + ConnectNetworkApplianceUmbrellaAccountResponse, CreateDeviceApplianceVmxAuthenticationTokenResponse, CreateNetworkAppliancePrefixesDelegatedStaticOrigin, CreateNetworkApplianceRfProfileFiveGhzSettings, @@ -2296,7 +2298,7 @@ async def update_network_appliance_firewall_settings( def get_network_appliance_ports( self, network_id: str ) -> AsyncPaginatedResponse[GetNetworkAppliancePortsResponseItem]: - """List per-port VLAN settings for all ports of a MX. + """List per-port VLAN settings for all ports of a secure router or security appliance. [API documentation: getNetworkAppliancePorts](https://developer.cisco.com/meraki/api-v1/#!get-network-appliance-ports) @@ -2340,7 +2342,7 @@ def get_network_appliance_ports( async def get_network_appliance_port( self, *, network_id: str, port_id: str ) -> GetNetworkAppliancePortResponse: - """Return per-port VLAN settings for a single MX port. + """Return per-port VLAN settings for a single secure router or security appliance port. [API documentation: getNetworkAppliancePort](https://developer.cisco.com/meraki/api-v1/#!get-network-appliance-port) @@ -2388,7 +2390,7 @@ async def update_network_appliance_port( allowed_vlans: str | None = None, access_policy: str | None = None, ) -> UpdateNetworkAppliancePortResponse: - """Update the per-port VLAN settings for a single MX port. + """Update the per-port VLAN settings for a single secure router or security appliance port. [API documentation: updateNetworkAppliancePort](https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-port) @@ -5033,6 +5035,66 @@ async def update_network_appliance_traffic_shaping_vpn_exclusions( response_schema=UpdateNetworkApplianceTrafficShapingVpnExclusionsResponse, ) + async def connect_network_appliance_umbrella_account( + self, *, network_id: str, api: ConnectNetworkApplianceUmbrellaAccountApi + ) -> ConnectNetworkApplianceUmbrellaAccountResponse: + """Connect a Cisco Umbrella account to this network. + + [API documentation: connectNetworkApplianceUmbrellaAccount](https://developer.cisco.com/meraki/api-v1/#!connect-network-appliance-umbrella-account) + + Args: + network_id: Network ID. + api: Umbrella API credentials. + + Returns: + Successful operation. + + Example API response: + ```json + { + "umbrella": { + "organization": { + "id": "8769012" + } + } + } + ``` + + """ + network_id = urllib.parse.quote(str(network_id), safe="") + path = f"/networks/{network_id}/appliance/umbrella/account/connect" + + payload: dict[str, Any] = {} + if api is not None: + payload["api"] = api.model_dump(by_alias=True, exclude_none=True) + + return await self._session.post( + scope="appliance", + operation_id="connectNetworkApplianceUmbrellaAccount", + path=path, + json=payload, + response_schema=ConnectNetworkApplianceUmbrellaAccountResponse, + ) + + async def disconnect_network_appliance_umbrella_account(self, network_id: str) -> None: + """Disconnect Umbrella account from this network. + + [API documentation: disconnectNetworkApplianceUmbrellaAccount](https://developer.cisco.com/meraki/api-v1/#!disconnect-network-appliance-umbrella-account) + + Args: + network_id: Network ID. + + Returns: + Successful operation. + + """ + network_id = urllib.parse.quote(str(network_id), safe="") + path = f"/networks/{network_id}/appliance/umbrella/account/disconnect" + + return await self._session.post( + scope="appliance", operation_id="disconnectNetworkApplianceUmbrellaAccount", path=path + ) + def get_network_appliance_uplinks_usage_history( self, network_id: str, @@ -8096,6 +8158,19 @@ async def get_organization_appliance_vpn_third_party_vpn_peers( "multiExitDiscriminator": 1, "weight": 10 }, + "ecmpUplinkConfigs": [ + { + "id": "7890", + "wan": "WAN 1", + "privateSubnets": [ + "169.254.10.0/30" + ], + "ebgpNeighbor": { + "neighborIp": "169.254.10.2", + "sourceIp": "169.254.10.1" + } + } + ], "priorityInGroup": 1, "group": { "number": 1, @@ -8213,6 +8288,19 @@ async def update_organization_appliance_vpn_third_party_vpn_peers( "multiExitDiscriminator": 1, "weight": 10 }, + "ecmpUplinkConfigs": [ + { + "id": "7890", + "wan": "WAN 1", + "privateSubnets": [ + "169.254.10.0/30" + ], + "ebgpNeighbor": { + "neighborIp": "169.254.10.2", + "sourceIp": "169.254.10.1" + } + } + ], "priorityInGroup": 1, "group": { "number": 1, diff --git a/meraki_client/aio/_api/camera.py b/meraki_client/aio/_api/camera.py index 77f5256..fa583bd 100644 --- a/meraki_client/aio/_api/camera.py +++ b/meraki_client/aio/_api/camera.py @@ -22,7 +22,6 @@ CreateOrganizationCameraRoleAppliedOnNetworksItem, CreateOrganizationCameraRoleAppliedOrgWideItem, CreateOrganizationCameraRoleResponse, - DictResponse, GenerateDeviceCameraSnapshotResponse, GetDeviceCameraAnalyticsLiveResponse, GetDeviceCameraAnalyticsOverviewResponseItem, @@ -30,8 +29,12 @@ GetDeviceCameraAnalyticsZoneHistoryResponseItem, GetDeviceCameraAnalyticsZonesResponseItem, GetDeviceCameraCustomAnalyticsResponse, - GetDeviceCameraSenseObjectDetectionModelsResponse, + GetDeviceCameraQualityAndRetentionResponse, + GetDeviceCameraSenseObjectDetectionModelsResponseItem, + GetDeviceCameraSenseResponse, + GetDeviceCameraVideoLinkResponse, GetDeviceCameraVideoSettingsResponse, + GetDeviceCameraWirelessProfilesResponse, GetNetworkCameraQualityRetentionProfileResponse, GetNetworkCameraQualityRetentionProfilesResponseItem, GetNetworkCameraSchedulesResponseItem, @@ -42,22 +45,26 @@ GetOrganizationCameraCustomAnalyticsArtifactResponse, GetOrganizationCameraCustomAnalyticsArtifactsResponseItem, GetOrganizationCameraDetectionsHistoryByBoundaryByIntervalResponseItem, - GetOrganizationCameraOnboardingStatusesResponse, + GetOrganizationCameraOnboardingStatusesResponseItem, GetOrganizationCameraPermissionResponse, GetOrganizationCameraPermissionsResponseItem, GetOrganizationCameraRoleResponse, GetOrganizationCameraRolesResponseItem, UpdateDeviceCameraCustomAnalyticsParametersItem, UpdateDeviceCameraCustomAnalyticsResponse, + UpdateDeviceCameraQualityAndRetentionResponse, UpdateDeviceCameraSenseAudioDetection, + UpdateDeviceCameraSenseResponse, UpdateDeviceCameraVideoSettingsResponse, UpdateDeviceCameraWirelessProfilesIds, + UpdateDeviceCameraWirelessProfilesResponse, UpdateNetworkCameraQualityRetentionProfileResponse, UpdateNetworkCameraQualityRetentionProfileSmartRetention, UpdateNetworkCameraQualityRetentionProfileVideoSettings, UpdateNetworkCameraWirelessProfileIdentity, UpdateNetworkCameraWirelessProfileResponse, UpdateNetworkCameraWirelessProfileSsid, + UpdateOrganizationCameraOnboardingStatusesResponse, UpdateOrganizationCameraRoleAppliedOnDevicesItem, UpdateOrganizationCameraRoleAppliedOnNetworksItem, UpdateOrganizationCameraRoleAppliedOrgWideItem, @@ -497,7 +504,9 @@ async def generate_device_camera_snapshot( response_schema=GenerateDeviceCameraSnapshotResponse, ) - async def get_device_camera_quality_and_retention(self, serial: str) -> DictResponse: + async def get_device_camera_quality_and_retention( + self, serial: str + ) -> GetDeviceCameraQualityAndRetentionResponse: """Returns quality and retention settings for the given camera. [API documentation: getDeviceCameraQualityAndRetention](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-quality-and-retention) @@ -511,13 +520,13 @@ async def get_device_camera_quality_and_retention(self, serial: str) -> DictResp Example API response: ```json { + "profileId": "1234", "motionBasedRetentionEnabled": false, "audioRecordingEnabled": false, "restrictedBandwidthModeEnabled": false, - "profileId": "1234", "quality": "Standard", - "motionDetectorVersion": 2, - "resolution": "1280x720" + "resolution": "1280x720", + "motionDetectorVersion": 2 } ``` @@ -529,7 +538,7 @@ async def get_device_camera_quality_and_retention(self, serial: str) -> DictResp scope="camera", operation_id="getDeviceCameraQualityAndRetention", path=path, - response_schema=DictResponse, + response_schema=GetDeviceCameraQualityAndRetentionResponse, ) async def update_device_camera_quality_and_retention( @@ -544,7 +553,7 @@ async def update_device_camera_quality_and_retention( resolution: UpdateDeviceCameraQualityAndRetentionResolution | None = None, motion_detector_version: UpdateDeviceCameraQualityAndRetentionMotionDetectorVersion | None = None, - ) -> DictResponse: + ) -> UpdateDeviceCameraQualityAndRetentionResponse: """Update quality and retention settings for the given camera. [API documentation: updateDeviceCameraQualityAndRetention](https://developer.cisco.com/meraki/api-v1/#!update-device-camera-quality-and-retention) @@ -576,13 +585,13 @@ async def update_device_camera_quality_and_retention( Example API response: ```json { + "profileId": "1234", "motionBasedRetentionEnabled": false, "audioRecordingEnabled": false, "restrictedBandwidthModeEnabled": false, - "profileId": "1234", "quality": "Standard", - "motionDetectorVersion": 2, - "resolution": "1280x720" + "resolution": "1280x720", + "motionDetectorVersion": 2 } ``` @@ -611,10 +620,10 @@ async def update_device_camera_quality_and_retention( operation_id="updateDeviceCameraQualityAndRetention", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateDeviceCameraQualityAndRetentionResponse, ) - async def get_device_camera_sense(self, serial: str) -> DictResponse: + async def get_device_camera_sense(self, serial: str) -> GetDeviceCameraSenseResponse: """Returns sense settings for a given camera. [API documentation: getDeviceCameraSense](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-sense) @@ -629,14 +638,15 @@ async def get_device_camera_sense(self, serial: str) -> DictResponse: ```json { "senseEnabled": true, - "audioDetection": { - "enabled": false - }, "mqttBrokerId": "1234", "mqttTopics": [ "/merakimv/Q2AA-AAAA-1111/raw_detections", "/merakimv/Q2AA-AAAA-1111/light" - ] + ], + "audioDetection": { + "enabled": false + }, + "detectionModelId": "1234" } ``` @@ -648,7 +658,7 @@ async def get_device_camera_sense(self, serial: str) -> DictResponse: scope="camera", operation_id="getDeviceCameraSense", path=path, - response_schema=DictResponse, + response_schema=GetDeviceCameraSenseResponse, ) async def update_device_camera_sense( @@ -659,7 +669,7 @@ async def update_device_camera_sense( mqtt_broker_id: str | None = None, audio_detection: UpdateDeviceCameraSenseAudioDetection | None = None, detection_model_id: str | None = None, - ) -> DictResponse: + ) -> UpdateDeviceCameraSenseResponse: """Update sense settings for the given camera. [API documentation: updateDeviceCameraSense](https://developer.cisco.com/meraki/api-v1/#!update-device-camera-sense) @@ -680,14 +690,15 @@ async def update_device_camera_sense( ```json { "senseEnabled": true, - "audioDetection": { - "enabled": false - }, "mqttBrokerId": "1234", "mqttTopics": [ "/merakimv/Q2AA-AAAA-1111/raw_detections", "/merakimv/Q2AA-AAAA-1111/light" - ] + ], + "audioDetection": { + "enabled": false + }, + "detectionModelId": "1234" } ``` @@ -710,12 +721,12 @@ async def update_device_camera_sense( operation_id="updateDeviceCameraSense", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateDeviceCameraSenseResponse, ) def get_device_camera_sense_object_detection_models( self, serial: str - ) -> AsyncPaginatedResponse[GetDeviceCameraSenseObjectDetectionModelsResponse]: + ) -> AsyncPaginatedResponse[GetDeviceCameraSenseObjectDetectionModelsResponseItem]: """Returns the MV Sense object detection model list for the given camera. [API documentation: getDeviceCameraSenseObjectDetectionModels](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-sense-object-detection-models) @@ -749,7 +760,7 @@ def get_device_camera_sense_object_detection_models( scope="camera", operation_id="getDeviceCameraSenseObjectDetectionModels", path=path, - item_schema=GetDeviceCameraSenseObjectDetectionModelsResponse, + item_schema=GetDeviceCameraSenseObjectDetectionModelsResponseItem, ) async def get_device_camera_video_settings( @@ -824,7 +835,7 @@ async def update_device_camera_video_settings( async def get_device_camera_video_link( self, serial: str, *, timestamp: str | None = None - ) -> DictResponse: + ) -> GetDeviceCameraVideoLinkResponse: """Returns video link to the specified camera. [API documentation: getDeviceCameraVideoLink](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-video-link) @@ -841,8 +852,8 @@ async def get_device_camera_video_link( Example API response: ```json { - "url": "https://nxx.meraki.com/office-cameras/n/bs0a1k/manage/nodes/new_list/29048243992402?timestamp=1535732570077", - "visionUrl": "https://vision.meraki.com/n/6482158978508419/cameras/29048243992402?ts=1535732570077" + "url": "https://n1.meraki.com/office-cameras/n/sample/manage/nodes/new_list/1284392014819?timestamp=1284392014819", + "visionUrl": "https://vision.meraki.com/n/2930418/cameras/1284392014819?ts=1284392014819" } ``` @@ -859,10 +870,12 @@ async def get_device_camera_video_link( operation_id="getDeviceCameraVideoLink", path=path, params=params, - response_schema=DictResponse, + response_schema=GetDeviceCameraVideoLinkResponse, ) - async def get_device_camera_wireless_profiles(self, serial: str) -> DictResponse: + async def get_device_camera_wireless_profiles( + self, serial: str + ) -> GetDeviceCameraWirelessProfilesResponse: """Returns wireless profile assigned to the given camera. [API documentation: getDeviceCameraWirelessProfiles](https://developer.cisco.com/meraki/api-v1/#!get-device-camera-wireless-profiles) @@ -892,12 +905,12 @@ async def get_device_camera_wireless_profiles(self, serial: str) -> DictResponse scope="camera", operation_id="getDeviceCameraWirelessProfiles", path=path, - response_schema=DictResponse, + response_schema=GetDeviceCameraWirelessProfilesResponse, ) async def update_device_camera_wireless_profiles( self, *, serial: str, ids: UpdateDeviceCameraWirelessProfilesIds - ) -> DictResponse: + ) -> UpdateDeviceCameraWirelessProfilesResponse: """Assign wireless profiles to the given camera. [API documentation: updateDeviceCameraWirelessProfiles](https://developer.cisco.com/meraki/api-v1/#!update-device-camera-wireless-profiles) @@ -933,7 +946,7 @@ async def update_device_camera_wireless_profiles( operation_id="updateDeviceCameraWirelessProfiles", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateDeviceCameraWirelessProfilesResponse, ) def get_network_camera_quality_retention_profiles( @@ -1935,7 +1948,7 @@ def get_organization_camera_onboarding_statuses( *, serials: list[str] | None = None, network_ids: list[str] | None = None, - ) -> AsyncPaginatedResponse[GetOrganizationCameraOnboardingStatusesResponse]: + ) -> AsyncPaginatedResponse[GetOrganizationCameraOnboardingStatusesResponseItem]: """Fetch onboarding status of cameras. [API documentation: getOrganizationCameraOnboardingStatuses](https://developer.cisco.com/meraki/api-v1/#!get-organization-camera-onboarding-statuses) @@ -1960,9 +1973,9 @@ def get_organization_camera_onboarding_statuses( [ { "networkId": "N_12345", - "serial": "Q2AB-CDEF-GHIJ", + "serial": "Q234-ABCD-5678", "status": "pending onboarding", - "updatedAt": "2021/03/24 15:23:47.101068 -0700" + "updatedAt": "2018-02-11T00:00:00.090210Z" } ] ``` @@ -1982,7 +1995,7 @@ def get_organization_camera_onboarding_statuses( operation_id="getOrganizationCameraOnboardingStatuses", path=path, params=params, - item_schema=GetOrganizationCameraOnboardingStatusesResponse, + item_schema=GetOrganizationCameraOnboardingStatusesResponseItem, ) async def update_organization_camera_onboarding_statuses( @@ -1991,7 +2004,7 @@ async def update_organization_camera_onboarding_statuses( *, serial: str | None = None, wireless_credentials_sent: bool | None = None, - ) -> DictResponse: + ) -> UpdateOrganizationCameraOnboardingStatusesResponse: """Notify that credential handoff to camera has completed. [API documentation: updateOrganizationCameraOnboardingStatuses](https://developer.cisco.com/meraki/api-v1/#!update-organization-camera-onboarding-statuses) @@ -2026,7 +2039,7 @@ async def update_organization_camera_onboarding_statuses( operation_id="updateOrganizationCameraOnboardingStatuses", path=path, json=payload, - response_schema=DictResponse, + response_schema=UpdateOrganizationCameraOnboardingStatusesResponse, ) def get_organization_camera_permissions( diff --git a/meraki_client/aio/_api/devices.py b/meraki_client/aio/_api/devices.py index 5c8f85d..8744a9e 100644 --- a/meraki_client/aio/_api/devices.py +++ b/meraki_client/aio/_api/devices.py @@ -964,6 +964,9 @@ async def get_device_live_tools_multicast_routing( { "ip": "1.2.3.4", "name": "Vlan20", + "vrf": "IPv4 default", + "vrfType": "vrf", + "ipVersion": "ipv4", "subnet": "192.168.1.0/24", "flags": [ "PIM" @@ -977,6 +980,8 @@ async def get_device_live_tools_multicast_routing( { "source": "1.2.3.4", "group": "1.2.3.5", + "vrf": "IPv4 default", + "ipVersion": "ipv4", "rendezvousPoint": "10.0.0.0/24", "incomingInterfaceName": "Vlan100", "outgoingInterfaceNames": [ diff --git a/meraki_client/aio/_api/networks.py b/meraki_client/aio/_api/networks.py index df6e555..258f7b4 100644 --- a/meraki_client/aio/_api/networks.py +++ b/meraki_client/aio/_api/networks.py @@ -1475,6 +1475,7 @@ async def get_network_client( "firstSeen": 1518365681, "lastSeen": 1526087474, "manufacturer": "Apple", + "model": "iPhone", "os": "iOS", "user": "milesmeraki", "vlan": "100", diff --git a/meraki_client/aio/_api/organizations.py b/meraki_client/aio/_api/organizations.py index 214d6f6..c5dbada 100644 --- a/meraki_client/aio/_api/organizations.py +++ b/meraki_client/aio/_api/organizations.py @@ -134,6 +134,8 @@ GetOrganizationFirmwareUpgradesResponseItem, GetOrganizationFloorPlansAutoLocateDevicesResponseItem, GetOrganizationFloorPlansAutoLocateStatusesResponseItem, + GetOrganizationIntegrationsDeployableResponseItemsItem, + GetOrganizationIntegrationsDeployedResponseItemsItem, GetOrganizationIntegrationsXdrNetworksResponseItemsItem, GetOrganizationInventoryDeviceResponse, GetOrganizationInventoryDevicesEoxOverviewResponse, @@ -157,6 +159,7 @@ GetOrganizationSamlResponse, GetOrganizationSamlRoleResponse, GetOrganizationSamlRolesResponseItem, + GetOrganizationSaseNetworksEligibleResponseItemsItem, GetOrganizationSnmpResponse, GetOrganizationSplashAssetResponse, GetOrganizationSplashThemesResponseItem, @@ -4631,8 +4634,8 @@ def get_organization_configuration_changes( timespan: The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 365 days. The default is 365 days. - per_page: The number of entries per page returned. Acceptable range is 3 - 5000. Default - is 5000. + per_page: The number of entries per page returned. Acceptable range is 3 - 100000. + Default is 5000. starting_after: A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, @@ -7887,6 +7890,120 @@ def get_organization_floor_plans_auto_locate_statuses( item_schema=GetOrganizationFloorPlansAutoLocateStatusesResponseItem, ) + def get_organization_integrations_deployable( + self, organization_id: str + ) -> AsyncPaginatedResponse[GetOrganizationIntegrationsDeployableResponseItemsItem]: + """Provides a list of integrations that can be enabled for an Organization. + + [API documentation: getOrganizationIntegrationsDeployable](https://developer.cisco.com/meraki/api-v1/#!get-organization-integrations-deployable) + + Args: + organization_id: Organization ID. + + Returns: + Successful operation. + + Note: + Returns a lazy AsyncPaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + { + "items": [ + { + "type": "Catalyst SD-WAN", + "name": "Catalyst SD-WAN", + "provider": "Cisco", + "tags": [ + "SD-WAN" + ], + "shortDescription": "Connect to a Catalyst SD-WAN overlay to enable simple SD-WAN interconnects.", + "isDeployable": true, + "releaseType": "Beta", + "logoUrl": "https://example.com", + "redirectUrl": "https://example.com", + "isCiscoProduct": true + } + ], + "meta": { + "counts": { + "items": { + "total": 100, + "remaining": 10 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/integrations/deployable" + + return self._session.get_pages( + scope="organizations", + operation_id="getOrganizationIntegrationsDeployable", + path=path, + item_schema=GetOrganizationIntegrationsDeployableResponseItemsItem, + ) + + def get_organization_integrations_deployed( + self, organization_id: str + ) -> AsyncPaginatedResponse[GetOrganizationIntegrationsDeployedResponseItemsItem]: + """Provides a list of integrations enabled for an Organization. + + [API documentation: getOrganizationIntegrationsDeployed](https://developer.cisco.com/meraki/api-v1/#!get-organization-integrations-deployed) + + Args: + organization_id: Organization ID. + + Returns: + Successful operation. + + Note: + Returns a lazy AsyncPaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + { + "items": [ + { + "id": "98765", + "type": "OAuth", + "name": "OAuth Application", + "provider": "partner", + "tags": [ + "Wayfinding", + "OAuth" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 100, + "remaining": 10 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/integrations/deployed" + + return self._session.get_pages( + scope="organizations", + operation_id="getOrganizationIntegrationsDeployed", + path=path, + item_schema=GetOrganizationIntegrationsDeployedResponseItemsItem, + ) + def get_organization_integrations_xdr_networks( self, organization_id: str, @@ -11515,6 +11632,110 @@ async def delete_organization_saml_role( scope="organizations", operation_id="deleteOrganizationSamlRole", path=path ) + def get_organization_sase_networks_eligible( + self, + organization_id: str, + *, + per_page: int | None = None, + starting_after: str | None = None, + ending_before: str | None = None, + search: str | None = None, + total_pages: int | Literal["all"] = "all", + direction: Literal["prev", "next"] = "next", + ) -> AsyncPaginatedResponse[GetOrganizationSaseNetworksEligibleResponseItemsItem]: + """List of MX networks or templates that can be enrolled into Secure Access. + + [API documentation: getOrganizationSaseNetworksEligible](https://developer.cisco.com/meraki/api-v1/#!get-organization-sase-networks-eligible) + + Args: + organization_id: Organization ID. + per_page: The number of entries per page returned. Acceptable range is 3 - 1000. Default + is 5. + starting_after: A token used by the server to indicate the start of the page. Often this + is a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + ending_before: A token used by the server to indicate the end of the page. Often this is + a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + search: If provided, filters results by network name. + total_pages: use with per_page to get total results up to total_pages * per_page; -1 or + "all" for all pages. + direction: direction to paginate, either "next" (default) or "prev" page. + + Returns: + Successful operation. + + Note: + Returns a lazy AsyncPaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + { + "items": [ + { + "networkId": "N_123", + "type": "Meraki spoke", + "name": "London Office", + "region": { + "name": "US East" + }, + "device": { + "primary": { + "model": "MX95" + } + }, + "address": { + "street": "123 Main St" + }, + "vpn": { + "type": "hub" + }, + "routing": { + "defaultRoute": { + "enabled": true + } + } + } + ], + "meta": { + "counts": { + "items": { + "total": 1, + "remaining": 0 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/sase/networks/eligible" + + params: dict[str, Any] = {} + if per_page is not None: + params["perPage"] = per_page + if starting_after is not None: + params["startingAfter"] = starting_after + if ending_before is not None: + params["endingBefore"] = ending_before + if search is not None: + params["search"] = search + + return self._session.get_pages( + scope="organizations", + operation_id="getOrganizationSaseNetworksEligible", + path=path, + params=params, + total_pages=total_pages, + direction=direction, + item_schema=GetOrganizationSaseNetworksEligibleResponseItemsItem, + ) + async def get_organization_snmp(self, organization_id: str) -> GetOrganizationSnmpResponse: """Return the SNMP settings for an organization. @@ -11710,6 +11931,7 @@ def get_organization_splash_themes( { "id": "482367494044dbbb1d2cc8579d967cef5b4ce59f", "name": "My Custom Splash Theme", + "isSystemTheme": false, "themeAssets": [ { "id": "1284392014819", @@ -11751,6 +11973,7 @@ async def create_organization_splash_theme( { "id": "482367494044dbbb1d2cc8579d967cef5b4ce59f", "name": "My Custom Splash Theme", + "isSystemTheme": false, "themeAssets": [ { "id": "1284392014819", @@ -12523,6 +12746,9 @@ def get_organization_summary_top_networks_by_status( "tag1", "tag2" ], + "group": { + "id": "1284392014819" + }, "clients": { "counts": { "total": 72 diff --git a/meraki_client/aio/_api/wireless.py b/meraki_client/aio/_api/wireless.py index 1a7705b..4a1faf0 100644 --- a/meraki_client/aio/_api/wireless.py +++ b/meraki_client/aio/_api/wireless.py @@ -27,6 +27,9 @@ CreateNetworkWirelessRfProfileTransmission, CreateNetworkWirelessRfProfileTwoFourGhzSettings, CreateNetworkWirelessSsidIdentityPskResponse, + CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem, + CreateOrganizationWirelessDevicesProvisioningDeploymentMeta, + CreateOrganizationWirelessDevicesProvisioningDeploymentResponse, CreateOrganizationWirelessDevicesRadsecCertificatesAuthorityResponse, CreateOrganizationWirelessLocationScanningReceiverNetwork, CreateOrganizationWirelessLocationScanningReceiverRadio, @@ -93,6 +96,7 @@ GetOrganizationWirelessDevicesPacketLossByDeviceResponseItem, GetOrganizationWirelessDevicesPacketLossByNetworkResponseItem, GetOrganizationWirelessDevicesPowerModeHistoryResponseItemsItem, + GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsDeltasResponseItemsItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsResponseItemsItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponseItem, @@ -202,6 +206,9 @@ UpdateNetworkWirelessZigbeeIotController, UpdateNetworkWirelessZigbeeLockManagement, UpdateNetworkWirelessZigbeeResponse, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse, UpdateOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponse, UpdateOrganizationWirelessLocationScanningReceiverRadio, UpdateOrganizationWirelessLocationScanningReceiverResponse, @@ -253,6 +260,9 @@ GetNetworkWirelessLatencyStatsSsid, GetNetworkWirelessSignalQualityHistoryBand, GetNetworkWirelessUsageHistoryBand, + GetOrganizationWirelessDevicesProvisioningDeploymentsDeploymentType, + GetOrganizationWirelessDevicesProvisioningDeploymentsSortBy, + GetOrganizationWirelessDevicesProvisioningDeploymentsSortOrder, GetOrganizationWirelessRadioRrmByNetworkSortOrder, GetOrganizationWirelessRfProfilesAssignmentsByDeviceProductTypes, GetOrganizationWirelessSsidsFirewallIsolationAllowlistEntriesSsids, @@ -3683,7 +3693,7 @@ async def update_network_wireless_radio_rrm( }, "ai": { "enabled": true, - "lastEnabledAt": "2026-01-04T09:07:45Z" + "lastEnabledAt": "2026-02-04T09:08:48Z" } } ``` @@ -5761,10 +5771,10 @@ async def update_network_wireless_ssid( name: The name of the SSID. enabled: Whether or not the SSID is enabled. auth_mode: The association control method for the SSID ('open', 'open-enhanced', 'psk', - 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', - '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', - 'ipsk-with-radius', 'ipsk-without-radius', 'ipsk-with-nac' or 'ipsk- - with-radius-easy-psk'). + 'open-with-radius', 'open-enhanced-with-radius', 'open-with-nac', + '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', + '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without- + radius', 'ipsk-with-nac' or 'ipsk-with-radius-easy-psk'). enterprise_admin_access: Whether or not an SSID is accessible by 'enterprise' administrators ('access disabled' or 'access enabled'). encryption_mode: The psk encryption mode for the SSID ('wep' or 'wpa'). This param is @@ -9249,6 +9259,377 @@ def get_organization_wireless_devices_power_mode_history( item_schema=GetOrganizationWirelessDevicesPowerModeHistoryResponseItemsItem, ) + def get_organization_wireless_devices_provisioning_deployments( + self, + organization_id: str, + *, + per_page: int | None = None, + starting_after: str | None = None, + ending_before: str | None = None, + search: str | None = None, + sort_by: GetOrganizationWirelessDevicesProvisioningDeploymentsSortBy | None = None, + sort_order: GetOrganizationWirelessDevicesProvisioningDeploymentsSortOrder | None = None, + deployment_type: GetOrganizationWirelessDevicesProvisioningDeploymentsDeploymentType + | None = None, + total_pages: int | Literal["all"] = "all", + direction: Literal["prev", "next"] = "next", + ) -> AsyncPaginatedResponse[GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem]: + """List the zero touch deployments for wireless access points in an organization. + + [API documentation: getOrganizationWirelessDevicesProvisioningDeployments](https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-provisioning-deployments) + + Args: + organization_id: Organization ID. + per_page: The number of entries per page returned. Acceptable range is 3 - 1000. Default + is 20. + starting_after: A token used by the server to indicate the start of the page. Often this + is a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + ending_before: A token used by the server to indicate the end of the page. Often this is + a timestamp or an ID but it is not limited to those. This parameter + should not be defined by client applications. The link for the first, + last, prev, or next page in the HTTP Link header should define it. + search: Filter by MAC address, serial number, new device name, old device name, or + model. + sort_by: Field used to sort results. Default is 'status'. + sort_order: Sort order. Default is 'asc'. + deployment_type: Filter deployments by type. + total_pages: use with per_page to get total results up to total_pages * per_page; -1 or + "all" for all pages. + direction: direction to paginate, either "next" (default) or "prev" page. + + Returns: + Successful operation. + + Note: + Returns a lazy AsyncPaginatedResponse + that can be iterated or collected with `.collect()`. + Page metadata is available on `.meta` and `.meta_pages`. + + Example API response: + ```json + [ + { + "items": [ + { + "deploymentId": "1284392014819", + "devices": { + "old": { + "serial": "Q234-ABCD-5678", + "afterAction": "unclaim", + "name": "My AP", + "model": "MR34", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + }, + "new": { + "serial": "Q234-ABCD-5678", + "name": "My AP", + "model": "CW9166I", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + } + }, + "status": "ready", + "type": "replace", + "network": { + "id": "N_24329156", + "name": "Main Office" + }, + "createdAt": "2018-02-11T00:00:00.090210Z", + "requestedAt": "2018-02-11T00:00:00.090210Z", + "lastUpdatedAt": "2018-02-11T00:00:00.090210Z", + "completedAt": "2018-02-11T00:00:00.090210Z", + "errors": [ + "error message1", + "error message2" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 20, + "remaining": 0 + } + } + } + } + ] + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + params: dict[str, Any] = {} + if per_page is not None: + params["perPage"] = per_page + if starting_after is not None: + params["startingAfter"] = starting_after + if ending_before is not None: + params["endingBefore"] = ending_before + if search is not None: + params["search"] = search + if sort_by is not None: + params["sortBy"] = sort_by + if sort_order is not None: + params["sortOrder"] = sort_order + if deployment_type is not None: + params["deploymentType"] = deployment_type + + return self._session.get_pages( + scope="wireless", + operation_id="getOrganizationWirelessDevicesProvisioningDeployments", + path=path, + params=params, + total_pages=total_pages, + direction=direction, + item_schema=GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem, + ) + + async def update_organization_wireless_devices_provisioning_deployments( + self, + *, + organization_id: str, + items: list[UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem], + meta: UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta | None = None, + ) -> UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse: + """Update a zero touch deployment. + + [API documentation: updateOrganizationWirelessDevicesProvisioningDeployments](https://developer.cisco.com/meraki/api-v1/#!update-organization-wireless-devices-provisioning-deployments) + + Args: + organization_id: Organization ID. + items: List of zero touch deployments to create. + meta: Metadata relevant to the paginated dataset. + + Returns: + Successful operation. + + Example API response: + ```json + { + "items": [ + { + "deploymentId": "1284392014819", + "devices": { + "old": { + "serial": "Q234-ABCD-5678", + "afterAction": "unclaim", + "name": "My AP", + "model": "MR34", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + }, + "new": { + "serial": "Q234-ABCD-5678", + "name": "My AP", + "model": "CW9166I", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + } + }, + "status": "ready", + "type": "replace", + "network": { + "id": "N_24329156", + "name": "Main Office" + }, + "createdAt": "2018-02-11T00:00:00.090210Z", + "requestedAt": "2018-02-11T00:00:00.090210Z", + "lastUpdatedAt": "2018-02-11T00:00:00.090210Z", + "completedAt": "2018-02-11T00:00:00.090210Z", + "errors": [ + "error message1", + "error message2" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 20, + "remaining": 0 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + payload: dict[str, Any] = {} + if items is not None: + payload["items"] = [item.model_dump(by_alias=True, exclude_none=True) for item in items] + if meta is not None: + payload["meta"] = meta.model_dump(by_alias=True, exclude_none=True) + + return await self._session.put( + scope="wireless", + operation_id="updateOrganizationWirelessDevicesProvisioningDeployments", + path=path, + json=payload, + response_schema=UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse, + ) + + async def create_organization_wireless_devices_provisioning_deployment( + self, + *, + organization_id: str, + items: list[CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem], + meta: CreateOrganizationWirelessDevicesProvisioningDeploymentMeta | None = None, + ) -> CreateOrganizationWirelessDevicesProvisioningDeploymentResponse: + """Create a zero touch deployment for a wireless access point. + + [API documentation: createOrganizationWirelessDevicesProvisioningDeployment](https://developer.cisco.com/meraki/api-v1/#!create-organization-wireless-devices-provisioning-deployment) + + Args: + organization_id: Organization ID. + items: List of zero touch deployments to create. + meta: Metadata relevant to the paginated dataset. + + Returns: + Successful operation. + + Example API response: + ```json + { + "items": [ + { + "deploymentId": "1284392014819", + "devices": { + "old": { + "serial": "Q234-ABCD-5678", + "afterAction": "unclaim", + "name": "My AP", + "model": "MR34", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + }, + "new": { + "serial": "Q234-ABCD-5678", + "name": "My AP", + "model": "CW9166I", + "mac": "00:11:22:33:44:55", + "tags": [ + "tag1", + "tag2" + ], + "rfProfile": { + "id": "1284392014819", + "name": "RF Profile Name" + } + } + }, + "status": "ready", + "type": "replace", + "network": { + "id": "N_24329156", + "name": "Main Office" + }, + "createdAt": "2018-02-11T00:00:00.090210Z", + "requestedAt": "2018-02-11T00:00:00.090210Z", + "lastUpdatedAt": "2018-02-11T00:00:00.090210Z", + "completedAt": "2018-02-11T00:00:00.090210Z", + "errors": [ + "error message1", + "error message2" + ] + } + ], + "meta": { + "counts": { + "items": { + "total": 20, + "remaining": 0 + } + } + } + } + ``` + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments" + + payload: dict[str, Any] = {} + if items is not None: + payload["items"] = [item.model_dump(by_alias=True, exclude_none=True) for item in items] + if meta is not None: + payload["meta"] = meta.model_dump(by_alias=True, exclude_none=True) + + return await self._session.post( + scope="wireless", + operation_id="createOrganizationWirelessDevicesProvisioningDeployment", + path=path, + json=payload, + response_schema=CreateOrganizationWirelessDevicesProvisioningDeploymentResponse, + ) + + async def delete_organization_wireless_devices_provisioning_deployment( + self, *, organization_id: str, deployment_id: str + ) -> None: + """Delete a zero touch deployment. + + [API documentation: deleteOrganizationWirelessDevicesProvisioningDeployment](https://developer.cisco.com/meraki/api-v1/#!delete-organization-wireless-devices-provisioning-deployment) + + Args: + organization_id: Organization ID. + deployment_id: Deployment ID. + + Returns: + Successful operation. + + """ + organization_id = urllib.parse.quote(str(organization_id), safe="") + deployment_id = urllib.parse.quote(str(deployment_id), safe="") + path = f"/organizations/{organization_id}/wireless/devices/provisioning/deployments/{deployment_id}" + + return await self._session.delete( + scope="wireless", + operation_id="deleteOrganizationWirelessDevicesProvisioningDeployment", + path=path, + ) + def get_organization_wireless_devices_radsec_certificates_authorities( self, organization_id: str, *, certificate_authority_ids: list[str] | None = None ) -> AsyncPaginatedResponse[ @@ -10445,7 +10826,7 @@ def get_organization_wireless_radio_rrm_by_network( }, "ai": { "enabled": true, - "lastEnabledAt": "2026-01-04T09:07:45Z" + "lastEnabledAt": "2026-02-04T09:08:48Z" } } ], diff --git a/meraki_client/schemas/__init__.py b/meraki_client/schemas/__init__.py index 7e54cbb..72d958c 100644 --- a/meraki_client/schemas/__init__.py +++ b/meraki_client/schemas/__init__.py @@ -31,6 +31,7 @@ ApplianceDestination2, ApplianceDestination3, ApplianceDhcpOptionsItem, + ApplianceEbgpNeighbor, ApplianceExportedSubnetsItem, ApplianceFailover, ApplianceFailoverAndFailbackImmediate, @@ -50,11 +51,11 @@ ApplianceNameservers, ApplianceNeighborsAuthentication, ApplianceNeighborsIpv6, - ApplianceNetwork, ApplianceOrigin, ApplianceOrigin2, ApplianceOrigin3, AppliancePeersEbgpNeighbor, + AppliancePeersEcmpUplinkConfigsItem, AppliancePeersGroup, AppliancePeersIpsecPolicies, AppliancePeersNetwork, @@ -74,6 +75,7 @@ ApplianceTrafficFiltersItem2, ApplianceTrafficFiltersItem3, ApplianceTrafficFiltersItem4, + ApplianceUmbrellaOrganization, ApplianceUplinksItem, ApplianceUplinksItem2, ApplianceUsageSummary, @@ -87,6 +89,9 @@ BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateItemsItem, BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateResponse, BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateResponseItemsItem, + ConnectNetworkApplianceUmbrellaAccountApi, + ConnectNetworkApplianceUmbrellaAccountResponse, + ConnectNetworkApplianceUmbrellaAccountResponseUmbrella, CreateDeviceApplianceVmxAuthenticationTokenResponse, CreateNetworkAppliancePrefixesDelegatedStaticOrigin, CreateNetworkApplianceRfProfileFiveGhzSettings, @@ -320,7 +325,6 @@ CameraIdentity, CameraRegionOfInterest, CameraResults, - CameraSmartRetention, CameraSsid, CameraStatus, CameraVerticesItem, @@ -357,8 +361,15 @@ GetDeviceCameraAnalyticsZonesResponseItem, GetDeviceCameraCustomAnalyticsResponse, GetDeviceCameraCustomAnalyticsResponseParametersItem, + GetDeviceCameraQualityAndRetentionResponse, GetDeviceCameraSenseObjectDetectionModelsResponse, + GetDeviceCameraSenseObjectDetectionModelsResponseItem, + GetDeviceCameraSenseResponse, + GetDeviceCameraSenseResponseAudioDetection, + GetDeviceCameraVideoLinkResponse, GetDeviceCameraVideoSettingsResponse, + GetDeviceCameraWirelessProfilesResponse, + GetDeviceCameraWirelessProfilesResponseIds, GetNetworkCameraQualityRetentionProfileResponse, GetNetworkCameraQualityRetentionProfilesResponse, GetNetworkCameraQualityRetentionProfilesResponseItem, @@ -377,6 +388,7 @@ GetOrganizationCameraDetectionsHistoryByBoundaryByIntervalResponse, GetOrganizationCameraDetectionsHistoryByBoundaryByIntervalResponseItem, GetOrganizationCameraOnboardingStatusesResponse, + GetOrganizationCameraOnboardingStatusesResponseItem, GetOrganizationCameraPermissionResponse, GetOrganizationCameraPermissionsResponse, GetOrganizationCameraPermissionsResponseItem, @@ -385,15 +397,19 @@ GetOrganizationCameraRolesResponseItem, UpdateDeviceCameraCustomAnalyticsParametersItem, UpdateDeviceCameraCustomAnalyticsResponse, + UpdateDeviceCameraQualityAndRetentionResponse, UpdateDeviceCameraSenseAudioDetection, + UpdateDeviceCameraSenseResponse, UpdateDeviceCameraVideoSettingsResponse, UpdateDeviceCameraWirelessProfilesIds, + UpdateDeviceCameraWirelessProfilesResponse, UpdateNetworkCameraQualityRetentionProfileResponse, UpdateNetworkCameraQualityRetentionProfileSmartRetention, UpdateNetworkCameraQualityRetentionProfileVideoSettings, UpdateNetworkCameraWirelessProfileIdentity, UpdateNetworkCameraWirelessProfileResponse, UpdateNetworkCameraWirelessProfileSsid, + UpdateOrganizationCameraOnboardingStatusesResponse, UpdateOrganizationCameraRoleAppliedOnDevicesItem, UpdateOrganizationCameraRoleAppliedOnNetworksItem, UpdateOrganizationCameraRoleAppliedOrgWideItem, @@ -1109,6 +1125,8 @@ GetOrganizationFloorPlansAutoLocateDevicesResponseItem, GetOrganizationFloorPlansAutoLocateStatusesResponse, GetOrganizationFloorPlansAutoLocateStatusesResponseItem, + GetOrganizationIntegrationsDeployableResponseItemsItem, + GetOrganizationIntegrationsDeployedResponseItemsItem, GetOrganizationIntegrationsXdrNetworksResponseItemsItem, GetOrganizationInventoryDeviceResponse, GetOrganizationInventoryDevicesEoxOverviewResponse, @@ -1148,6 +1166,7 @@ GetOrganizationSamlRoleResponse, GetOrganizationSamlRolesResponse, GetOrganizationSamlRolesResponseItem, + GetOrganizationSaseNetworksEligibleResponseItemsItem, GetOrganizationSnmpResponse, GetOrganizationSplashAssetResponse, GetOrganizationSplashThemesResponse, @@ -1187,6 +1206,7 @@ MoveOrganizationLicensesSeatsResponse, OrganizationsAccessList, OrganizationsActionsItem, + OrganizationsAddress, OrganizationsAddressesItem, OrganizationsAdminSettings, OrganizationsAlertCondition, @@ -1226,6 +1246,7 @@ OrganizationsDevice2, OrganizationsDevice3, OrganizationsDevice4, + OrganizationsDevice5, OrganizationsDevices, OrganizationsDevicesItem, OrganizationsDevicesItem2, @@ -1263,6 +1284,7 @@ OrganizationsPolicyObjectsItem, OrganizationsPowerSuppliesItem, OrganizationsPreview, + OrganizationsPrimary, OrganizationsPublic, OrganizationsRanging, OrganizationsRecipients, @@ -1272,6 +1294,7 @@ OrganizationsResult, OrganizationsRoaming, OrganizationsRootCertificate, + OrganizationsRouting, OrganizationsRulesItem, OrganizationsSchedule, OrganizationsScope, @@ -1314,6 +1337,7 @@ OrganizationsUsed2, OrganizationsUser, OrganizationsUtilization, + OrganizationsVpn, PreviewOrganizationInventoryOrdersResponse, PreviewOrganizationInventoryOrdersResponseShipping, ReleaseFromOrganizationInventoryResponse, @@ -1803,6 +1827,9 @@ CreateNetworkWirelessRfProfileTransmission, CreateNetworkWirelessRfProfileTwoFourGhzSettings, CreateNetworkWirelessSsidIdentityPskResponse, + CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem, + CreateOrganizationWirelessDevicesProvisioningDeploymentMeta, + CreateOrganizationWirelessDevicesProvisioningDeploymentResponse, CreateOrganizationWirelessDevicesRadsecCertificatesAuthorityResponse, CreateOrganizationWirelessLocationScanningReceiverNetwork, CreateOrganizationWirelessLocationScanningReceiverRadio, @@ -1923,6 +1950,8 @@ GetOrganizationWirelessDevicesPacketLossByNetworkResponse, GetOrganizationWirelessDevicesPacketLossByNetworkResponseItem, GetOrganizationWirelessDevicesPowerModeHistoryResponseItemsItem, + GetOrganizationWirelessDevicesProvisioningDeploymentsResponse, + GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsDeltasResponseItemsItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsResponseItemsItem, GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponse, @@ -2059,6 +2088,10 @@ UpdateNetworkWirelessZigbeeResponseDefaults, UpdateNetworkWirelessZigbeeResponseIotController, UpdateNetworkWirelessZigbeeResponseLockManagement, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItemDevices, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta, + UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse, UpdateOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponse, UpdateOrganizationWirelessLocationScanningReceiverRadio, UpdateOrganizationWirelessLocationScanningReceiverResponse, @@ -2096,9 +2129,11 @@ WirelessClientRootCaCertificate, WirelessCounts, WirelessCounts2, + WirelessCounts3, WirelessDetailsItem, WirelessDetectedByItem, WirelessDevice, + WirelessDevices, WirelessDoorLocks, WirelessDoorLocksGateway, WirelessDoorLocksNetwork, @@ -2108,14 +2143,20 @@ WirelessGateway, WirelessGuestVlan, WirelessHysteresis, + WirelessItems, + WirelessItemsItem, WirelessLatencyBinsByCategory, WirelessLatestMeshPerformance, WirelessLinkNegotiation, + WirelessMeta, WirelessMqtt, WirelessNaiRealmsMethodsItem, WirelessNamedVlansPoolDhcpMonitoring, WirelessNetwork, WirelessNetwork2, + WirelessNew, + WirelessNew2, + WirelessOld, WirelessOpenRoaming, WirelessPerSsidSettings0, WirelessPlansBandwidthLimits, @@ -2218,6 +2259,7 @@ "ApplianceDestination2", "ApplianceDestination3", "ApplianceDhcpOptionsItem", + "ApplianceEbgpNeighbor", "ApplianceExportedSubnetsItem", "ApplianceFailover", "ApplianceFailoverAndFailbackImmediate", @@ -2237,11 +2279,11 @@ "ApplianceNameservers", "ApplianceNeighborsAuthentication", "ApplianceNeighborsIpv6", - "ApplianceNetwork", "ApplianceOrigin", "ApplianceOrigin2", "ApplianceOrigin3", "AppliancePeersEbgpNeighbor", + "AppliancePeersEcmpUplinkConfigsItem", "AppliancePeersGroup", "AppliancePeersIpsecPolicies", "AppliancePeersNetwork", @@ -2261,6 +2303,7 @@ "ApplianceTrafficFiltersItem2", "ApplianceTrafficFiltersItem3", "ApplianceTrafficFiltersItem4", + "ApplianceUmbrellaOrganization", "ApplianceUplinksItem", "ApplianceUplinksItem2", "ApplianceUsageSummary", @@ -2299,7 +2342,6 @@ "CameraIdentity", "CameraRegionOfInterest", "CameraResults", - "CameraSmartRetention", "CameraSsid", "CameraStatus", "CameraVerticesItem", @@ -2344,6 +2386,9 @@ "CloneOrganizationResponse", "CloneOrganizationSwitchDevicesResponse", "CombineOrganizationNetworksResponse", + "ConnectNetworkApplianceUmbrellaAccountApi", + "ConnectNetworkApplianceUmbrellaAccountResponse", + "ConnectNetworkApplianceUmbrellaAccountResponseUmbrella", "CreateDeviceApplianceVmxAuthenticationTokenResponse", "CreateDeviceLiveToolsArpTableCallback", "CreateDeviceLiveToolsArpTableCallbackHttpServer", @@ -2595,6 +2640,9 @@ "CreateOrganizationSmAdminsRoleResponse", "CreateOrganizationSplashThemeAssetResponse", "CreateOrganizationSplashThemeResponse", + "CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem", + "CreateOrganizationWirelessDevicesProvisioningDeploymentMeta", + "CreateOrganizationWirelessDevicesProvisioningDeploymentResponse", "CreateOrganizationWirelessDevicesRadsecCertificatesAuthorityResponse", "CreateOrganizationWirelessLocationScanningReceiverNetwork", "CreateOrganizationWirelessLocationScanningReceiverRadio", @@ -2658,8 +2706,15 @@ "GetDeviceCameraAnalyticsZonesResponseItem", "GetDeviceCameraCustomAnalyticsResponse", "GetDeviceCameraCustomAnalyticsResponseParametersItem", + "GetDeviceCameraQualityAndRetentionResponse", "GetDeviceCameraSenseObjectDetectionModelsResponse", + "GetDeviceCameraSenseObjectDetectionModelsResponseItem", + "GetDeviceCameraSenseResponse", + "GetDeviceCameraSenseResponseAudioDetection", + "GetDeviceCameraVideoLinkResponse", "GetDeviceCameraVideoSettingsResponse", + "GetDeviceCameraWirelessProfilesResponse", + "GetDeviceCameraWirelessProfilesResponseIds", "GetDeviceCellularGatewayLanResponse", "GetDeviceCellularGatewayLanResponseFixedIpAssignmentsItem", "GetDeviceCellularGatewayLanResponseReservedIpRangesItem", @@ -3170,6 +3225,7 @@ "GetOrganizationCameraDetectionsHistoryByBoundaryByIntervalResponse", "GetOrganizationCameraDetectionsHistoryByBoundaryByIntervalResponseItem", "GetOrganizationCameraOnboardingStatusesResponse", + "GetOrganizationCameraOnboardingStatusesResponseItem", "GetOrganizationCameraPermissionResponse", "GetOrganizationCameraPermissionsResponse", "GetOrganizationCameraPermissionsResponseItem", @@ -3245,6 +3301,8 @@ "GetOrganizationInsightMonitoredMediaServerResponse", "GetOrganizationInsightMonitoredMediaServersResponse", "GetOrganizationInsightMonitoredMediaServersResponseItem", + "GetOrganizationIntegrationsDeployableResponseItemsItem", + "GetOrganizationIntegrationsDeployedResponseItemsItem", "GetOrganizationIntegrationsXdrNetworksResponseItemsItem", "GetOrganizationInventoryDeviceResponse", "GetOrganizationInventoryDevicesEoxOverviewResponse", @@ -3286,6 +3344,7 @@ "GetOrganizationSamlRoleResponse", "GetOrganizationSamlRolesResponse", "GetOrganizationSamlRolesResponseItem", + "GetOrganizationSaseNetworksEligibleResponseItemsItem", "GetOrganizationSensorGatewaysConnectionsLatestResponseItemsItem", "GetOrganizationSensorReadingsHistoryResponse", "GetOrganizationSensorReadingsHistoryResponseItem", @@ -3379,6 +3438,8 @@ "GetOrganizationWirelessDevicesPacketLossByNetworkResponse", "GetOrganizationWirelessDevicesPacketLossByNetworkResponseItem", "GetOrganizationWirelessDevicesPowerModeHistoryResponseItemsItem", + "GetOrganizationWirelessDevicesProvisioningDeploymentsResponse", + "GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem", "GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsDeltasResponseItemsItem", "GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsResponseItemsItem", "GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponse", @@ -3515,6 +3576,7 @@ "NetworksWifi0Item", "OrganizationsAccessList", "OrganizationsActionsItem", + "OrganizationsAddress", "OrganizationsAddressesItem", "OrganizationsAdminSettings", "OrganizationsAlertCondition", @@ -3554,6 +3616,7 @@ "OrganizationsDevice2", "OrganizationsDevice3", "OrganizationsDevice4", + "OrganizationsDevice5", "OrganizationsDevices", "OrganizationsDevicesItem", "OrganizationsDevicesItem2", @@ -3591,6 +3654,7 @@ "OrganizationsPolicyObjectsItem", "OrganizationsPowerSuppliesItem", "OrganizationsPreview", + "OrganizationsPrimary", "OrganizationsPublic", "OrganizationsRanging", "OrganizationsRecipients", @@ -3600,6 +3664,7 @@ "OrganizationsResult", "OrganizationsRoaming", "OrganizationsRootCertificate", + "OrganizationsRouting", "OrganizationsRulesItem", "OrganizationsSchedule", "OrganizationsScope", @@ -3642,6 +3707,7 @@ "OrganizationsUsed2", "OrganizationsUser", "OrganizationsUtilization", + "OrganizationsVpn", "PreviewOrganizationInventoryOrdersResponse", "PreviewOrganizationInventoryOrdersResponseShipping", "ProvisionNetworkClientsClientsItem", @@ -3797,9 +3863,12 @@ "UpdateDeviceApplianceUplinksSettingsResponse", "UpdateDeviceCameraCustomAnalyticsParametersItem", "UpdateDeviceCameraCustomAnalyticsResponse", + "UpdateDeviceCameraQualityAndRetentionResponse", "UpdateDeviceCameraSenseAudioDetection", + "UpdateDeviceCameraSenseResponse", "UpdateDeviceCameraVideoSettingsResponse", "UpdateDeviceCameraWirelessProfilesIds", + "UpdateDeviceCameraWirelessProfilesResponse", "UpdateDeviceCellularGatewayLanFixedIpAssignmentsItem", "UpdateDeviceCellularGatewayLanReservedIpRangesItem", "UpdateDeviceCellularGatewayLanResponse", @@ -4200,6 +4269,7 @@ "UpdateOrganizationBrandingPolicyCustomLogo", "UpdateOrganizationBrandingPolicyHelpSettings", "UpdateOrganizationBrandingPolicyResponse", + "UpdateOrganizationCameraOnboardingStatusesResponse", "UpdateOrganizationCameraRoleAppliedOnDevicesItem", "UpdateOrganizationCameraRoleAppliedOnNetworksItem", "UpdateOrganizationCameraRoleAppliedOrgWideItem", @@ -4237,6 +4307,10 @@ "UpdateOrganizationSmSentryPoliciesAssignmentsResponse", "UpdateOrganizationSmSentryPoliciesAssignmentsResponseItemsItem", "UpdateOrganizationSnmpResponse", + "UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem", + "UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItemDevices", + "UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta", + "UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse", "UpdateOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponse", "UpdateOrganizationWirelessLocationScanningReceiverRadio", "UpdateOrganizationWirelessLocationScanningReceiverResponse", @@ -4315,9 +4389,11 @@ "WirelessControllerVrf", "WirelessCounts", "WirelessCounts2", + "WirelessCounts3", "WirelessDetailsItem", "WirelessDetectedByItem", "WirelessDevice", + "WirelessDevices", "WirelessDoorLocks", "WirelessDoorLocksGateway", "WirelessDoorLocksNetwork", @@ -4327,14 +4403,20 @@ "WirelessGateway", "WirelessGuestVlan", "WirelessHysteresis", + "WirelessItems", + "WirelessItemsItem", "WirelessLatencyBinsByCategory", "WirelessLatestMeshPerformance", "WirelessLinkNegotiation", + "WirelessMeta", "WirelessMqtt", "WirelessNaiRealmsMethodsItem", "WirelessNamedVlansPoolDhcpMonitoring", "WirelessNetwork", "WirelessNetwork2", + "WirelessNew", + "WirelessNew2", + "WirelessOld", "WirelessOpenRoaming", "WirelessPerSsidSettings0", "WirelessPlansBandwidthLimits", diff --git a/meraki_client/schemas/_appliance.py b/meraki_client/schemas/_appliance.py index 6234d2f..840d4e8 100644 --- a/meraki_client/schemas/_appliance.py +++ b/meraki_client/schemas/_appliance.py @@ -167,6 +167,17 @@ class ApplianceDhcpOptionsItem(_BaseSchema): value: str +class ApplianceEbgpNeighbor(_BaseSchema): + """[optional] The eBGP neighbor configuration associated with this ECMP uplink configuration.""" + + neighbor_ip: str | None = Field( + default=None, validation_alias="neighborIp", serialization_alias="neighborIp" + ) + source_ip: str | None = Field( + default=None, validation_alias="sourceIp", serialization_alias="sourceIp" + ) + + class ApplianceExportedSubnetsItem(_BaseSchema): """Schema for ApplianceExportedSubnetsItem.""" @@ -395,12 +406,6 @@ class ApplianceNeighborsIpv6(_BaseSchema): address: str | None = None -class ApplianceNetwork(_BaseSchema): - """The network attached to the profile.""" - - id: str | None = None - - class ApplianceOrigin(_BaseSchema): """WAN1/WAN2/Independent prefix.""" @@ -459,6 +464,21 @@ class AppliancePeersEbgpNeighbor(_BaseSchema): weight: int | None = None +class AppliancePeersEcmpUplinkConfigsItem(_BaseSchema): + """Schema for AppliancePeersEcmpUplinkConfigsItem.""" + + id: str | None = None + wan: str | None = None + private_subnets: list[str] = Field( + default_factory=list, + validation_alias="privateSubnets", + serialization_alias="privateSubnets", + ) + ebgp_neighbor: ApplianceEbgpNeighbor | None = Field( + default=None, validation_alias="ebgpNeighbor", serialization_alias="ebgpNeighbor" + ) + + class AppliancePeersGroup(_BaseSchema): """[optional] Contains the mapping between primary tunnel and backup tunnels.""" @@ -660,6 +680,12 @@ class ApplianceTrafficFiltersItem4(_BaseSchema): value: ApplianceValue3 +class ApplianceUmbrellaOrganization(_BaseSchema): + """Organization details.""" + + id: str | None = None + + class ApplianceUplinksItem(_BaseSchema): """Schema for ApplianceUplinksItem.""" @@ -785,8 +811,8 @@ class ApplianceWanTrafficUplinkPreferencesItem2(_BaseSchema): class BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateItemsItem(_BaseSchema): """Item schema for items.""" - network: ApplianceNetwork | None = None - profile: ApplianceNetwork | None = None + network: ApplianceUmbrellaOrganization | None = None + profile: ApplianceUmbrellaOrganization | None = None class BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateResponse(_BaseSchema): @@ -803,8 +829,27 @@ class BulkOrganizationApplianceDnsLocalProfilesAssignmentsCreateResponseItemsIte assignment_id: str | None = Field( default=None, validation_alias="assignmentId", serialization_alias="assignmentId" ) - network: ApplianceNetwork | None = None - profile: ApplianceNetwork | None = None + network: ApplianceUmbrellaOrganization | None = None + profile: ApplianceUmbrellaOrganization | None = None + + +class ConnectNetworkApplianceUmbrellaAccountApi(_BaseSchema): + """Umbrella API credentials.""" + + key: str | None = None + secret: str | None = None + + +class ConnectNetworkApplianceUmbrellaAccountResponse(_BaseSchema): + """Response for connectNetworkApplianceUmbrellaAccount operation.""" + + umbrella: ConnectNetworkApplianceUmbrellaAccountResponseUmbrella | None = None + + +class ConnectNetworkApplianceUmbrellaAccountResponseUmbrella(_BaseSchema): + """Umbrella configuration.""" + + organization: ApplianceUmbrellaOrganization | None = None class CreateDeviceApplianceVmxAuthenticationTokenResponse(_BaseSchema): @@ -1046,7 +1091,7 @@ class CreateOrganizationApplianceDnsLocalRecordResponseItem(_BaseSchema): ) hostname: str | None = None address: str | None = None - profile: ApplianceNetwork | None = None + profile: ApplianceUmbrellaOrganization | None = None class CreateOrganizationApplianceDnsSplitProfileNameservers(_BaseSchema): @@ -1069,8 +1114,8 @@ class CreateOrganizationApplianceDnsSplitProfileResponse(_BaseSchema): class CreateOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreateItemsItem(_BaseSchema): """Item schema for items.""" - network: ApplianceNetwork | None = None - profile: ApplianceNetwork | None = None + network: ApplianceUmbrellaOrganization | None = None + profile: ApplianceUmbrellaOrganization | None = None class CreateOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreateResponse(_BaseSchema): @@ -2113,8 +2158,8 @@ class GetOrganizationApplianceDnsLocalProfilesAssignmentsResponseItemsItem(_Base assignment_id: str | None = Field( default=None, validation_alias="assignmentId", serialization_alias="assignmentId" ) - network: ApplianceNetwork | None = None - profile: ApplianceNetwork | None = None + network: ApplianceUmbrellaOrganization | None = None + profile: ApplianceUmbrellaOrganization | None = None class GetOrganizationApplianceDnsLocalProfilesResponse( @@ -2146,7 +2191,7 @@ class GetOrganizationApplianceDnsLocalRecordsResponseItem(_BaseSchema): ) hostname: str | None = None address: str | None = None - profile: ApplianceNetwork | None = None + profile: ApplianceUmbrellaOrganization | None = None class GetOrganizationApplianceDnsSplitProfilesAssignmentsResponseItemsItem(_BaseSchema): @@ -2155,8 +2200,8 @@ class GetOrganizationApplianceDnsSplitProfilesAssignmentsResponseItemsItem(_Base assignment_id: str | None = Field( default=None, validation_alias="assignmentId", serialization_alias="assignmentId" ) - network: ApplianceNetwork | None = None - profile: ApplianceNetwork | None = None + network: ApplianceUmbrellaOrganization | None = None + profile: ApplianceUmbrellaOrganization | None = None class GetOrganizationApplianceDnsSplitProfilesResponse( @@ -2357,7 +2402,7 @@ class GetOrganizationApplianceVpnThirdPartyVPNPeersResponsePeersItem(_BaseSchema ipsec_policies: AppliancePeersIpsecPolicies | None = Field( default=None, validation_alias="ipsecPolicies", serialization_alias="ipsecPolicies" ) - sla_policy: ApplianceNetwork | None = Field( + sla_policy: ApplianceUmbrellaOrganization | None = Field( default=None, validation_alias="slaPolicy", serialization_alias="slaPolicy" ) ipsec_policies_preset: str | None = Field( @@ -2378,6 +2423,11 @@ class GetOrganizationApplianceVpnThirdPartyVPNPeersResponsePeersItem(_BaseSchema ebgp_neighbor: AppliancePeersEbgpNeighbor | None = Field( default=None, validation_alias="ebgpNeighbor", serialization_alias="ebgpNeighbor" ) + ecmp_uplink_configs: list[AppliancePeersEcmpUplinkConfigsItem] = Field( + default_factory=list, + validation_alias="ecmpUplinkConfigs", + serialization_alias="ecmpUplinkConfigs", + ) priority_in_group: int | None = Field( default=None, validation_alias="priorityInGroup", serialization_alias="priorityInGroup" ) @@ -3045,7 +3095,9 @@ class UpdateNetworkApplianceSsidResponse(_BaseSchema): class UpdateNetworkApplianceStaticRouteFixedIpAssignmentsValue(_BaseSchema): - """An object mapping MAC addresses to IP addresses and client names.""" + """An object representing MAC address to IP address and client name mapping. This should be the + MAC address. + """ ip: str | None = None name: str | None = None @@ -3540,7 +3592,7 @@ class UpdateOrganizationApplianceDnsLocalRecordResponse(_BaseSchema): ) hostname: str | None = None address: str | None = None - profile: ApplianceNetwork | None = None + profile: ApplianceUmbrellaOrganization | None = None class UpdateOrganizationApplianceDnsSplitProfileNameservers(_BaseSchema): @@ -3628,7 +3680,7 @@ class UpdateOrganizationApplianceVpnThirdPartyVPNPeersPeersItem(_BaseSchema): validation_alias="ipsecPoliciesPreset", serialization_alias="ipsecPoliciesPreset", ) - sla_policy: ApplianceNetwork | None = Field( + sla_policy: ApplianceUmbrellaOrganization | None = Field( default=None, validation_alias="slaPolicy", serialization_alias="slaPolicy" ) secret: str @@ -3645,6 +3697,11 @@ class UpdateOrganizationApplianceVpnThirdPartyVPNPeersPeersItem(_BaseSchema): ebgp_neighbor: UpdateOrganizationApplianceVpnThirdPartyVPNPeersPeersItemEbgpNeighbor | None = ( Field(default=None, validation_alias="ebgpNeighbor", serialization_alias="ebgpNeighbor") ) + ecmp_uplink_configs: list[AppliancePeersEcmpUplinkConfigsItem] = Field( + default_factory=list, + validation_alias="ecmpUplinkConfigs", + serialization_alias="ecmpUplinkConfigs", + ) priority_in_group: int | None = Field( default=None, validation_alias="priorityInGroup", serialization_alias="priorityInGroup" ) diff --git a/meraki_client/schemas/_camera.py b/meraki_client/schemas/_camera.py index 7961468..bcd4331 100644 --- a/meraki_client/schemas/_camera.py +++ b/meraki_client/schemas/_camera.py @@ -100,12 +100,6 @@ class CameraResults(_BaseSchema): out: int | None = None -class CameraSmartRetention(_BaseSchema): - """Smart retention settings.""" - - enabled: bool | None = None - - class CameraSsid(_BaseSchema): """The details of the SSID config.""" @@ -178,7 +172,7 @@ class CreateNetworkCameraQualityRetentionProfileResponse(_BaseSchema): validation_alias="motionDetectorVersion", serialization_alias="motionDetectorVersion", ) - smart_retention: CameraSmartRetention | None = Field( + smart_retention: GetDeviceCameraSenseResponseAudioDetection | None = Field( default=None, validation_alias="smartRetention", serialization_alias="smartRetention" ) video_settings: dict[str, Any] | None = Field( @@ -567,10 +561,84 @@ class GetDeviceCameraCustomAnalyticsResponseParametersItem(_BaseSchema): value: float | None = None -class GetDeviceCameraSenseObjectDetectionModelsResponse(RootModel[list[dict[str, Any]]]): +class GetDeviceCameraQualityAndRetentionResponse(_BaseSchema): + """Response for getDeviceCameraQualityAndRetention operation.""" + + profile_id: str | None = Field( + default=None, validation_alias="profileId", serialization_alias="profileId" + ) + motion_based_retention_enabled: bool | None = Field( + default=None, + validation_alias="motionBasedRetentionEnabled", + serialization_alias="motionBasedRetentionEnabled", + ) + audio_recording_enabled: bool | None = Field( + default=None, + validation_alias="audioRecordingEnabled", + serialization_alias="audioRecordingEnabled", + ) + restricted_bandwidth_mode_enabled: bool | None = Field( + default=None, + validation_alias="restrictedBandwidthModeEnabled", + serialization_alias="restrictedBandwidthModeEnabled", + ) + quality: str | None = None + resolution: str | None = None + motion_detector_version: int | None = Field( + default=None, + validation_alias="motionDetectorVersion", + serialization_alias="motionDetectorVersion", + ) + + +class GetDeviceCameraSenseObjectDetectionModelsResponse( + RootModel[list["GetDeviceCameraSenseObjectDetectionModelsResponseItem"]] +): """Response for getDeviceCameraSenseObjectDetectionModels operation.""" +class GetDeviceCameraSenseObjectDetectionModelsResponseItem(_BaseSchema): + """Schema for GetDeviceCameraSenseObjectDetectionModelsResponseItem.""" + + id: str | None = None + description: str | None = None + + +class GetDeviceCameraSenseResponse(_BaseSchema): + """Response for getDeviceCameraSense operation.""" + + sense_enabled: bool | None = Field( + default=None, validation_alias="senseEnabled", serialization_alias="senseEnabled" + ) + mqtt_broker_id: str | None = Field( + default=None, validation_alias="mqttBrokerId", serialization_alias="mqttBrokerId" + ) + mqtt_topics: list[str] = Field( + default_factory=list, validation_alias="mqttTopics", serialization_alias="mqttTopics" + ) + audio_detection: GetDeviceCameraSenseResponseAudioDetection | None = Field( + default=None, validation_alias="audioDetection", serialization_alias="audioDetection" + ) + detection_model_id: str | None = Field( + default=None, validation_alias="detectionModelId", serialization_alias="detectionModelId" + ) + + +class GetDeviceCameraSenseResponseAudioDetection(_BaseSchema): + """Audio detection configuration.""" + + enabled: bool | None = None + + +class GetDeviceCameraVideoLinkResponse(_BaseSchema): + """Response for getDeviceCameraVideoLink operation.""" + + url: str | None = None + vision_url: str | None = Field( + default=None, validation_alias="visionUrl", serialization_alias="visionUrl" + ) + + class GetDeviceCameraVideoSettingsResponse(_BaseSchema): """Response for getDeviceCameraVideoSettings operation.""" @@ -584,6 +652,20 @@ class GetDeviceCameraVideoSettingsResponse(_BaseSchema): ) +class GetDeviceCameraWirelessProfilesResponse(_BaseSchema): + """Response for getDeviceCameraWirelessProfiles operation.""" + + ids: GetDeviceCameraWirelessProfilesResponseIds | None = None + + +class GetDeviceCameraWirelessProfilesResponseIds(_BaseSchema): + """IDs of assigned wireless profiles.""" + + primary: str | None = None + secondary: str | None = None + backup: str | None = None + + class GetNetworkCameraQualityRetentionProfileResponse(_BaseSchema): """Response for getNetworkCameraQualityRetentionProfile operation.""" @@ -623,7 +705,7 @@ class GetNetworkCameraQualityRetentionProfileResponse(_BaseSchema): validation_alias="motionDetectorVersion", serialization_alias="motionDetectorVersion", ) - smart_retention: CameraSmartRetention | None = Field( + smart_retention: GetDeviceCameraSenseResponseAudioDetection | None = Field( default=None, validation_alias="smartRetention", serialization_alias="smartRetention" ) video_settings: dict[str, Any] | None = Field( @@ -676,7 +758,7 @@ class GetNetworkCameraQualityRetentionProfilesResponseItem(_BaseSchema): validation_alias="motionDetectorVersion", serialization_alias="motionDetectorVersion", ) - smart_retention: CameraSmartRetention | None = Field( + smart_retention: GetDeviceCameraSenseResponseAudioDetection | None = Field( default=None, validation_alias="smartRetention", serialization_alias="smartRetention" ) video_settings: dict[str, Any] | None = Field( @@ -809,10 +891,25 @@ class GetOrganizationCameraDetectionsHistoryByBoundaryByIntervalResponseItem(_Ba results: CameraResults | None = None -class GetOrganizationCameraOnboardingStatusesResponse(RootModel[list[dict[str, Any]]]): +class GetOrganizationCameraOnboardingStatusesResponse( + RootModel[list["GetOrganizationCameraOnboardingStatusesResponseItem"]] +): """Response for getOrganizationCameraOnboardingStatuses operation.""" +class GetOrganizationCameraOnboardingStatusesResponseItem(_BaseSchema): + """Schema for GetOrganizationCameraOnboardingStatusesResponseItem.""" + + network_id: str | None = Field( + default=None, validation_alias="networkId", serialization_alias="networkId" + ) + serial: str | None = None + status: str | None = None + updated_at: datetime | None = Field( + default=None, validation_alias="updatedAt", serialization_alias="updatedAt" + ) + + class GetOrganizationCameraPermissionResponse(_BaseSchema): """Response for getOrganizationCameraPermission operation.""" @@ -900,12 +997,62 @@ class UpdateDeviceCameraCustomAnalyticsResponse(_BaseSchema): ) +class UpdateDeviceCameraQualityAndRetentionResponse(_BaseSchema): + """Response for updateDeviceCameraQualityAndRetention operation.""" + + profile_id: str | None = Field( + default=None, validation_alias="profileId", serialization_alias="profileId" + ) + motion_based_retention_enabled: bool | None = Field( + default=None, + validation_alias="motionBasedRetentionEnabled", + serialization_alias="motionBasedRetentionEnabled", + ) + audio_recording_enabled: bool | None = Field( + default=None, + validation_alias="audioRecordingEnabled", + serialization_alias="audioRecordingEnabled", + ) + restricted_bandwidth_mode_enabled: bool | None = Field( + default=None, + validation_alias="restrictedBandwidthModeEnabled", + serialization_alias="restrictedBandwidthModeEnabled", + ) + quality: str | None = None + resolution: str | None = None + motion_detector_version: int | None = Field( + default=None, + validation_alias="motionDetectorVersion", + serialization_alias="motionDetectorVersion", + ) + + class UpdateDeviceCameraSenseAudioDetection(_BaseSchema): """The details of the audio detection config.""" enabled: bool | None = None +class UpdateDeviceCameraSenseResponse(_BaseSchema): + """Response for updateDeviceCameraSense operation.""" + + sense_enabled: bool | None = Field( + default=None, validation_alias="senseEnabled", serialization_alias="senseEnabled" + ) + mqtt_broker_id: str | None = Field( + default=None, validation_alias="mqttBrokerId", serialization_alias="mqttBrokerId" + ) + mqtt_topics: list[str] = Field( + default_factory=list, validation_alias="mqttTopics", serialization_alias="mqttTopics" + ) + audio_detection: GetDeviceCameraSenseResponseAudioDetection | None = Field( + default=None, validation_alias="audioDetection", serialization_alias="audioDetection" + ) + detection_model_id: str | None = Field( + default=None, validation_alias="detectionModelId", serialization_alias="detectionModelId" + ) + + class UpdateDeviceCameraVideoSettingsResponse(_BaseSchema): """Response for updateDeviceCameraVideoSettings operation.""" @@ -927,6 +1074,12 @@ class UpdateDeviceCameraWirelessProfilesIds(_BaseSchema): backup: str | None = None +class UpdateDeviceCameraWirelessProfilesResponse(_BaseSchema): + """Response for updateDeviceCameraWirelessProfiles operation.""" + + ids: GetDeviceCameraWirelessProfilesResponseIds | None = None + + class UpdateNetworkCameraQualityRetentionProfileResponse(_BaseSchema): """Response for updateNetworkCameraQualityRetentionProfile operation.""" @@ -966,7 +1119,7 @@ class UpdateNetworkCameraQualityRetentionProfileResponse(_BaseSchema): validation_alias="motionDetectorVersion", serialization_alias="motionDetectorVersion", ) - smart_retention: CameraSmartRetention | None = Field( + smart_retention: GetDeviceCameraSenseResponseAudioDetection | None = Field( default=None, validation_alias="smartRetention", serialization_alias="smartRetention" ) video_settings: dict[str, Any] | None = Field( @@ -1095,6 +1248,12 @@ class UpdateNetworkCameraWirelessProfileSsid(_BaseSchema): psk: str | None = None +class UpdateOrganizationCameraOnboardingStatusesResponse(_BaseSchema): + """Response for updateOrganizationCameraOnboardingStatuses operation.""" + + success: bool | None = None + + class UpdateOrganizationCameraRoleAppliedOnDevicesItem(_BaseSchema): """Item schema for appliedOnDevices.""" diff --git a/meraki_client/schemas/_devices.py b/meraki_client/schemas/_devices.py index d81dc32..eb28efc 100644 --- a/meraki_client/schemas/_devices.py +++ b/meraki_client/schemas/_devices.py @@ -581,6 +581,13 @@ class GetDeviceLiveToolsMulticastRoutingResponseInterfacesItem(_BaseSchema): ip: str | None = None name: str | None = None + vrf: str | None = None + vrf_type: str | None = Field( + default=None, validation_alias="vrfType", serialization_alias="vrfType" + ) + ip_version: str | None = Field( + default=None, validation_alias="ipVersion", serialization_alias="ipVersion" + ) subnet: str | None = None flags: list[str] = Field(default_factory=list) neighbors: list[str] = Field(default_factory=list) @@ -591,6 +598,10 @@ class GetDeviceLiveToolsMulticastRoutingResponseRoutesItem(_BaseSchema): source: str | None = None group: str | None = None + vrf: str | None = None + ip_version: str | None = Field( + default=None, validation_alias="ipVersion", serialization_alias="ipVersion" + ) rendezvous_point: str | None = Field( default=None, validation_alias="rendezvousPoint", serialization_alias="rendezvousPoint" ) diff --git a/meraki_client/schemas/_networks.py b/meraki_client/schemas/_networks.py index 130fa44..d7ab3f3 100644 --- a/meraki_client/schemas/_networks.py +++ b/meraki_client/schemas/_networks.py @@ -837,6 +837,7 @@ class GetNetworkClientResponse(_BaseSchema): default=None, validation_alias="lastSeen", serialization_alias="lastSeen" ) manufacturer: str | None = None + model: str | None = None os: str | None = None user: str | None = None vlan: str | None = None diff --git a/meraki_client/schemas/_organizations.py b/meraki_client/schemas/_organizations.py index 72e479b..9cc1ef7 100644 --- a/meraki_client/schemas/_organizations.py +++ b/meraki_client/schemas/_organizations.py @@ -1130,6 +1130,9 @@ class CreateOrganizationSplashThemeResponse(_BaseSchema): id: str | None = None name: str | None = None + is_system_theme: bool | None = Field( + default=None, validation_alias="isSystemTheme", serialization_alias="isSystemTheme" + ) theme_assets: list[OrganizationsPolicyObjectsItem] = Field( default_factory=list, validation_alias="themeAssets", serialization_alias="themeAssets" ) @@ -2499,6 +2502,43 @@ class GetOrganizationFloorPlansAutoLocateStatusesResponseItem(_BaseSchema): jobs: list[OrganizationsJobsItem] = Field(default_factory=list) +class GetOrganizationIntegrationsDeployableResponseItemsItem(_BaseSchema): + """Schema for GetOrganizationIntegrationsDeployableResponseItemsItem.""" + + type_: str | None = Field(default=None, validation_alias="type", serialization_alias="type") + name: str | None = None + provider: str | None = None + tags: list[str] = Field(default_factory=list) + short_description: str | None = Field( + default=None, validation_alias="shortDescription", serialization_alias="shortDescription" + ) + is_deployable: bool | None = Field( + default=None, validation_alias="isDeployable", serialization_alias="isDeployable" + ) + release_type: str | None = Field( + default=None, validation_alias="releaseType", serialization_alias="releaseType" + ) + logo_url: str | None = Field( + default=None, validation_alias="logoUrl", serialization_alias="logoUrl" + ) + redirect_url: str | None = Field( + default=None, validation_alias="redirectUrl", serialization_alias="redirectUrl" + ) + is_cisco_product: bool | None = Field( + default=None, validation_alias="isCiscoProduct", serialization_alias="isCiscoProduct" + ) + + +class GetOrganizationIntegrationsDeployedResponseItemsItem(_BaseSchema): + """Schema for GetOrganizationIntegrationsDeployedResponseItemsItem.""" + + id: str | None = None + type_: str | None = Field(default=None, validation_alias="type", serialization_alias="type") + name: str | None = None + provider: str | None = None + tags: list[str] = Field(default_factory=list) + + class GetOrganizationIntegrationsXdrNetworksResponseItemsItem(_BaseSchema): """Schema for GetOrganizationIntegrationsXdrNetworksResponseItemsItem.""" @@ -3152,6 +3192,21 @@ class GetOrganizationSamlRolesResponseItem(_BaseSchema): camera: list[OrganizationsCameraItem] = Field(default_factory=list) +class GetOrganizationSaseNetworksEligibleResponseItemsItem(_BaseSchema): + """Schema for GetOrganizationSaseNetworksEligibleResponseItemsItem.""" + + network_id: str | None = Field( + default=None, validation_alias="networkId", serialization_alias="networkId" + ) + type_: str | None = Field(default=None, validation_alias="type", serialization_alias="type") + name: str | None = None + region: OrganizationsHost | None = None + device: OrganizationsDevice5 | None = None + address: OrganizationsAddress | None = None + vpn: OrganizationsVpn | None = None + routing: OrganizationsRouting | None = None + + class GetOrganizationSnmpResponse(_BaseSchema): """Response for getOrganizationSnmp operation.""" @@ -3201,6 +3256,9 @@ class GetOrganizationSplashThemesResponseItem(_BaseSchema): id: str | None = None name: str | None = None + is_system_theme: bool | None = Field( + default=None, validation_alias="isSystemTheme", serialization_alias="isSystemTheme" + ) theme_assets: list[OrganizationsPolicyObjectsItem] = Field( default_factory=list, validation_alias="themeAssets", serialization_alias="themeAssets" ) @@ -3335,6 +3393,7 @@ class GetOrganizationSummaryTopNetworksByStatusResponseItem(_BaseSchema): name: str | None = None url: str | None = None tags: list[str] = Field(default_factory=list) + group: CreateOrganizationActionBatchCallbackHttpServer | None = None clients: OrganizationsClients2 | None = None statuses: OrganizationsStatuses | None = None devices: OrganizationsDevices | None = None @@ -3612,6 +3671,12 @@ class OrganizationsActionsItem(_BaseSchema): body: dict[str, Any] | None = None +class OrganizationsAddress(_BaseSchema): + """The address of the site.""" + + street: str | None = None + + class OrganizationsAddressesItem(_BaseSchema): """Schema for OrganizationsAddressesItem.""" @@ -3926,6 +3991,12 @@ class OrganizationsDevice4(_BaseSchema): status: str | None = None +class OrganizationsDevice5(_BaseSchema): + """Device information for the network.""" + + primary: OrganizationsPrimary | None = None + + class OrganizationsDevices(_BaseSchema): """Network device information.""" @@ -4294,6 +4365,12 @@ class OrganizationsPreview(_BaseSchema): ) +class OrganizationsPrimary(_BaseSchema): + """The primary MX device.""" + + model: str | None = None + + class OrganizationsPublic(_BaseSchema): """Public interface information.""" @@ -4384,6 +4461,14 @@ class OrganizationsRootCertificate(_BaseSchema): name: str | None = None +class OrganizationsRouting(_BaseSchema): + """Routing configuration for the site.""" + + default_route: OrganizationsApi | None = Field( + default=None, validation_alias="defaultRoute", serialization_alias="defaultRoute" + ) + + class OrganizationsRulesItem(_BaseSchema): """Schema for OrganizationsRulesItem.""" @@ -4794,6 +4879,12 @@ class OrganizationsUtilization(_BaseSchema): average: OrganizationsAverage | None = None +class OrganizationsVpn(_BaseSchema): + """VPN configuration for the site.""" + + type_: str | None = Field(default=None, validation_alias="type", serialization_alias="type") + + class PreviewOrganizationInventoryOrdersResponse(_BaseSchema): """Response for previewOrganizationInventoryOrders operation.""" diff --git a/meraki_client/schemas/_wireless.py b/meraki_client/schemas/_wireless.py index 5e878d8..9706ac3 100644 --- a/meraki_client/schemas/_wireless.py +++ b/meraki_client/schemas/_wireless.py @@ -350,6 +350,44 @@ class CreateNetworkWirelessSsidIdentityPskResponse(_BaseSchema): ) +class CreateOrganizationWirelessDevicesProvisioningDeploymentItemsItem(_BaseSchema): + """Item schema for items.""" + + deployment_id: str | None = Field( + default=None, validation_alias="deploymentId", serialization_alias="deploymentId" + ) + devices: UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItemDevices + status: str + type_: str = Field(validation_alias="type", serialization_alias="type") + network: WirelessDoorLocksNetwork | None = None + created_at: datetime | None = Field( + default=None, validation_alias="createdAt", serialization_alias="createdAt" + ) + requested_at: datetime | None = Field( + default=None, validation_alias="requestedAt", serialization_alias="requestedAt" + ) + last_updated_at: datetime | None = Field( + default=None, validation_alias="lastUpdatedAt", serialization_alias="lastUpdatedAt" + ) + completed_at: datetime | None = Field( + default=None, validation_alias="completedAt", serialization_alias="completedAt" + ) + errors: list[str] = Field(default_factory=list) + + +class CreateOrganizationWirelessDevicesProvisioningDeploymentMeta(_BaseSchema): + """Metadata relevant to the paginated dataset.""" + + counts: WirelessCounts2 | None = None + + +class CreateOrganizationWirelessDevicesProvisioningDeploymentResponse(_BaseSchema): + """Response for createOrganizationWirelessDevicesProvisioningDeployment operation.""" + + items: list[WirelessItemsItem] + meta: WirelessMeta | None = None + + class CreateOrganizationWirelessDevicesRadsecCertificatesAuthorityResponse(_BaseSchema): """Response for createOrganizationWirelessDevicesRadsecCertificatesAuthority operation.""" @@ -2099,6 +2137,19 @@ class GetOrganizationWirelessDevicesPowerModeHistoryResponseItemsItem(_BaseSchem events: list[WirelessEventsItem] = Field(default_factory=list) +class GetOrganizationWirelessDevicesProvisioningDeploymentsResponse( + RootModel[list["GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem"]] +): + """Response for getOrganizationWirelessDevicesProvisioningDeployments operation.""" + + +class GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem(_BaseSchema): + """Schema for GetOrganizationWirelessDevicesProvisioningDeploymentsResponseItem.""" + + items: list[WirelessItemsItem] + meta: WirelessMeta | None = None + + class GetOrganizationWirelessDevicesRadsecCertificatesAuthoritiesCrlsDeltasResponseItemsItem( _BaseSchema ): @@ -2325,7 +2376,7 @@ class GetOrganizationWirelessZigbeeDevicesResponseItem(_BaseSchema): enrolled: bool | None = None status: str | None = None gateway: WirelessGateway | None = None - counts: WirelessCounts2 | None = None + counts: WirelessCounts3 | None = None class GetOrganizationWirelessZigbeeDisenrollmentResponse(_BaseSchema): @@ -3874,6 +3925,51 @@ class UpdateNetworkWirelessZigbeeResponseLockManagement(_BaseSchema): status: str | None = None +class UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItem(_BaseSchema): + """Item schema for items.""" + + deployment_id: str | None = Field( + default=None, validation_alias="deploymentId", serialization_alias="deploymentId" + ) + devices: UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItemDevices + status: str + type_: str = Field(validation_alias="type", serialization_alias="type") + network: WirelessDoorLocksNetwork | None = None + created_at: datetime | None = Field( + default=None, validation_alias="createdAt", serialization_alias="createdAt" + ) + requested_at: datetime | None = Field( + default=None, validation_alias="requestedAt", serialization_alias="requestedAt" + ) + last_updated_at: datetime | None = Field( + default=None, validation_alias="lastUpdatedAt", serialization_alias="lastUpdatedAt" + ) + completed_at: datetime | None = Field( + default=None, validation_alias="completedAt", serialization_alias="completedAt" + ) + errors: list[str] = Field(default_factory=list) + + +class UpdateOrganizationWirelessDevicesProvisioningDeploymentsItemsItemDevices(_BaseSchema): + """An array composed of old and new devices.""" + + old: WirelessOld | None = None + new: WirelessNew2 + + +class UpdateOrganizationWirelessDevicesProvisioningDeploymentsMeta(_BaseSchema): + """Metadata relevant to the paginated dataset.""" + + counts: WirelessCounts2 | None = None + + +class UpdateOrganizationWirelessDevicesProvisioningDeploymentsResponse(_BaseSchema): + """Response for updateOrganizationWirelessDevicesProvisioningDeployments operation.""" + + items: list[WirelessItemsItem] + meta: WirelessMeta | None = None + + class UpdateOrganizationWirelessDevicesRadsecCertificatesAuthoritiesResponse(_BaseSchema): """Response for updateOrganizationWirelessDevicesRadsecCertificatesAuthorities operation.""" @@ -3991,7 +4087,7 @@ class UpdateOrganizationWirelessZigbeeDeviceResponse(_BaseSchema): enrolled: bool | None = None status: str | None = None gateway: WirelessGateway | None = None - counts: WirelessCounts2 | None = None + counts: WirelessCounts3 | None = None class UpdateOrganizationWirelessZigbeeDoorLockResponse(_BaseSchema): @@ -4231,6 +4327,12 @@ class WirelessCounts(_BaseSchema): class WirelessCounts2(_BaseSchema): + """Counts relating to the paginated dataset.""" + + items: WirelessItems | None = None + + +class WirelessCounts3(_BaseSchema): """Stats.""" door_locks: WirelessDoorLocks | None = Field( @@ -4260,6 +4362,13 @@ class WirelessDevice(_BaseSchema): mac: str | None = None +class WirelessDevices(_BaseSchema): + """An array composed of old and new devices.""" + + old: WirelessOld | None = None + new: WirelessNew + + class WirelessDoorLocks(_BaseSchema): """Door locks stats.""" @@ -4332,6 +4441,36 @@ class WirelessHysteresis(_BaseSchema): threshold: int | None = None +class WirelessItems(_BaseSchema): + """Counts relating to the paginated items.""" + + total: int | None = None + remaining: int | None = None + + +class WirelessItemsItem(_BaseSchema): + """Schema for WirelessItemsItem.""" + + deployment_id: str = Field(validation_alias="deploymentId", serialization_alias="deploymentId") + devices: WirelessDevices + status: str + type_: str = Field(validation_alias="type", serialization_alias="type") + network: WirelessDoorLocksNetwork | None = None + created_at: datetime | None = Field( + default=None, validation_alias="createdAt", serialization_alias="createdAt" + ) + requested_at: datetime | None = Field( + default=None, validation_alias="requestedAt", serialization_alias="requestedAt" + ) + last_updated_at: datetime | None = Field( + default=None, validation_alias="lastUpdatedAt", serialization_alias="lastUpdatedAt" + ) + completed_at: datetime | None = Field( + default=None, validation_alias="completedAt", serialization_alias="completedAt" + ) + errors: list[str] = Field(default_factory=list) + + class WirelessLatencyBinsByCategory(_BaseSchema): """The latency buckets by category.""" @@ -4366,6 +4505,12 @@ class WirelessLinkNegotiation(_BaseSchema): speed: int | None = None +class WirelessMeta(_BaseSchema): + """Metadata relevant to the paginated dataset.""" + + counts: WirelessCounts2 | None = None + + class WirelessMqtt(_BaseSchema): """MQTT Settings for network.""" @@ -4414,6 +4559,48 @@ class WirelessNetwork2(_BaseSchema): name: str | None = None +class WirelessNew(_BaseSchema): + """New device.""" + + serial: str + name: str + model: str + mac: str + tags: list[str] = Field(default_factory=list) + rf_profile: WirelessDoorLocksNetwork | None = Field( + default=None, validation_alias="rfProfile", serialization_alias="rfProfile" + ) + + +class WirelessNew2(_BaseSchema): + """New device.""" + + serial: str | None = None + name: str | None = None + model: str | None = None + mac: str | None = None + tags: list[str] = Field(default_factory=list) + rf_profile: WirelessDoorLocksNetwork | None = Field( + default=None, validation_alias="rfProfile", serialization_alias="rfProfile" + ) + + +class WirelessOld(_BaseSchema): + """Old device.""" + + serial: str | None = None + after_action: str | None = Field( + default=None, validation_alias="afterAction", serialization_alias="afterAction" + ) + name: str | None = None + model: str | None = None + mac: str | None = None + tags: list[str] = Field(default_factory=list) + rf_profile: WirelessDoorLocksNetwork | None = Field( + default=None, validation_alias="rfProfile", serialization_alias="rfProfile" + ) + + class WirelessOpenRoaming(_BaseSchema): """Openroaming information for the SSID.""" diff --git a/meraki_client/types.py b/meraki_client/types.py index 5ce98e4..32ebfb8 100644 --- a/meraki_client/types.py +++ b/meraki_client/types.py @@ -148,6 +148,9 @@ "GetOrganizationSensorReadingsHistoryMetrics", "GetOrganizationSensorReadingsLatestMetrics", "GetOrganizationWebhooksAlertTypesProductType", + "GetOrganizationWirelessDevicesProvisioningDeploymentsDeploymentType", + "GetOrganizationWirelessDevicesProvisioningDeploymentsSortBy", + "GetOrganizationWirelessDevicesProvisioningDeploymentsSortOrder", "GetOrganizationWirelessRadioRrmByNetworkSortOrder", "GetOrganizationWirelessRfProfilesAssignmentsByDeviceProductTypes", "GetOrganizationWirelessSsidsFirewallIsolationAllowlistEntriesSsids", @@ -483,7 +486,9 @@ "arp_failure", "asymmetry", "aurora1_subnet_overlap", + "aurora2_consilience", "auto_vpn_failure", + "auto_vpn_uplink_decision", "bad_connectivity", "bad_gateway", "bad_ip6conf", @@ -713,7 +718,9 @@ "arp_failure", "asymmetry", "aurora1_subnet_overlap", + "aurora2_consilience", "auto_vpn_failure", + "auto_vpn_uplink_decision", "bad_connectivity", "bad_gateway", "bad_ip6conf", @@ -958,7 +965,9 @@ "arp_failure", "asymmetry", "aurora1_subnet_overlap", + "aurora2_consilience", "auto_vpn_failure", + "auto_vpn_uplink_decision", "bad_connectivity", "bad_gateway", "bad_ip6conf", @@ -1161,7 +1170,9 @@ "arp_failure", "asymmetry", "aurora1_subnet_overlap", + "aurora2_consilience", "auto_vpn_failure", + "auto_vpn_uplink_decision", "bad_connectivity", "bad_gateway", "bad_ip6conf", @@ -1368,7 +1379,9 @@ "arp_failure", "asymmetry", "aurora1_subnet_overlap", + "aurora2_consilience", "auto_vpn_failure", + "auto_vpn_uplink_decision", "bad_connectivity", "bad_gateway", "bad_ip6conf", @@ -1781,6 +1794,13 @@ GetOrganizationWebhooksAlertTypesProductType: TypeAlias = Literal[ "appliance", "camera", "cellularGateway", "platform", "sensor", "sm", "switch", "wireless" ] +GetOrganizationWirelessDevicesProvisioningDeploymentsDeploymentType: TypeAlias = Literal[ + "deploy", "replace" +] +GetOrganizationWirelessDevicesProvisioningDeploymentsSortBy: TypeAlias = Literal[ + "afterAction", "createdAt", "deploymentId", "name", "status" +] +GetOrganizationWirelessDevicesProvisioningDeploymentsSortOrder: TypeAlias = Literal["asc", "desc"] GetOrganizationWirelessRadioRrmByNetworkSortOrder: TypeAlias = Literal["ascending", "descending"] GetOrganizationWirelessRfProfilesAssignmentsByDeviceProductTypes: TypeAlias = list[ Literal[ @@ -1914,6 +1934,7 @@ "ipsk-without-radius", "open", "open-enhanced", + "open-enhanced-with-radius", "open-with-nac", "open-with-radius", "psk", diff --git a/tests/generated/api/test_organizations.py b/tests/generated/api/test_organizations.py index 6be9e04..5b71942 100644 --- a/tests/generated/api/test_organizations.py +++ b/tests/generated/api/test_organizations.py @@ -425,6 +425,22 @@ def test_get_organization_floor_plans_auto_locate_statuses( assert isinstance(result, list) +def test_get_organization_integrations_deployable( + client: MerakiClient, organization_id: str +) -> None: + """Test get_organization_integrations_deployable endpoint.""" + with skip_on_unsupported(): + client.organizations.get_organization_integrations_deployable( + organization_id=organization_id + ) + + +def test_get_organization_integrations_deployed(client: MerakiClient, organization_id: str) -> None: + """Test get_organization_integrations_deployed endpoint.""" + with skip_on_unsupported(): + client.organizations.get_organization_integrations_deployed(organization_id=organization_id) + + def test_get_organization_integrations_xdr_networks( client: MerakiClient, organization_id: str ) -> None: @@ -544,6 +560,17 @@ def test_get_organization_saml_roles(client: MerakiClient, organization_id: str) client.organizations.get_organization_saml_roles(organization_id=organization_id) +def test_get_organization_sase_networks_eligible( + client: MerakiClient, organization_id: str +) -> None: + """Test get_organization_sase_networks_eligible endpoint.""" + with skip_on_unsupported(): + result = client.organizations.get_organization_sase_networks_eligible( + organization_id=organization_id + ).collect() + assert isinstance(result, list) + + def test_get_organization_snmp(client: MerakiClient, organization_id: str) -> None: """Test get_organization_snmp endpoint.""" with skip_on_unsupported(): diff --git a/tests/generated/api/test_wireless.py b/tests/generated/api/test_wireless.py index 96eec3b..d005e9e 100644 --- a/tests/generated/api/test_wireless.py +++ b/tests/generated/api/test_wireless.py @@ -260,6 +260,17 @@ def test_get_organization_wireless_devices_power_mode_history( assert isinstance(result, list) +def test_get_organization_wireless_devices_provisioning_deployments( + client: MerakiClient, organization_id: str +) -> None: + """Test get_organization_wireless_devices_provisioning_deployments endpoint.""" + with skip_on_unsupported(): + result = client.wireless.get_organization_wireless_devices_provisioning_deployments( + organization_id=organization_id + ).collect() + assert isinstance(result, list) + + def test_get_organization_wireless_devices_radsec_certificates_authorities( client: MerakiClient, organization_id: str ) -> None: