diff --git a/docs/generation-report.md b/docs/generation-report.md index 884d754..cd46262 100644 --- a/docs/generation-report.md +++ b/docs/generation-report.md @@ -1,5 +1,20 @@ # Generation Report +## 2026-05-14 | Library v3.1.0b1 | API 1.70.0-beta.1 + + +### Python keyword parameter conflicts + + +The following operations have parameters whose names are Python reserved keywords. +The generator renames them with a trailing underscore (e.g., `from` -> `from_`). +These should be reported to the owning teams for resolution in the API spec. + + +| Scope | Operation | Location | Param | +| --- | --- | --- | --- | +| secureConnect | `createOrganizationSecureConnectRemoteAccessLogsExport` | body | `from` | + ## 2026-05-06 | Library v3.1.0b0 | API 1.70.0-beta.0 diff --git a/meraki/__init__.py b/meraki/__init__.py index aafca11..0e054ff 100644 --- a/meraki/__init__.py +++ b/meraki/__init__.py @@ -52,7 +52,7 @@ from meraki._version import __version__ # noqa: F401 from datetime import datetime -__api_version__ = "1.70.0-beta.0" +__api_version__ = "1.70.0-beta.1" __all__ = [ "APIError", diff --git a/meraki/_version.py b/meraki/_version.py index af79d36..f17b01a 100644 --- a/meraki/_version.py +++ b/meraki/_version.py @@ -1 +1 @@ -__version__ = "3.1.0b0" +__version__ = "3.1.0b1" diff --git a/meraki/aio/api/appliance.py b/meraki/aio/api/appliance.py index b4634ab..edd2488 100644 --- a/meraki/aio/api/appliance.py +++ b/meraki/aio/api/appliance.py @@ -2032,6 +2032,7 @@ def createNetworkApplianceStaticRoute(self, networkId: str, name: str, subnet: s - subnet (string): Subnet of the route - gatewayIp (string): Gateway IP address (next hop) - gatewayVlanId (integer): Gateway VLAN ID + - vrf (object): VRF settings for the static route. """ kwargs.update(locals()) @@ -2048,6 +2049,7 @@ def createNetworkApplianceStaticRoute(self, networkId: str, name: str, subnet: s "subnet", "gatewayIp", "gatewayVlanId", + "vrf", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -2092,6 +2094,7 @@ def updateNetworkApplianceStaticRoute(self, networkId: str, staticRouteId: str, - enabled (boolean): Whether the route should be enabled or not - fixedIpAssignments (object): Fixed DHCP IP assignments on the route - reservedIpRanges (array): DHCP reserved IP ranges + - vrf (object): VRF settings for the static route. """ kwargs.update(locals()) @@ -2112,6 +2115,7 @@ def updateNetworkApplianceStaticRoute(self, networkId: str, staticRouteId: str, "enabled", "fixedIpAssignments", "reservedIpRanges", + "vrf", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -3166,6 +3170,41 @@ def updateNetworkApplianceVpnBgp(self, networkId: str, enabled: bool, **kwargs): return self._session.put(metadata, resource, payload) + def updateNetworkApplianceVpnSiteToSiteHubVrfs(self, networkId: str, hubNetworkId: str, _json: list, **kwargs): + """ + **Update the VRF mappings for a source network and hub pair.** + https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-vpn-site-to-site-hub-vrfs + + - networkId (string): Network ID + - hubNetworkId (string): Hub network ID + - _json (array): The list of VRFs for this source and hub mapping. + """ + + kwargs = locals() + + metadata = { + "tags": ["appliance", "configure", "vpn", "siteToSite", "hubs", "vrfs"], + "operation": "updateNetworkApplianceVpnSiteToSiteHubVrfs", + } + networkId = urllib.parse.quote(str(networkId), safe="") + hubNetworkId = urllib.parse.quote(str(hubNetworkId), safe="") + resource = f"/networks/{networkId}/appliance/vpn/siteToSite/hubs/{hubNetworkId}/vrfs" + + body_params = [ + "_json", + ] + payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} + + if self._session._validate_kwargs: + all_params = [] + body_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"updateNetworkApplianceVpnSiteToSiteHubVrfs: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.put(metadata, resource, payload) + def getNetworkApplianceVpnSiteToSiteVpn(self, networkId: str): """ **Return the site-to-site VPN settings of a network** @@ -3361,6 +3400,7 @@ def getOrganizationApplianceDevicesInterfacesPortsByDevice(self, organizationId: - organizationId (string): Organization ID - serials (array): Parameter to filter the results by device serials + - interfaces (array): Parameter to filter the results by specific interfaces - numbers (array): Parameter to filter the results by specific ports """ @@ -3375,12 +3415,14 @@ def getOrganizationApplianceDevicesInterfacesPortsByDevice(self, organizationId: query_params = [ "serials", + "interfaces", "numbers", ] params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} array_params = [ "serials", + "interfaces", "numbers", ] for k, v in kwargs.items(): @@ -4893,6 +4935,55 @@ def getOrganizationApplianceVpnRemoteAccessSecureClientTunnelCreationByClient(se return self._session.get(metadata, resource, params) + def getOrganizationApplianceVpnSiteToSiteHubsVrfs(self, organizationId: str, total_pages=1, direction="next", **kwargs): + """ + **Return source-to-hub VRF mappings for site-to-site VPN within an organization.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-vpn-site-to-site-hubs-vrfs + + - organizationId (string): Organization ID + - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages + - direction (string): direction to paginate, either "next" (default) or "prev" page + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 500. Default is 50. + - startingAfter (string): 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. + - endingBefore (string): 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. + - networkIds (array): Optional parameter to filter source-to-hub mappings by source network IDs. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["appliance", "configure", "vpn", "siteToSite", "hubs", "vrfs"], + "operation": "getOrganizationApplianceVpnSiteToSiteHubsVrfs", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/appliance/vpn/siteToSite/hubs/vrfs" + + query_params = [ + "perPage", + "startingAfter", + "endingBefore", + "networkIds", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "networkIds", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"getOrganizationApplianceVpnSiteToSiteHubsVrfs: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + def getOrganizationApplianceVpnSiteToSiteIpsecPeersSlas(self, organizationId: str): """ **Get the list of available IPsec SLA policies for an organization** diff --git a/meraki/aio/api/networks.py b/meraki/aio/api/networks.py index 63de730..e995d1d 100644 --- a/meraki/aio/api/networks.py +++ b/meraki/aio/api/networks.py @@ -855,6 +855,23 @@ def vmxNetworkDevicesClaim(self, networkId: str, size: str, **kwargs): return self._session.post(metadata, resource, payload) + def getNetworkDevicesJson(self, networkId: str): + """ + **Extraction of the legacy nodes JSON endpoint for a network** + https://developer.cisco.com/meraki/api-v1/#!get-network-devices-json + + - networkId (string): Network ID + """ + + metadata = { + "tags": ["networks", "configure", "devices", "json"], + "operation": "getNetworkDevicesJson", + } + networkId = urllib.parse.quote(str(networkId), safe="") + resource = f"/networks/{networkId}/devices/json" + + return self._session.get(metadata, resource) + def removeNetworkDevices(self, networkId: str, serial: str, **kwargs): """ **Remove a single device** @@ -2210,14 +2227,17 @@ def updateNetworkMerakiAuthUser(self, networkId: str, merakiAuthUserId: str, **k return self._session.put(metadata, resource, payload) - def getNetworkMqttBrokers(self, networkId: str): + def getNetworkMqttBrokers(self, networkId: str, **kwargs): """ **List the MQTT brokers for this network** https://developer.cisco.com/meraki/api-v1/#!get-network-mqtt-brokers - networkId (string): Network ID + - productTypes (array): Optional parameter to filter MQTT brokers by product type. If multiple types are provided, the query will return brokers that match any of the provided types. """ + kwargs.update(locals()) + metadata = { "tags": ["networks", "configure", "mqttBrokers"], "operation": "getNetworkMqttBrokers", @@ -2225,7 +2245,26 @@ def getNetworkMqttBrokers(self, networkId: str): networkId = urllib.parse.quote(str(networkId), safe="") resource = f"/networks/{networkId}/mqttBrokers" - return self._session.get(metadata, resource) + query_params = [ + "productTypes", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "productTypes", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning(f"getNetworkMqttBrokers: ignoring unrecognized kwargs: {invalid}") + + return self._session.get(metadata, resource, params) def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: int, **kwargs): """ @@ -2238,10 +2277,17 @@ def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: in - port (integer): Host port though which the MQTT broker can be reached. - security (object): Security settings of the MQTT broker. - authentication (object): Authentication settings of the MQTT broker + - productType (string): The product type for which the MQTT broker is being created. """ kwargs.update(locals()) + if "productType" in kwargs: + options = ["camera", "wireless"] + assert kwargs["productType"] in options, ( + f'''"productType" cannot be "{kwargs["productType"]}", & must be set to one of: {options}''' + ) + metadata = { "tags": ["networks", "configure", "mqttBrokers"], "operation": "createNetworkMqttBroker", @@ -2255,6 +2301,7 @@ def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: in "port", "security", "authentication", + "productType", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} diff --git a/meraki/aio/api/organizations.py b/meraki/aio/api/organizations.py index 30a71f7..8307880 100644 --- a/meraki/aio/api/organizations.py +++ b/meraki/aio/api/organizations.py @@ -2972,6 +2972,56 @@ def getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClien return self._session.get(metadata, resource, params) + def getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClientOs(self, organizationId: str, **kwargs): + """ + **Summarizes wired connection successes and failures by client OS.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-assurance-wired-experience-successful-connections-by-network-by-client-os + + - organizationId (string): Organization ID + - networkIds (array): Filter results by network. + - serials (array): Filter results by device serial. + - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 14 days from today. + - t1 (string): The end of the timespan for the data. t1 can be a maximum of 14 days after t0. + - timespan (number): 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 greater than or equal to 15 minutes and be less than or equal to 14 days. The default is 2 hours. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "wired", "experience", "successfulConnections", "byNetwork", "byClientOs"], + "operation": "getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClientOs", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/assurance/wired/experience/successfulConnections/byNetwork/byClientOs" + + query_params = [ + "networkIds", + "serials", + "t0", + "t1", + "timespan", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "networkIds", + "serials", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClientOs: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get(metadata, resource, params) + def getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByDevice( self, organizationId: str, total_pages=1, direction="next", **kwargs ): @@ -3553,7 +3603,7 @@ def importOrganizationCertificates(self, organizationId: str, managedBy: str, co https://developer.cisco.com/meraki/api-v1/#!import-organization-certificates - organizationId (string): Organization ID - - managedBy (string): Certificate managed by type [system_manager, mr, encrypted_syslog] + - managedBy (string): Certificate managed by type [system_manager, mr, encrypted_syslog, grpc_dial_out] - contents (string): Certificate content in valid PEM format - description (string): Certificate description """ @@ -3561,7 +3611,7 @@ def importOrganizationCertificates(self, organizationId: str, managedBy: str, co kwargs = locals() if "managedBy" in kwargs: - options = ["encrypted_syslog", "mr", "system_manager"] + options = ["encrypted_syslog", "grpc_dial_out", "mr", "system_manager"] assert kwargs["managedBy"] in options, ( f'''"managedBy" cannot be "{kwargs["managedBy"]}", & must be set to one of: {options}''' ) @@ -8587,6 +8637,25 @@ def getNetworkMoves(self, organizationId: str, total_pages=1, direction="next", return self._session.get_pages(metadata, resource, params, total_pages, direction) + def deleteOrganizationOpenRoamingCertificate(self, organizationId: str, id: str): + """ + **Delete an open roaming certificate.** + https://developer.cisco.com/meraki/api-v1/#!delete-organization-open-roaming-certificate + + - organizationId (string): Organization ID + - id (string): ID + """ + + metadata = { + "tags": ["organizations", "configure", "openRoaming", "certificates"], + "operation": "deleteOrganizationOpenRoamingCertificate", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + id = urllib.parse.quote(str(id), safe="") + resource = f"/organizations/{organizationId}/openRoaming/certificates/{id}" + + return self._session.delete(metadata, resource) + def getOrganizationOpenapiSpec(self, organizationId: str, **kwargs): """ **Return the OpenAPI Specification of the organization's API documentation in JSON** @@ -9813,6 +9882,7 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) - description (string): Description of the VRF (Virtual Routing and Forwarding) - routeDistinguisher (string): RD (Route Distinguisher) for the VRF (Virtual Routing and Forwarding) - routeTarget (string): Route target are used to control the import and export of routes between VRFs + - appliance (object): This parameter is used to enable or disable the VRF on the WAN appliance """ kwargs.update(locals()) @@ -9829,6 +9899,7 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) "description", "routeDistinguisher", "routeTarget", + "appliance", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -9840,6 +9911,47 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) return self._session.post(metadata, resource, payload) + def getOrganizationRoutingVrfsOverviewByVrf(self, organizationId: str, **kwargs): + """ + **List existing organization-wide VRFs (Virtual Routing and Forwarding) overviews.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-routing-vrfs-overview-by-vrf + + - organizationId (string): Organization ID + - vrfIds (array): IDs of the desired VRFs. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "monitor", "routing", "vrfs", "overview", "byVrf"], + "operation": "getOrganizationRoutingVrfsOverviewByVrf", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/routing/vrfs/overview/byVrf" + + query_params = [ + "vrfIds", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "vrfIds", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"getOrganizationRoutingVrfsOverviewByVrf: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get(metadata, resource, params) + def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs): """ **Update an organization-wide VRF (Virtual Routing and Forwarding)** @@ -9851,6 +9963,7 @@ def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs - description (string): Description of the VRF (Virtual Routing and Forwarding) - routeDistinguisher (string): RD (Route Distinguisher) for the VRF (Virtual Routing and Forwarding) - routeTarget (string): Route target are used to control the import and export of routes between VRFs + - appliance (object): This parameter is used to enable or disable the VRF on the WAN appliance """ kwargs.update(locals()) @@ -9868,6 +9981,7 @@ def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs "description", "routeDistinguisher", "routeTarget", + "appliance", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} diff --git a/meraki/aio/api/wireless.py b/meraki/aio/api/wireless.py index 87306a9..1135a51 100644 --- a/meraki/aio/api/wireless.py +++ b/meraki/aio/api/wireless.py @@ -808,7 +808,7 @@ def updateNetworkWirelessBluetoothSettings(self, networkId: str, **kwargs): - majorMinorAssignmentMode (string): The way major and minor number should be assigned to nodes in the network. ('Unique', 'Non-unique') - major (integer): The major number to be used in the beacon identifier. Only valid in 'Non-unique' mode. - minor (integer): The minor number to be used in the beacon identifier. Only valid in 'Non-unique' mode. - - transmit (object): Transmit settings including power, interval, and advertised power. + - transmit (object): Transmit settings. """ kwargs.update(locals()) @@ -2721,6 +2721,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs): - dnsRewrite (object): DNS servers rewrite settings - speedBurst (object): The SpeedBurst setting for this SSID' - namedVlans (object): Named VLAN settings. + - security (object): Security settings for the SSID - localAuthFallback (object): The current configuration for Local Authentication Fallback. Enables the Access Point (AP) to store client authentication data for a specified duration that can be adjusted as needed. - radiusAccountingStartDelay (integer): The delay (in seconds) before sending the first RADIUS accounting start message. Must be between 0 and 60 seconds. """ @@ -2874,6 +2875,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs): "dnsRewrite", "speedBurst", "namedVlans", + "security", "localAuthFallback", "radiusAccountingStartDelay", ] @@ -3661,7 +3663,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, * - useRedirectUrl (boolean): The Boolean indicating whether the the user will be redirected to the custom redirect URL after the splash page. A custom redirect URL must be set if this is true. - welcomeMessage (string): The welcome message for the users on the splash page. - language (string): Language of splash page. - - userConsent (object): User consent settings. + - userConsent (object): User consent settings - themeId (string): The id of the selected splash theme. - splashLogo (object): The logo used in the splash page. - splashImage (object): The image used in the splash page. @@ -4274,7 +4276,7 @@ def getOrganizationAssuranceWirelessExperienceChannelAvailabilityByNetworkByClie self, organizationId: str, total_pages=1, direction="next", **kwargs ): """ - **Summarizes wireless post connection capacity successes and failures by client OS.** + **Summarizes wireless post connection capacity successes and failures by client OS and driver version.** https://developer.cisco.com/meraki/api-v1/#!get-organization-assurance-wireless-experience-channel-availability-by-network-by-client-os - organizationId (string): Organization ID @@ -5316,7 +5318,7 @@ def getOrganizationAssuranceWirelessExperienceCoverageInsightsByNetwork( kwargs.update(locals()) if "contributor" in kwargs: - options = ["Admin power restriction", "Insufficient AP density", "Sticky client", "Weak client signal"] + options = ["Admin power restriction", "Insufficient AP density", "Sticky client", "Transient weak signal"] assert kwargs["contributor"] in options, ( f'''"contributor" cannot be "{kwargs["contributor"]}", & must be set to one of: {options}''' ) diff --git a/meraki/api/appliance.py b/meraki/api/appliance.py index 24b56d6..ae13c80 100644 --- a/meraki/api/appliance.py +++ b/meraki/api/appliance.py @@ -2032,6 +2032,7 @@ def createNetworkApplianceStaticRoute(self, networkId: str, name: str, subnet: s - subnet (string): Subnet of the route - gatewayIp (string): Gateway IP address (next hop) - gatewayVlanId (integer): Gateway VLAN ID + - vrf (object): VRF settings for the static route. """ kwargs.update(locals()) @@ -2048,6 +2049,7 @@ def createNetworkApplianceStaticRoute(self, networkId: str, name: str, subnet: s "subnet", "gatewayIp", "gatewayVlanId", + "vrf", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -2092,6 +2094,7 @@ def updateNetworkApplianceStaticRoute(self, networkId: str, staticRouteId: str, - enabled (boolean): Whether the route should be enabled or not - fixedIpAssignments (object): Fixed DHCP IP assignments on the route - reservedIpRanges (array): DHCP reserved IP ranges + - vrf (object): VRF settings for the static route. """ kwargs.update(locals()) @@ -2112,6 +2115,7 @@ def updateNetworkApplianceStaticRoute(self, networkId: str, staticRouteId: str, "enabled", "fixedIpAssignments", "reservedIpRanges", + "vrf", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -3166,6 +3170,41 @@ def updateNetworkApplianceVpnBgp(self, networkId: str, enabled: bool, **kwargs): return self._session.put(metadata, resource, payload) + def updateNetworkApplianceVpnSiteToSiteHubVrfs(self, networkId: str, hubNetworkId: str, _json: list, **kwargs): + """ + **Update the VRF mappings for a source network and hub pair.** + https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-vpn-site-to-site-hub-vrfs + + - networkId (string): Network ID + - hubNetworkId (string): Hub network ID + - _json (array): The list of VRFs for this source and hub mapping. + """ + + kwargs = locals() + + metadata = { + "tags": ["appliance", "configure", "vpn", "siteToSite", "hubs", "vrfs"], + "operation": "updateNetworkApplianceVpnSiteToSiteHubVrfs", + } + networkId = urllib.parse.quote(str(networkId), safe="") + hubNetworkId = urllib.parse.quote(str(hubNetworkId), safe="") + resource = f"/networks/{networkId}/appliance/vpn/siteToSite/hubs/{hubNetworkId}/vrfs" + + body_params = [ + "_json", + ] + payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} + + if self._session._validate_kwargs: + all_params = [] + body_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"updateNetworkApplianceVpnSiteToSiteHubVrfs: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.put(metadata, resource, payload) + def getNetworkApplianceVpnSiteToSiteVpn(self, networkId: str): """ **Return the site-to-site VPN settings of a network** @@ -3361,6 +3400,7 @@ def getOrganizationApplianceDevicesInterfacesPortsByDevice(self, organizationId: - organizationId (string): Organization ID - serials (array): Parameter to filter the results by device serials + - interfaces (array): Parameter to filter the results by specific interfaces - numbers (array): Parameter to filter the results by specific ports """ @@ -3375,12 +3415,14 @@ def getOrganizationApplianceDevicesInterfacesPortsByDevice(self, organizationId: query_params = [ "serials", + "interfaces", "numbers", ] params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} array_params = [ "serials", + "interfaces", "numbers", ] for k, v in kwargs.items(): @@ -4893,6 +4935,55 @@ def getOrganizationApplianceVpnRemoteAccessSecureClientTunnelCreationByClient(se return self._session.get(metadata, resource, params) + def getOrganizationApplianceVpnSiteToSiteHubsVrfs(self, organizationId: str, total_pages=1, direction="next", **kwargs): + """ + **Return source-to-hub VRF mappings for site-to-site VPN within an organization.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-vpn-site-to-site-hubs-vrfs + + - organizationId (string): Organization ID + - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages + - direction (string): direction to paginate, either "next" (default) or "prev" page + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 500. Default is 50. + - startingAfter (string): 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. + - endingBefore (string): 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. + - networkIds (array): Optional parameter to filter source-to-hub mappings by source network IDs. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["appliance", "configure", "vpn", "siteToSite", "hubs", "vrfs"], + "operation": "getOrganizationApplianceVpnSiteToSiteHubsVrfs", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/appliance/vpn/siteToSite/hubs/vrfs" + + query_params = [ + "perPage", + "startingAfter", + "endingBefore", + "networkIds", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "networkIds", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"getOrganizationApplianceVpnSiteToSiteHubsVrfs: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + def getOrganizationApplianceVpnSiteToSiteIpsecPeersSlas(self, organizationId: str): """ **Get the list of available IPsec SLA policies for an organization** diff --git a/meraki/api/batch/appliance.py b/meraki/api/batch/appliance.py index dc941fb..0cd65c9 100644 --- a/meraki/api/batch/appliance.py +++ b/meraki/api/batch/appliance.py @@ -1402,6 +1402,33 @@ def updateNetworkApplianceVpnBgp(self, networkId: str, enabled: bool, **kwargs): } return action + def updateNetworkApplianceVpnSiteToSiteHubVrfs(self, networkId: str, hubNetworkId: str, _json: list, **kwargs): + """ + **Update the VRF mappings for a source network and hub pair.** + https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-vpn-site-to-site-hub-vrfs + + - networkId (string): Network ID + - hubNetworkId (string): Hub network ID + - _json (array): The list of VRFs for this source and hub mapping. + """ + + kwargs = locals() + + networkId = urllib.parse.quote(networkId, safe="") + hubNetworkId = urllib.parse.quote(hubNetworkId, safe="") + resource = f"/networks/{networkId}/appliance/vpn/siteToSite/hubs/{hubNetworkId}/vrfs" + + body_params = [ + "_json", + ] + payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} + action = { + "resource": resource, + "operation": "update", + "body": payload, + } + return action + def updateNetworkApplianceVpnSiteToSiteVpn(self, networkId: str, mode: str, **kwargs): """ **Update the site-to-site VPN settings of a network. Only valid for MX networks in NAT mode.** diff --git a/meraki/api/batch/networks.py b/meraki/api/batch/networks.py index cc7f323..3b6e6d9 100644 --- a/meraki/api/batch/networks.py +++ b/meraki/api/batch/networks.py @@ -821,10 +821,17 @@ def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: in - port (integer): Host port though which the MQTT broker can be reached. - security (object): Security settings of the MQTT broker. - authentication (object): Authentication settings of the MQTT broker + - productType (string): The product type for which the MQTT broker is being created. """ kwargs.update(locals()) + if "productType" in kwargs: + options = ["camera", "wireless"] + assert kwargs["productType"] in options, ( + f'''"productType" cannot be "{kwargs["productType"]}", & must be set to one of: {options}''' + ) + networkId = urllib.parse.quote(networkId, safe="") resource = f"/networks/{networkId}/mqttBrokers" @@ -834,6 +841,7 @@ def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: in "port", "security", "authentication", + "productType", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} action = { diff --git a/meraki/api/batch/organizations.py b/meraki/api/batch/organizations.py index cfe628f..f01a712 100644 --- a/meraki/api/batch/organizations.py +++ b/meraki/api/batch/organizations.py @@ -630,7 +630,7 @@ def importOrganizationCertificates(self, organizationId: str, managedBy: str, co https://developer.cisco.com/meraki/api-v1/#!import-organization-certificates - organizationId (string): Organization ID - - managedBy (string): Certificate managed by type [system_manager, mr, encrypted_syslog] + - managedBy (string): Certificate managed by type [system_manager, mr, encrypted_syslog, grpc_dial_out] - contents (string): Certificate content in valid PEM format - description (string): Certificate description """ @@ -638,7 +638,7 @@ def importOrganizationCertificates(self, organizationId: str, managedBy: str, co kwargs = locals() if "managedBy" in kwargs: - options = ["encrypted_syslog", "mr", "system_manager"] + options = ["encrypted_syslog", "grpc_dial_out", "mr", "system_manager"] assert kwargs["managedBy"] in options, ( f'''"managedBy" cannot be "{kwargs["managedBy"]}", & must be set to one of: {options}''' ) @@ -1761,6 +1761,25 @@ def bulkOrganizationNetworksGroupUnassign(self, organizationId: str, groupId: st } return action + def deleteOrganizationOpenRoamingCertificate(self, organizationId: str, id: str): + """ + **Delete an open roaming certificate.** + https://developer.cisco.com/meraki/api-v1/#!delete-organization-open-roaming-certificate + + - organizationId (string): Organization ID + - id (string): ID + """ + + organizationId = urllib.parse.quote(organizationId, safe="") + id = urllib.parse.quote(id, safe="") + resource = f"/organizations/{organizationId}/openRoaming/certificates/{id}" + + action = { + "resource": resource, + "operation": "destroy", + } + return action + def createOrganizationPoliciesGlobalFirewallRuleset(self, organizationId: str, name: str, **kwargs): """ **Create an Organization-Wide Policy Firewall Ruleset** @@ -2351,6 +2370,7 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) - description (string): Description of the VRF (Virtual Routing and Forwarding) - routeDistinguisher (string): RD (Route Distinguisher) for the VRF (Virtual Routing and Forwarding) - routeTarget (string): Route target are used to control the import and export of routes between VRFs + - appliance (object): This parameter is used to enable or disable the VRF on the WAN appliance """ kwargs.update(locals()) @@ -2363,6 +2383,7 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) "description", "routeDistinguisher", "routeTarget", + "appliance", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} action = { @@ -2383,6 +2404,7 @@ def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs - description (string): Description of the VRF (Virtual Routing and Forwarding) - routeDistinguisher (string): RD (Route Distinguisher) for the VRF (Virtual Routing and Forwarding) - routeTarget (string): Route target are used to control the import and export of routes between VRFs + - appliance (object): This parameter is used to enable or disable the VRF on the WAN appliance """ kwargs.update(locals()) @@ -2396,6 +2418,7 @@ def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs "description", "routeDistinguisher", "routeTarget", + "appliance", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} action = { diff --git a/meraki/api/batch/wireless.py b/meraki/api/batch/wireless.py index f529ffa..8714267 100644 --- a/meraki/api/batch/wireless.py +++ b/meraki/api/batch/wireless.py @@ -904,6 +904,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs): - dnsRewrite (object): DNS servers rewrite settings - speedBurst (object): The SpeedBurst setting for this SSID' - namedVlans (object): Named VLAN settings. + - security (object): Security settings for the SSID - localAuthFallback (object): The current configuration for Local Authentication Fallback. Enables the Access Point (AP) to store client authentication data for a specified duration that can be adjusted as needed. - radiusAccountingStartDelay (integer): The delay (in seconds) before sending the first RADIUS accounting start message. Must be between 0 and 60 seconds. """ @@ -1053,6 +1054,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs): "dnsRewrite", "speedBurst", "namedVlans", + "security", "localAuthFallback", "radiusAccountingStartDelay", ] @@ -1541,7 +1543,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, * - useRedirectUrl (boolean): The Boolean indicating whether the the user will be redirected to the custom redirect URL after the splash page. A custom redirect URL must be set if this is true. - welcomeMessage (string): The welcome message for the users on the splash page. - language (string): Language of splash page. - - userConsent (object): User consent settings. + - userConsent (object): User consent settings - themeId (string): The id of the selected splash theme. - splashLogo (object): The logo used in the splash page. - splashImage (object): The image used in the splash page. diff --git a/meraki/api/networks.py b/meraki/api/networks.py index 9e7c4c4..7310750 100644 --- a/meraki/api/networks.py +++ b/meraki/api/networks.py @@ -855,6 +855,23 @@ def vmxNetworkDevicesClaim(self, networkId: str, size: str, **kwargs): return self._session.post(metadata, resource, payload) + def getNetworkDevicesJson(self, networkId: str): + """ + **Extraction of the legacy nodes JSON endpoint for a network** + https://developer.cisco.com/meraki/api-v1/#!get-network-devices-json + + - networkId (string): Network ID + """ + + metadata = { + "tags": ["networks", "configure", "devices", "json"], + "operation": "getNetworkDevicesJson", + } + networkId = urllib.parse.quote(str(networkId), safe="") + resource = f"/networks/{networkId}/devices/json" + + return self._session.get(metadata, resource) + def removeNetworkDevices(self, networkId: str, serial: str, **kwargs): """ **Remove a single device** @@ -2210,14 +2227,17 @@ def updateNetworkMerakiAuthUser(self, networkId: str, merakiAuthUserId: str, **k return self._session.put(metadata, resource, payload) - def getNetworkMqttBrokers(self, networkId: str): + def getNetworkMqttBrokers(self, networkId: str, **kwargs): """ **List the MQTT brokers for this network** https://developer.cisco.com/meraki/api-v1/#!get-network-mqtt-brokers - networkId (string): Network ID + - productTypes (array): Optional parameter to filter MQTT brokers by product type. If multiple types are provided, the query will return brokers that match any of the provided types. """ + kwargs.update(locals()) + metadata = { "tags": ["networks", "configure", "mqttBrokers"], "operation": "getNetworkMqttBrokers", @@ -2225,7 +2245,26 @@ def getNetworkMqttBrokers(self, networkId: str): networkId = urllib.parse.quote(str(networkId), safe="") resource = f"/networks/{networkId}/mqttBrokers" - return self._session.get(metadata, resource) + query_params = [ + "productTypes", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "productTypes", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning(f"getNetworkMqttBrokers: ignoring unrecognized kwargs: {invalid}") + + return self._session.get(metadata, resource, params) def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: int, **kwargs): """ @@ -2238,10 +2277,17 @@ def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: in - port (integer): Host port though which the MQTT broker can be reached. - security (object): Security settings of the MQTT broker. - authentication (object): Authentication settings of the MQTT broker + - productType (string): The product type for which the MQTT broker is being created. """ kwargs.update(locals()) + if "productType" in kwargs: + options = ["camera", "wireless"] + assert kwargs["productType"] in options, ( + f'''"productType" cannot be "{kwargs["productType"]}", & must be set to one of: {options}''' + ) + metadata = { "tags": ["networks", "configure", "mqttBrokers"], "operation": "createNetworkMqttBroker", @@ -2255,6 +2301,7 @@ def createNetworkMqttBroker(self, networkId: str, name: str, host: str, port: in "port", "security", "authentication", + "productType", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} diff --git a/meraki/api/organizations.py b/meraki/api/organizations.py index 61db38e..a72cdfd 100644 --- a/meraki/api/organizations.py +++ b/meraki/api/organizations.py @@ -2972,6 +2972,56 @@ def getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClien return self._session.get(metadata, resource, params) + def getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClientOs(self, organizationId: str, **kwargs): + """ + **Summarizes wired connection successes and failures by client OS.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-assurance-wired-experience-successful-connections-by-network-by-client-os + + - organizationId (string): Organization ID + - networkIds (array): Filter results by network. + - serials (array): Filter results by device serial. + - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 14 days from today. + - t1 (string): The end of the timespan for the data. t1 can be a maximum of 14 days after t0. + - timespan (number): 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 greater than or equal to 15 minutes and be less than or equal to 14 days. The default is 2 hours. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "wired", "experience", "successfulConnections", "byNetwork", "byClientOs"], + "operation": "getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClientOs", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/assurance/wired/experience/successfulConnections/byNetwork/byClientOs" + + query_params = [ + "networkIds", + "serials", + "t0", + "t1", + "timespan", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "networkIds", + "serials", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByClientOs: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get(metadata, resource, params) + def getOrganizationAssuranceWiredExperienceSuccessfulConnectionsByNetworkByDevice( self, organizationId: str, total_pages=1, direction="next", **kwargs ): @@ -3553,7 +3603,7 @@ def importOrganizationCertificates(self, organizationId: str, managedBy: str, co https://developer.cisco.com/meraki/api-v1/#!import-organization-certificates - organizationId (string): Organization ID - - managedBy (string): Certificate managed by type [system_manager, mr, encrypted_syslog] + - managedBy (string): Certificate managed by type [system_manager, mr, encrypted_syslog, grpc_dial_out] - contents (string): Certificate content in valid PEM format - description (string): Certificate description """ @@ -3561,7 +3611,7 @@ def importOrganizationCertificates(self, organizationId: str, managedBy: str, co kwargs = locals() if "managedBy" in kwargs: - options = ["encrypted_syslog", "mr", "system_manager"] + options = ["encrypted_syslog", "grpc_dial_out", "mr", "system_manager"] assert kwargs["managedBy"] in options, ( f'''"managedBy" cannot be "{kwargs["managedBy"]}", & must be set to one of: {options}''' ) @@ -8587,6 +8637,25 @@ def getNetworkMoves(self, organizationId: str, total_pages=1, direction="next", return self._session.get_pages(metadata, resource, params, total_pages, direction) + def deleteOrganizationOpenRoamingCertificate(self, organizationId: str, id: str): + """ + **Delete an open roaming certificate.** + https://developer.cisco.com/meraki/api-v1/#!delete-organization-open-roaming-certificate + + - organizationId (string): Organization ID + - id (string): ID + """ + + metadata = { + "tags": ["organizations", "configure", "openRoaming", "certificates"], + "operation": "deleteOrganizationOpenRoamingCertificate", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + id = urllib.parse.quote(str(id), safe="") + resource = f"/organizations/{organizationId}/openRoaming/certificates/{id}" + + return self._session.delete(metadata, resource) + def getOrganizationOpenapiSpec(self, organizationId: str, **kwargs): """ **Return the OpenAPI Specification of the organization's API documentation in JSON** @@ -9813,6 +9882,7 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) - description (string): Description of the VRF (Virtual Routing and Forwarding) - routeDistinguisher (string): RD (Route Distinguisher) for the VRF (Virtual Routing and Forwarding) - routeTarget (string): Route target are used to control the import and export of routes between VRFs + - appliance (object): This parameter is used to enable or disable the VRF on the WAN appliance """ kwargs.update(locals()) @@ -9829,6 +9899,7 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) "description", "routeDistinguisher", "routeTarget", + "appliance", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -9840,6 +9911,47 @@ def createOrganizationRoutingVrf(self, organizationId: str, name: str, **kwargs) return self._session.post(metadata, resource, payload) + def getOrganizationRoutingVrfsOverviewByVrf(self, organizationId: str, **kwargs): + """ + **List existing organization-wide VRFs (Virtual Routing and Forwarding) overviews.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-routing-vrfs-overview-by-vrf + + - organizationId (string): Organization ID + - vrfIds (array): IDs of the desired VRFs. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "monitor", "routing", "vrfs", "overview", "byVrf"], + "operation": "getOrganizationRoutingVrfsOverviewByVrf", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/routing/vrfs/overview/byVrf" + + query_params = [ + "vrfIds", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "vrfIds", + ] + for k, v in kwargs.items(): + if k.strip() in array_params: + params[f"{k.strip()}[]"] = kwargs[f"{k}"] + params.pop(k.strip()) + + if self._session._validate_kwargs: + all_params = query_params + array_params + invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"] + if invalid and self._session._logger: + self._session._logger.warning( + f"getOrganizationRoutingVrfsOverviewByVrf: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get(metadata, resource, params) + def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs): """ **Update an organization-wide VRF (Virtual Routing and Forwarding)** @@ -9851,6 +9963,7 @@ def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs - description (string): Description of the VRF (Virtual Routing and Forwarding) - routeDistinguisher (string): RD (Route Distinguisher) for the VRF (Virtual Routing and Forwarding) - routeTarget (string): Route target are used to control the import and export of routes between VRFs + - appliance (object): This parameter is used to enable or disable the VRF on the WAN appliance """ kwargs.update(locals()) @@ -9868,6 +9981,7 @@ def updateOrganizationRoutingVrf(self, organizationId: str, vrfId: str, **kwargs "description", "routeDistinguisher", "routeTarget", + "appliance", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} diff --git a/meraki/api/wireless.py b/meraki/api/wireless.py index 0390741..6c77bc4 100644 --- a/meraki/api/wireless.py +++ b/meraki/api/wireless.py @@ -808,7 +808,7 @@ def updateNetworkWirelessBluetoothSettings(self, networkId: str, **kwargs): - majorMinorAssignmentMode (string): The way major and minor number should be assigned to nodes in the network. ('Unique', 'Non-unique') - major (integer): The major number to be used in the beacon identifier. Only valid in 'Non-unique' mode. - minor (integer): The minor number to be used in the beacon identifier. Only valid in 'Non-unique' mode. - - transmit (object): Transmit settings including power, interval, and advertised power. + - transmit (object): Transmit settings. """ kwargs.update(locals()) @@ -2721,6 +2721,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs): - dnsRewrite (object): DNS servers rewrite settings - speedBurst (object): The SpeedBurst setting for this SSID' - namedVlans (object): Named VLAN settings. + - security (object): Security settings for the SSID - localAuthFallback (object): The current configuration for Local Authentication Fallback. Enables the Access Point (AP) to store client authentication data for a specified duration that can be adjusted as needed. - radiusAccountingStartDelay (integer): The delay (in seconds) before sending the first RADIUS accounting start message. Must be between 0 and 60 seconds. """ @@ -2874,6 +2875,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs): "dnsRewrite", "speedBurst", "namedVlans", + "security", "localAuthFallback", "radiusAccountingStartDelay", ] @@ -3661,7 +3663,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, * - useRedirectUrl (boolean): The Boolean indicating whether the the user will be redirected to the custom redirect URL after the splash page. A custom redirect URL must be set if this is true. - welcomeMessage (string): The welcome message for the users on the splash page. - language (string): Language of splash page. - - userConsent (object): User consent settings. + - userConsent (object): User consent settings - themeId (string): The id of the selected splash theme. - splashLogo (object): The logo used in the splash page. - splashImage (object): The image used in the splash page. @@ -4274,7 +4276,7 @@ def getOrganizationAssuranceWirelessExperienceChannelAvailabilityByNetworkByClie self, organizationId: str, total_pages=1, direction="next", **kwargs ): """ - **Summarizes wireless post connection capacity successes and failures by client OS.** + **Summarizes wireless post connection capacity successes and failures by client OS and driver version.** https://developer.cisco.com/meraki/api-v1/#!get-organization-assurance-wireless-experience-channel-availability-by-network-by-client-os - organizationId (string): Organization ID @@ -5316,7 +5318,7 @@ def getOrganizationAssuranceWirelessExperienceCoverageInsightsByNetwork( kwargs.update(locals()) if "contributor" in kwargs: - options = ["Admin power restriction", "Insufficient AP density", "Sticky client", "Weak client signal"] + options = ["Admin power restriction", "Insufficient AP density", "Sticky client", "Transient weak signal"] assert kwargs["contributor"] in options, ( f'''"contributor" cannot be "{kwargs["contributor"]}", & must be set to one of: {options}''' ) diff --git a/pyproject.toml b/pyproject.toml index a340392..75afd8c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "meraki" -version = "3.1.0b0" +version = "3.1.0b1" description = "Cisco Meraki Dashboard API library" authors = [ {name = "Cisco Meraki", email = "api-feedback@meraki.net"} diff --git a/uv.lock b/uv.lock index 04ba9e4..39f4f29 100644 --- a/uv.lock +++ b/uv.lock @@ -521,7 +521,7 @@ wheels = [ [[package]] name = "meraki" -version = "3.1.0b0" +version = "3.1.0b1" source = { editable = "." } dependencies = [ { name = "aiohttp" },