From 0528e1088a15f45ec01a0391b2ac704dc22a18b2 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 30 Sep 2026 14:23:16 +0000 Subject: [PATCH] Auto-generated library v4.5.0b4 for API v1.74.0-beta.4. --- CHANGELOG.md | 6 + changelog.d/472.fixed.md | 1 - docs/generation-report.md | 6 + meraki/__init__.py | 2 +- meraki/_version.py | 2 +- meraki/aio/api/appliance.py | 2 +- meraki/aio/api/campusGateway.py | 202 +++++++++++++ meraki/aio/api/organizations.py | 467 ++++++++++++++++-------------- meraki/aio/api/spaces.py | 31 ++ meraki/aio/api/switch.py | 17 +- meraki/aio/api/users.py | 18 +- meraki/api/appliance.py | 2 +- meraki/api/batch/campusGateway.py | 75 +++++ meraki/api/batch/organizations.py | 118 ++++++-- meraki/api/batch/spaces.py | 25 ++ meraki/api/batch/switch.py | 4 +- meraki/api/batch/users.py | 18 +- meraki/api/campusGateway.py | 202 +++++++++++++ meraki/api/organizations.py | 467 ++++++++++++++++-------------- meraki/api/spaces.py | 31 ++ meraki/api/switch.py | 17 +- meraki/api/users.py | 18 +- pyproject.toml | 2 +- uv.lock | 2 +- 24 files changed, 1250 insertions(+), 485 deletions(-) delete mode 100644 changelog.d/472.fixed.md diff --git a/CHANGELOG.md b/CHANGELOG.md index ef55270a..9161807e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,3 +7,9 @@ add a news fragment under `changelog.d/` for every user-facing change. See [CONTRIBUTING.md](CONTRIBUTING.md) for the fragment format. + +## 4.5.0b4 (2026-09-30) + +### Fixed + +- `DashboardAPI` and `AsyncDashboardAPI` now expose the `nac`, `secureConnect`, `support`, `users`, and `assistant` categories. They were generated but never registered, so accessing them raised `AttributeError` even though the underlying API methods worked. ([#472](https://github.com/meraki/dashboard-api-python/issues/472)) diff --git a/changelog.d/472.fixed.md b/changelog.d/472.fixed.md deleted file mode 100644 index 3e70c01d..00000000 --- a/changelog.d/472.fixed.md +++ /dev/null @@ -1 +0,0 @@ -`DashboardAPI` and `AsyncDashboardAPI` now expose the `nac`, `secureConnect`, `support`, `users`, and `assistant` categories. They were generated but never registered, so accessing them raised `AttributeError` even though the underlying API methods worked. diff --git a/docs/generation-report.md b/docs/generation-report.md index 04a4ebd9..46c69627 100644 --- a/docs/generation-report.md +++ b/docs/generation-report.md @@ -1,5 +1,11 @@ # Generation Report +## 2026-09-30 | Library v4.5.0b4 | API 1.74.0-beta.4 + + +No Python keyword parameter conflicts detected. + + ## 2026-09-23 | Library v4.5.0b3 | API 1.74.0-beta.3 diff --git a/meraki/__init__.py b/meraki/__init__.py index 0ee6243f..b20efe81 100644 --- a/meraki/__init__.py +++ b/meraki/__init__.py @@ -57,7 +57,7 @@ from meraki.exceptions import APIError, APIKeyError, APIResponseError, AsyncAPIError from meraki.rest_session import RestSession -__api_version__ = "1.74.0-beta.3" +__api_version__ = "1.74.0-beta.4" __all__ = [ "APIError", diff --git a/meraki/_version.py b/meraki/_version.py index a161ce32..885b52e7 100644 --- a/meraki/_version.py +++ b/meraki/_version.py @@ -1 +1 @@ -__version__ = "4.5.0b3" +__version__ = "4.5.0b4" diff --git a/meraki/aio/api/appliance.py b/meraki/aio/api/appliance.py index 9281d2ab..013f1cbf 100644 --- a/meraki/aio/api/appliance.py +++ b/meraki/aio/api/appliance.py @@ -5704,7 +5704,7 @@ def getOrganizationApplianceUmbrellaPoliciesByNetwork( def getOrganizationApplianceUplinkStatuses(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ - **List the uplink status of every Meraki MX and Z series appliances in the organization** + **List the uplink status of every Meraki MX appliance, Z series appliance, and Secure Router in the organization** https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-uplink-statuses - organizationId (string): Organization ID diff --git a/meraki/aio/api/campusGateway.py b/meraki/aio/api/campusGateway.py index 591f82b4..09c0a5fe 100644 --- a/meraki/aio/api/campusGateway.py +++ b/meraki/aio/api/campusGateway.py @@ -941,3 +941,205 @@ def getOrganizationCampusGatewayDevicesUplinksLocalOverridesByDevice( ) return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def getOrganizationCampusGatewayMdnsServices(self, organizationId: str, total_pages=1, direction="next", **kwargs): + """ + **List mDNS service definitions visible to the caller in an organization.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-campus-gateway-mdns-services + + - 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 + - keys (array): Exact service key filter. Maximum 100 values. + - types (array): Exact canonical DNS-SD service type filter. Maximum 100 values. + - name (string): Case-insensitive partial display-name filter. + - scopes (array): Exact service-scope filter. Maximum 100 values. + - networkIds (array): Network filter for network-scoped custom services. Maximum 100 values. + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services"], + "operation": "getOrganizationCampusGatewayMdnsServices", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services" + + query_params = [ + "keys", + "types", + "name", + "scopes", + "networkIds", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "keys", + "types", + "scopes", + "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"getOrganizationCampusGatewayMdnsServices: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def getOrganizationCampusGatewayMdnsServicesAssignments( + self, organizationId: str, total_pages=1, direction="next", **kwargs + ): + """ + **List active mDNS service assignments on concrete SSIDs visible to the caller.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-campus-gateway-mdns-services-assignments + + - 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 + - keys (array): Exact service key filter. Maximum 100 values. + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "assignments"], + "operation": "getOrganizationCampusGatewayMdnsServicesAssignments", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/assignments" + + query_params = [ + "keys", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "keys", + ] + 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"getOrganizationCampusGatewayMdnsServicesAssignments: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def createOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, name: str, types: list, **kwargs): + """ + **Create an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!create-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - name (string): Display name of the custom mDNS service. + - types (array): One to ten DNS-SD service types. Accepted shorthand is normalized by the API. + """ + + kwargs = locals() + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "custom"], + "operation": "createOrganizationCampusGatewayMdnsServicesCustom", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom" + + body_params = [ + "name", + "types", + ] + 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"createOrganizationCampusGatewayMdnsServicesCustom: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.post(metadata, resource, payload) + + def updateOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, key: str, **kwargs): + """ + **Update an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!update-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - key (string): Key + - name (string): Updated display name of the custom mDNS service. + - types (array): Replacement ordered list of one to ten DNS-SD service types. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "custom"], + "operation": "updateOrganizationCampusGatewayMdnsServicesCustom", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + key = urllib.parse.quote(str(key), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom/{key}" + + body_params = [ + "name", + "types", + ] + 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"updateOrganizationCampusGatewayMdnsServicesCustom: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.put(metadata, resource, payload) + + def deleteOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, key: str): + """ + **Delete an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!delete-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - key (string): Key + """ + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "custom"], + "operation": "deleteOrganizationCampusGatewayMdnsServicesCustom", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + key = urllib.parse.quote(str(key), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom/{key}" + + return self._session.delete(metadata, resource) diff --git a/meraki/aio/api/organizations.py b/meraki/aio/api/organizations.py index df3b2bcd..693fd9ad 100644 --- a/meraki/aio/api/organizations.py +++ b/meraki/aio/api/organizations.py @@ -4108,6 +4108,7 @@ def createOrganizationBrandingPolicy(self, organizationId: str, name: str, **kwa - organizationId (string): Organization ID - name (string): Name of the Dashboard branding policy. - enabled (boolean): Boolean indicating whether this policy is enabled. + - appearance (object): Dashboard appearance settings. - adminSettings (object): Settings for describing which kinds of admins this policy applies to. - helpSettings (object): Settings for describing the modifications to various Help page features. Each property in this object accepts one of 'default or inherit' (do not modify functionality), 'hide' (remove the section from Dashboard), or 'show' (always show @@ -4129,6 +4130,7 @@ def createOrganizationBrandingPolicy(self, organizationId: str, name: str, **kwa body_params = [ "name", "enabled", + "appearance", "adminSettings", "helpSettings", "customLogo", @@ -4222,6 +4224,7 @@ def updateOrganizationBrandingPolicy(self, organizationId: str, brandingPolicyId - brandingPolicyId (string): Branding policy ID - name (string): Name of the Dashboard branding policy. - enabled (boolean): Boolean indicating whether this policy is enabled. + - appearance (object): Dashboard appearance settings. - adminSettings (object): Settings for describing which kinds of admins this policy applies to. - helpSettings (object): Settings for describing the modifications to various Help page features. Each property in this object accepts one of 'default or inherit' (do not modify functionality), 'hide' (remove the section from Dashboard), or 'show' (always show @@ -4244,6 +4247,7 @@ def updateOrganizationBrandingPolicy(self, organizationId: str, brandingPolicyId body_params = [ "name", "enabled", + "appearance", "adminSettings", "helpSettings", "customLogo", @@ -4785,7 +4789,7 @@ def getOrganizationClientsBandwidthUsageHistory(self, organizationId: str, **kwa def getOrganizationClientsOverview(self, organizationId: str, **kwargs): """ - **Return summary information around client data usage (in kb) across the given organization.** + **Return summary information around client data usage in MiB across the given organization.** https://developer.cisco.com/meraki/api-v1/#!get-organization-clients-overview - organizationId (string): Organization ID @@ -9751,26 +9755,6 @@ def getAccount(self, organizationId: str, accountId: str): return self._session.get(metadata, resource) - def getAccountStatuses(self, organizationId: str, accountId: str): - """ - **Returns the recorded lifecycle history for the account identified by - `accountId`** - https://developer.cisco.com/meraki/api-v1/#!get-account-statuses - - - organizationId (string): Organization ID - - accountId (string): Account ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "accounts", "statuses"], - "operation": "getAccountStatuses", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - accountId = urllib.parse.quote(str(accountId), safe="") - resource = f"/organizations/{organizationId}/mcf/accounts/{accountId}/statuses" - - return self._session.get(metadata, resource) - def getBgpSessionStatus(self, organizationId: str, **kwargs): """ **Returns aligned aggregate and member BGP-session-health series for @@ -10508,6 +10492,43 @@ def deleteIntegration(self, organizationId: str, integrationId: str): return self._session.delete(metadata, resource) + def updateIntegrationCredentials(self, organizationId: str, integrationId: str, **kwargs): + """ + **Replace the principal for an existing cloud integration while preserving integration, account, and network state** + https://developer.cisco.com/meraki/api-v1/#!update-integration-credentials + + - organizationId (string): Organization ID + - integrationId (string): Integration ID + - aws (object): Replacement AWS IAM role principal for an existing integration + - azure (object): Replacement Azure service principal credentials for an existing integration + - gcp (object): Replacement GCP service account key JSON for an existing integration + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "mcf", "integrations"], + "operation": "updateIntegrationCredentials", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + integrationId = urllib.parse.quote(str(integrationId), safe="") + resource = f"/organizations/{organizationId}/mcf/integrations/{integrationId}/credentials" + + body_params = [ + "aws", + "azure", + "gcp", + ] + 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"updateIntegrationCredentials: ignoring unrecognized kwargs: {invalid}") + + return self._session.put(metadata, resource, payload) + def rotateIntegrationCredentials(self, organizationId: str, integrationId: str, **kwargs): """ **Replaces secret material for an existing Microsoft Azure or Google Cloud integration after validating that the credential belongs to the existing principal** @@ -10562,25 +10583,6 @@ def discoverIntegration(self, organizationId: str, integrationId: str): return self._session.post(metadata, resource) - def getIntegrationStatuses(self, organizationId: str, integrationId: str): - """ - **Returns the recorded lifecycle history for the cloud integration identified by `integrationId`** - https://developer.cisco.com/meraki/api-v1/#!get-integration-statuses - - - organizationId (string): Organization ID - - integrationId (string): Integration ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "integrations", "statuses"], - "operation": "getIntegrationStatuses", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - integrationId = urllib.parse.quote(str(integrationId), safe="") - resource = f"/organizations/{organizationId}/mcf/integrations/{integrationId}/statuses" - - return self._session.get(metadata, resource) - def listRegions(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ **Returns cloud-provider region records correlated with MCN vPOP capacity** @@ -10816,180 +10818,6 @@ def confirmRemovedResource(self, organizationId: str, resourceType: str, resourc return self._session.post(metadata, resource, payload) - def listRouteTableAssociations(self, organizationId: str, total_pages=1, direction="next", **kwargs): - """ - **Lists discovered associations between cloud route tables and VPCs or - subnets in the Meraki Dashboard organization** - https://developer.cisco.com/meraki/api-v1/#!list-route-table-associations - - - 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 - - routeTableId (string): MCN-assigned UUID of the route table whose associations are returned. - - vpcId (string): MCN-assigned UUID of the VPC whose route-table associations are - returned. If deprecated `networkId` is also supplied, the UUIDs must - match. - - subnetId (string): MCN-assigned UUID of the subnet whose association is returned. - - scope (string): Restricts results by association scope. - - - `vpc` — Preferred request alias for a VPC-level association; - responses use `network`. - - `network` — Deprecated: Legacy request value for the same VPC-level - scope. Responses return `network` for compatibility. - - `subnet` — Association between a route table and one subnet. - - isDefault (boolean): Restricts results by provider default-association designation. `true` - returns default associations; `false` returns non-default - associations. Omission does not filter by this designation. - - perPage (integer): Requested maximum number of matching resources to return. The default and maximum, and whether this parameter is applied, are defined by the operation. A response can contain fewer resources than requested. - - startingAfter (string): Forward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - - endingBefore (string): Backward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - """ - - kwargs.update(locals()) - - if "scope" in kwargs: - options = ["network", "subnet", "vpc"] - assert kwargs["scope"] in options, f'''"scope" cannot be "{kwargs["scope"]}", & must be set to one of: {options}''' - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTableAssociations"], - "operation": "listRouteTableAssociations", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTableAssociations" - - query_params = [ - "routeTableId", - "vpcId", - "subnetId", - "scope", - "isDefault", - "perPage", - "startingAfter", - "endingBefore", - ] - params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} - - if self._session._validate_kwargs: - all_params = query_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"listRouteTableAssociations: ignoring unrecognized kwargs: {invalid}") - - return self._session.get_pages(metadata, resource, params, total_pages, direction) - - def getRouteTableAssociation(self, organizationId: str, associationId: str): - """ - **Returns one discovered association between a cloud route table and a VPC - or subnet, selected by its MCN-assigned UUID.** - https://developer.cisco.com/meraki/api-v1/#!get-route-table-association - - - organizationId (string): Organization ID - - associationId (string): Association ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTableAssociations"], - "operation": "getRouteTableAssociation", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - associationId = urllib.parse.quote(str(associationId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTableAssociations/{associationId}" - - return self._session.get(metadata, resource) - - def listRouteTables(self, organizationId: str, total_pages=1, direction="next", **kwargs): - """ - **Lists route tables discovered for cloud accounts in the Meraki Dashboard - organization** - https://developer.cisco.com/meraki/api-v1/#!list-route-tables - - - 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 - - provider (string): Restricts results by the route table's cloud provider. - - - `aws` — Amazon Web Services route tables. - - `azure` — Microsoft Azure route tables. - - `gcp` — Google Cloud route tables. - - accountId (string): MCN-assigned UUID of the cloud account whose route tables are returned. - - vpcId (string): MCN-assigned UUID of the VPC whose network-scoped route tables are - returned. If the deprecated `networkId` is also supplied, the UUIDs - must match. - - isDefault (boolean): Restricts results by provider default-route-table designation. - `true` returns default route tables; `false` returns non-default - route tables. Omission does not filter by this designation. - - scope (string): Restricts results by route-table scope. - - - `vpc` — Preferred request alias for a route table attached to one - VPC; responses use `network`. - - `network` — Deprecated: Legacy request value for the same VPC-level - scope. Responses return `network` for compatibility. - - `global` — Provider-wide route table that is not confined to one - VPC. - - perPage (integer): Requested maximum number of matching resources to return. The default and maximum, and whether this parameter is applied, are defined by the operation. A response can contain fewer resources than requested. - - startingAfter (string): Forward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - - endingBefore (string): Backward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - """ - - kwargs.update(locals()) - - if "provider" in kwargs: - options = ["aws", "azure", "gcp"] - assert kwargs["provider"] in options, ( - f'''"provider" cannot be "{kwargs["provider"]}", & must be set to one of: {options}''' - ) - if "scope" in kwargs: - options = ["global", "network", "vpc"] - assert kwargs["scope"] in options, f'''"scope" cannot be "{kwargs["scope"]}", & must be set to one of: {options}''' - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTables"], - "operation": "listRouteTables", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTables" - - query_params = [ - "provider", - "accountId", - "vpcId", - "isDefault", - "scope", - "perPage", - "startingAfter", - "endingBefore", - ] - params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} - - if self._session._validate_kwargs: - all_params = query_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"listRouteTables: ignoring unrecognized kwargs: {invalid}") - - return self._session.get_pages(metadata, resource, params, total_pages, direction) - - def getRouteTable(self, organizationId: str, routeTableId: str): - """ - **Returns one discovered cloud-provider route table by its MCN-assigned - UUID** - https://developer.cisco.com/meraki/api-v1/#!get-route-table - - - organizationId (string): Organization ID - - routeTableId (string): Route table ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTables"], - "operation": "getRouteTable", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - routeTableId = urllib.parse.quote(str(routeTableId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTables/{routeTableId}" - - return self._session.get(metadata, resource) - def listSites(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ **Returns Meraki network records represented as MCN Sites for site-to-cloud connectivity in the specified organization** @@ -11110,6 +10938,24 @@ def getSite(self, organizationId: str, siteId: str): return self._session.get(metadata, resource) + def getSummary(self, organizationId: str): + """ + **Returns the aggregate values required to populate organization summary + cards** + https://developer.cisco.com/meraki/api-v1/#!get-summary + + - organizationId (string): Organization ID + """ + + metadata = { + "tags": ["organizations", "configure", "mcf", "summary"], + "operation": "getSummary", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/mcf/summary" + + return self._session.get(metadata, resource) + def listTags(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ **Lists discovery-visible canonical tags for the Meraki Dashboard @@ -13088,6 +12934,199 @@ def deleteOrganizationPoliciesGlobalGroupPoliciesFirewallRulesetsAssignment(self return self._session.delete(metadata, resource) + def getOrganizationPoliciesGlobalGroupPoliciesNetworks( + self, organizationId: str, total_pages=1, direction="next", **kwargs + ): + """ + **List all available Network Enforcement Targets for an Organization and their associated Organization-Wide Policies if applicable** + https://developer.cisco.com/meraki/api-v1/#!get-organization-policies-global-group-policies-networks + + - 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 + - policyIds (array): Filter network enforcement targets by policy IDs + - networkIds (array): Filter network enforcement targets by network IDs + - firewallTypes (array): Filter network enforcement targets by firewall enforcement types for a network + - name (string): Filter network enforcement targets by network name with support for partial matches. Case insensitive. + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 100. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks"], + "operation": "getOrganizationPoliciesGlobalGroupPoliciesNetworks", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks" + + query_params = [ + "policyIds", + "networkIds", + "firewallTypes", + "name", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "policyIds", + "networkIds", + "firewallTypes", + ] + 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"getOrganizationPoliciesGlobalGroupPoliciesNetworks: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def getOrganizationPoliciesGlobalGroupPoliciesNetworksAssignments( + self, organizationId: str, total_pages=1, direction="next", **kwargs + ): + """ + **List Network Enforcement Target Assignments for Organization-Wide policies for the specified organization** + https://developer.cisco.com/meraki/api-v1/#!get-organization-policies-global-group-policies-networks-assignments + + - 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 + - assignmentIds (array): Filter network enforcement target assignments by assignment IDs + - policyIds (array): Filter network enforcement target assignments by policy IDs + - networkIds (array): Filter network enforcement target assignments by network IDs + - firewallTypes (array): Filter network enforcement target assignments by firewall enforcement types for a network + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 100. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks", "assignments"], + "operation": "getOrganizationPoliciesGlobalGroupPoliciesNetworksAssignments", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments" + + query_params = [ + "assignmentIds", + "policyIds", + "networkIds", + "firewallTypes", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "assignmentIds", + "policyIds", + "networkIds", + "firewallTypes", + ] + 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"getOrganizationPoliciesGlobalGroupPoliciesNetworksAssignments: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsAssign( + self, organizationId: str, policy: dict, targets: list, **kwargs + ): + """ + **Assign Network Enforcement Targets to an Organization-Wide Policy** + https://developer.cisco.com/meraki/api-v1/#!bulk-organization-policies-global-group-policies-networks-assignments-assign + + - organizationId (string): Organization ID + - policy (object): Policy to assign network enforcement targets to + - targets (array): Network enforcement targets to assign to the specified policy. Maximum 1000 per request. + """ + + kwargs = locals() + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks", "assignments"], + "operation": "bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsAssign", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments/bulkAssign" + + body_params = [ + "policy", + "targets", + ] + 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"bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsAssign: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.post(metadata, resource, payload) + + def bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsDelete( + self, organizationId: str, policy: dict, targets: list, **kwargs + ): + """ + **Remove Network Enforcement Targets from an Organization-Wide Policy** + https://developer.cisco.com/meraki/api-v1/#!bulk-organization-policies-global-group-policies-networks-assignments-delete + + - organizationId (string): Organization ID + - policy (object): Policy to remove network enforcement targets from + - targets (array): Network enforcement targets to remove for the specified policy. Maximum 1000 per request. + """ + + kwargs = locals() + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks", "assignments"], + "operation": "bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsDelete", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments/bulkDelete" + + body_params = [ + "policy", + "targets", + ] + 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"bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsDelete: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.post(metadata, resource, payload) + def updateOrganizationPoliciesGlobalGroupPolicy(self, organizationId: str, policyId: str, **kwargs): """ **Update an Organization-Wide Policy** diff --git a/meraki/aio/api/spaces.py b/meraki/aio/api/spaces.py index 8f8e058a..f60e24d2 100644 --- a/meraki/aio/api/spaces.py +++ b/meraki/aio/api/spaces.py @@ -6,6 +6,37 @@ def __init__(self, session): super().__init__() self._session = session + def updateNetworkSpacesAuth(self, networkId: str, **kwargs): + """ + **Set the Spaces token** + https://developer.cisco.com/meraki/api-v1/#!update-network-spaces-auth + + - networkId (string): Network ID + - token (object): The token from Spaces + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["spaces", "configure", "auth"], + "operation": "updateNetworkSpacesAuth", + } + networkId = urllib.parse.quote(str(networkId), safe="") + resource = f"/networks/{networkId}/spaces/auth" + + body_params = [ + "token", + ] + 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"updateNetworkSpacesAuth: ignoring unrecognized kwargs: {invalid}") + + return self._session.put(metadata, resource, payload) + def createNetworkSpacesSitesBuilding(self, networkId: str, name: str, **kwargs): """ **Create a new building** diff --git a/meraki/aio/api/switch.py b/meraki/aio/api/switch.py index e17bf86c..1888e9fc 100644 --- a/meraki/aio/api/switch.py +++ b/meraki/aio/api/switch.py @@ -200,7 +200,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs): - serial (string): Serial - portId (string): Port ID - - name (string): The name of the switch port. + - name (string): The name of the switch port. For IOS XE Catalyst switches, this value is the interface description. - tags (array): The list of tags of the switch port. - enabled (boolean): The status of the switch port. - poeEnabled (boolean): The PoE status of the switch port. @@ -3609,7 +3609,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort( - configTemplateId (string): Config template ID - profileId (string): Profile ID - portId (string): Port ID - - name (string): The name of the switch template port. + - name (string): The name of the switch template port. For IOS XE Catalyst switches, this value is the interface description. - tags (array): The list of tags of the switch template port. - enabled (boolean): The status of the switch template port. - poeEnabled (boolean): The PoE status of the switch template port. @@ -7335,13 +7335,16 @@ def deleteOrganizationSwitchRoutingBgpRouter(self, organizationId: str, routerId def getOrganizationSwitchRoutingStaticRoutes(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ - **List layer 3 static routes for switches within an organization** + **List layer 3 static routes for switches in an organization** https://developer.cisco.com/meraki/api-v1/#!get-organization-switch-routing-static-routes - 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 - - networkIds (array): Optional parameter to filter the result set by the included set of network IDs + - networkIds (array): Optional parameter to filter static routes by network ID. + - staticRouteIds (array): Optional parameter to filter static routes by static route ID. + - serials (array): Optional parameter to filter static routes by standalone switch serial. + - switchStackIds (array): Optional parameter to filter static routes by switch stack ID. - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 20. - 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. @@ -7358,6 +7361,9 @@ def getOrganizationSwitchRoutingStaticRoutes(self, organizationId: str, total_pa query_params = [ "networkIds", + "staticRouteIds", + "serials", + "switchStackIds", "perPage", "startingAfter", "endingBefore", @@ -7366,6 +7372,9 @@ def getOrganizationSwitchRoutingStaticRoutes(self, organizationId: str, total_pa array_params = [ "networkIds", + "staticRouteIds", + "serials", + "switchStackIds", ] for k, v in kwargs.items(): if k.strip() in array_params: diff --git a/meraki/aio/api/users.py b/meraki/aio/api/users.py index c65a5ecb..9c4babc1 100644 --- a/meraki/aio/api/users.py +++ b/meraki/aio/api/users.py @@ -244,7 +244,7 @@ def createOrganizationIamUsersIdp(self, organizationId: str, name: str, type: st - type (string): Type of the identity provider - idpConfig (object): Identity provider configuration. Required for external identity providers. - description (string): Optional. Description of the identity provider - - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from your identity provider. + - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from Microsoft Entra ID. Set to 'scim' to accept SCIM provisioning requests. Set to null for on-demand user and group provisioning. """ kwargs.update(locals()) @@ -253,7 +253,7 @@ def createOrganizationIamUsersIdp(self, organizationId: str, name: str, type: st options = ["Azure AD"] assert kwargs["type"] in options, f'''"type" cannot be "{kwargs["type"]}", & must be set to one of: {options}''' if "syncType" in kwargs and kwargs["syncType"] is not None: - options = ["proactive"] + options = ["proactive", "scim"] assert kwargs["syncType"] in options, ( f'''"syncType" cannot be "{kwargs["syncType"]}", & must be set to one of: {options}''' ) @@ -524,12 +524,13 @@ def createOrganizationIamUsersIdpsTestConnectivity(self, organizationId: str, ** return self._session.post(metadata, resource, payload) - def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): + def createOrganizationIamUsersIdpsUser(self, organizationId: str, accountType: str, **kwargs): """ **Create a Meraki user** https://developer.cisco.com/meraki/api-v1/#!create-organization-iam-users-idps-user - organizationId (string): Organization ID + - accountType (string): The type of user account to create. - displayName (string): A human-readable identifier for the created user. - email (string): An email address identified with the user. - password (string): The password for the user account. @@ -538,6 +539,12 @@ def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): kwargs.update(locals()) + if "accountType" in kwargs: + options = ["802.1X", "Guest"] + assert kwargs["accountType"] in options, ( + f'''"accountType" cannot be "{kwargs["accountType"]}", & must be set to one of: {options}''' + ) + metadata = { "tags": ["users", "configure", "iam", "idps"], "operation": "createOrganizationIamUsersIdpsUser", @@ -550,6 +557,7 @@ def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): "email", "password", "sendPassword", + "accountType", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -683,13 +691,13 @@ def updateOrganizationIamUsersIdp(self, organizationId: str, id: str, **kwargs): - name (string): Name of the identity provider - description (string): Description of the identity provider - idpConfig (object): Identity provider configuration. You can update individual attributes - - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from your identity provider. Set to 'null' for on-demand user and group provisioning. + - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from Microsoft Entra ID. Set to 'scim' to accept SCIM provisioning requests. Set to null for on-demand user and group provisioning. """ kwargs.update(locals()) if "syncType" in kwargs and kwargs["syncType"] is not None: - options = ["proactive"] + options = ["proactive", "scim"] assert kwargs["syncType"] in options, ( f'''"syncType" cannot be "{kwargs["syncType"]}", & must be set to one of: {options}''' ) diff --git a/meraki/api/appliance.py b/meraki/api/appliance.py index 591eb407..817160b5 100644 --- a/meraki/api/appliance.py +++ b/meraki/api/appliance.py @@ -5704,7 +5704,7 @@ def getOrganizationApplianceUmbrellaPoliciesByNetwork( def getOrganizationApplianceUplinkStatuses(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ - **List the uplink status of every Meraki MX and Z series appliances in the organization** + **List the uplink status of every Meraki MX appliance, Z series appliance, and Secure Router in the organization** https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-uplink-statuses - organizationId (string): Organization ID diff --git a/meraki/api/batch/campusGateway.py b/meraki/api/batch/campusGateway.py index 640a6c89..206d702c 100644 --- a/meraki/api/batch/campusGateway.py +++ b/meraki/api/batch/campusGateway.py @@ -209,3 +209,78 @@ def batchOrganizationCampusGatewayClustersTunnelingUpdate(self, organizationId: "body": payload, } return action + + def createOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, name: str, types: list, **kwargs): + """ + **Create an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!create-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - name (string): Display name of the custom mDNS service. + - types (array): One to ten DNS-SD service types. Accepted shorthand is normalized by the API. + """ + + kwargs = locals() + + organizationId = urllib.parse.quote(organizationId, safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom" + + body_params = [ + "name", + "types", + ] + payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} + action = { + "resource": resource, + "operation": "create", + "body": payload, + } + return action + + def updateOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, key: str, **kwargs): + """ + **Update an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!update-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - key (string): Key + - name (string): Updated display name of the custom mDNS service. + - types (array): Replacement ordered list of one to ten DNS-SD service types. + """ + + kwargs.update(locals()) + + organizationId = urllib.parse.quote(organizationId, safe="") + key = urllib.parse.quote(key, safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom/{key}" + + body_params = [ + "name", + "types", + ] + 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 deleteOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, key: str): + """ + **Delete an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!delete-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - key (string): Key + """ + + organizationId = urllib.parse.quote(organizationId, safe="") + key = urllib.parse.quote(key, safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom/{key}" + + action = { + "resource": resource, + "operation": "destroy", + } + return action diff --git a/meraki/api/batch/organizations.py b/meraki/api/batch/organizations.py index e116d37d..959c550b 100644 --- a/meraki/api/batch/organizations.py +++ b/meraki/api/batch/organizations.py @@ -799,6 +799,7 @@ def createOrganizationBrandingPolicy(self, organizationId: str, name: str, **kwa - organizationId (string): Organization ID - name (string): Name of the Dashboard branding policy. - enabled (boolean): Boolean indicating whether this policy is enabled. + - appearance (object): Dashboard appearance settings. - adminSettings (object): Settings for describing which kinds of admins this policy applies to. - helpSettings (object): Settings for describing the modifications to various Help page features. Each property in this object accepts one of 'default or inherit' (do not modify functionality), 'hide' (remove the section from Dashboard), or 'show' (always show @@ -816,6 +817,7 @@ def createOrganizationBrandingPolicy(self, organizationId: str, name: str, **kwa body_params = [ "name", "enabled", + "appearance", "adminSettings", "helpSettings", "customLogo", @@ -863,6 +865,7 @@ def updateOrganizationBrandingPolicy(self, organizationId: str, brandingPolicyId - brandingPolicyId (string): Branding policy ID - name (string): Name of the Dashboard branding policy. - enabled (boolean): Boolean indicating whether this policy is enabled. + - appearance (object): Dashboard appearance settings. - adminSettings (object): Settings for describing which kinds of admins this policy applies to. - helpSettings (object): Settings for describing the modifications to various Help page features. Each property in this object accepts one of 'default or inherit' (do not modify functionality), 'hide' (remove the section from Dashboard), or 'show' (always show @@ -881,6 +884,7 @@ def updateOrganizationBrandingPolicy(self, organizationId: str, brandingPolicyId body_params = [ "name", "enabled", + "appearance", "adminSettings", "helpSettings", "customLogo", @@ -2201,6 +2205,37 @@ def deleteIntegration(self, organizationId: str, integrationId: str): } return action + def updateIntegrationCredentials(self, organizationId: str, integrationId: str, **kwargs): + """ + **Replace the principal for an existing cloud integration while preserving integration, account, and network state** + https://developer.cisco.com/meraki/api-v1/#!update-integration-credentials + + - organizationId (string): Organization ID + - integrationId (string): Integration ID + - aws (object): Replacement AWS IAM role principal for an existing integration + - azure (object): Replacement Azure service principal credentials for an existing integration + - gcp (object): Replacement GCP service account key JSON for an existing integration + """ + + kwargs.update(locals()) + + organizationId = urllib.parse.quote(organizationId, safe="") + integrationId = urllib.parse.quote(integrationId, safe="") + resource = f"/organizations/{organizationId}/mcf/integrations/{integrationId}/credentials" + + body_params = [ + "aws", + "azure", + "gcp", + ] + payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} + action = { + "resource": resource, + "operation": "batch", + "body": payload, + } + return action + def rotateIntegrationCredentials(self, organizationId: str, integrationId: str, **kwargs): """ **Replaces secret material for an existing Microsoft Azure or Google Cloud integration after validating that the credential belongs to the existing principal. Rotation preserves the Azure tenant and client ID or the Google Cloud project and service-account identity, and does not change discovered accounts or networks. AWS integrations are not supported by this operation.** @@ -3105,6 +3140,64 @@ def deleteOrganizationPoliciesGlobalGroupPoliciesFirewallRulesetsAssignment(self } return action + def bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsAssign( + self, organizationId: str, policy: dict, targets: list, **kwargs + ): + """ + **Assign Network Enforcement Targets to an Organization-Wide Policy** + https://developer.cisco.com/meraki/api-v1/#!bulk-organization-policies-global-group-policies-networks-assignments-assign + + - organizationId (string): Organization ID + - policy (object): Policy to assign network enforcement targets to + - targets (array): Network enforcement targets to assign to the specified policy. Maximum 1000 per request. + """ + + kwargs = locals() + + organizationId = urllib.parse.quote(organizationId, safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments/bulkAssign" + + body_params = [ + "policy", + "targets", + ] + payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} + action = { + "resource": resource, + "operation": "bulk_create", + "body": payload, + } + return action + + def bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsDelete( + self, organizationId: str, policy: dict, targets: list, **kwargs + ): + """ + **Remove Network Enforcement Targets from an Organization-Wide Policy** + https://developer.cisco.com/meraki/api-v1/#!bulk-organization-policies-global-group-policies-networks-assignments-delete + + - organizationId (string): Organization ID + - policy (object): Policy to remove network enforcement targets from + - targets (array): Network enforcement targets to remove for the specified policy. Maximum 1000 per request. + """ + + kwargs = locals() + + organizationId = urllib.parse.quote(organizationId, safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments/bulkDelete" + + body_params = [ + "policy", + "targets", + ] + payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} + action = { + "resource": resource, + "operation": "bulk_delete", + "body": payload, + } + return action + def updateOrganizationPoliciesGlobalGroupPolicy(self, organizationId: str, policyId: str, **kwargs): """ **Update an Organization-Wide Policy** @@ -3495,31 +3588,6 @@ def deleteOrganizationSamlIdp(self, organizationId: str, idpId: str): } return action - def createOrganizationSaseIntegration(self, organizationId: str, api: dict, **kwargs): - """ - **Create a new Secure Access integration** - https://developer.cisco.com/meraki/api-v1/#!create-organization-sase-integration - - - organizationId (string): Organization ID - - api (object): API credentials - """ - - kwargs = locals() - - organizationId = urllib.parse.quote(organizationId, safe="") - resource = f"/organizations/{organizationId}/sase/integrations" - - body_params = [ - "api", - ] - payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} - action = { - "resource": resource, - "operation": "create", - "body": payload, - } - return action - def deleteOrganizationSaseIntegration(self, organizationId: str, integrationId: str): """ **Remove a Secure Access integration** diff --git a/meraki/api/batch/spaces.py b/meraki/api/batch/spaces.py index 29aec45b..dd2afe13 100644 --- a/meraki/api/batch/spaces.py +++ b/meraki/api/batch/spaces.py @@ -5,6 +5,31 @@ class ActionBatchSpaces: def __init__(self): super().__init__() + def updateNetworkSpacesAuth(self, networkId: str, **kwargs): + """ + **Set the Spaces token** + https://developer.cisco.com/meraki/api-v1/#!update-network-spaces-auth + + - networkId (string): Network ID + - token (object): The token from Spaces + """ + + kwargs.update(locals()) + + networkId = urllib.parse.quote(networkId, safe="") + resource = f"/networks/{networkId}/spaces/auth" + + body_params = [ + "token", + ] + 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 createNetworkSpacesSitesBuilding(self, networkId: str, name: str, **kwargs): """ **Create a new building** diff --git a/meraki/api/batch/switch.py b/meraki/api/batch/switch.py index f6eaacf7..24017629 100644 --- a/meraki/api/batch/switch.py +++ b/meraki/api/batch/switch.py @@ -71,7 +71,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs): - serial (string): Serial - portId (string): Port ID - - name (string): The name of the switch port. + - name (string): The name of the switch port. For IOS XE Catalyst switches, this value is the interface description. - tags (array): The list of tags of the switch port. - enabled (boolean): The status of the switch port. - poeEnabled (boolean): The PoE status of the switch port. @@ -2070,7 +2070,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort( - configTemplateId (string): Config template ID - profileId (string): Profile ID - portId (string): Port ID - - name (string): The name of the switch template port. + - name (string): The name of the switch template port. For IOS XE Catalyst switches, this value is the interface description. - tags (array): The list of tags of the switch template port. - enabled (boolean): The status of the switch template port. - poeEnabled (boolean): The PoE status of the switch template port. diff --git a/meraki/api/batch/users.py b/meraki/api/batch/users.py index d94840b4..c52606a2 100644 --- a/meraki/api/batch/users.py +++ b/meraki/api/batch/users.py @@ -129,7 +129,7 @@ def createOrganizationIamUsersIdp(self, organizationId: str, name: str, type: st - type (string): Type of the identity provider - idpConfig (object): Identity provider configuration. Required for external identity providers. - description (string): Optional. Description of the identity provider - - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from your identity provider. + - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from Microsoft Entra ID. Set to 'scim' to accept SCIM provisioning requests. Set to null for on-demand user and group provisioning. """ kwargs.update(locals()) @@ -138,7 +138,7 @@ def createOrganizationIamUsersIdp(self, organizationId: str, name: str, type: st options = ["Azure AD"] assert kwargs["type"] in options, f'''"type" cannot be "{kwargs["type"]}", & must be set to one of: {options}''' if "syncType" in kwargs and kwargs["syncType"] is not None: - options = ["proactive"] + options = ["proactive", "scim"] assert kwargs["syncType"] in options, ( f'''"syncType" cannot be "{kwargs["syncType"]}", & must be set to one of: {options}''' ) @@ -188,12 +188,13 @@ def createOrganizationIamUsersIdpsTestConnectivity(self, organizationId: str, ** } return action - def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): + def createOrganizationIamUsersIdpsUser(self, organizationId: str, accountType: str, **kwargs): """ **Create a Meraki user** https://developer.cisco.com/meraki/api-v1/#!create-organization-iam-users-idps-user - organizationId (string): Organization ID + - accountType (string): The type of user account to create. - displayName (string): A human-readable identifier for the created user. - email (string): An email address identified with the user. - password (string): The password for the user account. @@ -202,6 +203,12 @@ def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): kwargs.update(locals()) + if "accountType" in kwargs: + options = ["802.1X", "Guest"] + assert kwargs["accountType"] in options, ( + f'''"accountType" cannot be "{kwargs["accountType"]}", & must be set to one of: {options}''' + ) + organizationId = urllib.parse.quote(organizationId, safe="") resource = f"/organizations/{organizationId}/iam/users/idps/users" @@ -210,6 +217,7 @@ def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): "email", "password", "sendPassword", + "accountType", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} action = { @@ -310,13 +318,13 @@ def updateOrganizationIamUsersIdp(self, organizationId: str, id: str, **kwargs): - name (string): Name of the identity provider - description (string): Description of the identity provider - idpConfig (object): Identity provider configuration. You can update individual attributes - - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from your identity provider. Set to 'null' for on-demand user and group provisioning. + - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from Microsoft Entra ID. Set to 'scim' to accept SCIM provisioning requests. Set to null for on-demand user and group provisioning. """ kwargs.update(locals()) if "syncType" in kwargs and kwargs["syncType"] is not None: - options = ["proactive"] + options = ["proactive", "scim"] assert kwargs["syncType"] in options, ( f'''"syncType" cannot be "{kwargs["syncType"]}", & must be set to one of: {options}''' ) diff --git a/meraki/api/campusGateway.py b/meraki/api/campusGateway.py index fe432266..a9f1e586 100644 --- a/meraki/api/campusGateway.py +++ b/meraki/api/campusGateway.py @@ -941,3 +941,205 @@ def getOrganizationCampusGatewayDevicesUplinksLocalOverridesByDevice( ) return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def getOrganizationCampusGatewayMdnsServices(self, organizationId: str, total_pages=1, direction="next", **kwargs): + """ + **List mDNS service definitions visible to the caller in an organization.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-campus-gateway-mdns-services + + - 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 + - keys (array): Exact service key filter. Maximum 100 values. + - types (array): Exact canonical DNS-SD service type filter. Maximum 100 values. + - name (string): Case-insensitive partial display-name filter. + - scopes (array): Exact service-scope filter. Maximum 100 values. + - networkIds (array): Network filter for network-scoped custom services. Maximum 100 values. + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services"], + "operation": "getOrganizationCampusGatewayMdnsServices", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services" + + query_params = [ + "keys", + "types", + "name", + "scopes", + "networkIds", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "keys", + "types", + "scopes", + "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"getOrganizationCampusGatewayMdnsServices: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def getOrganizationCampusGatewayMdnsServicesAssignments( + self, organizationId: str, total_pages=1, direction="next", **kwargs + ): + """ + **List active mDNS service assignments on concrete SSIDs visible to the caller.** + https://developer.cisco.com/meraki/api-v1/#!get-organization-campus-gateway-mdns-services-assignments + + - 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 + - keys (array): Exact service key filter. Maximum 100 values. + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "assignments"], + "operation": "getOrganizationCampusGatewayMdnsServicesAssignments", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/assignments" + + query_params = [ + "keys", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "keys", + ] + 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"getOrganizationCampusGatewayMdnsServicesAssignments: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def createOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, name: str, types: list, **kwargs): + """ + **Create an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!create-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - name (string): Display name of the custom mDNS service. + - types (array): One to ten DNS-SD service types. Accepted shorthand is normalized by the API. + """ + + kwargs = locals() + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "custom"], + "operation": "createOrganizationCampusGatewayMdnsServicesCustom", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom" + + body_params = [ + "name", + "types", + ] + 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"createOrganizationCampusGatewayMdnsServicesCustom: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.post(metadata, resource, payload) + + def updateOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, key: str, **kwargs): + """ + **Update an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!update-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - key (string): Key + - name (string): Updated display name of the custom mDNS service. + - types (array): Replacement ordered list of one to ten DNS-SD service types. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "custom"], + "operation": "updateOrganizationCampusGatewayMdnsServicesCustom", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + key = urllib.parse.quote(str(key), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom/{key}" + + body_params = [ + "name", + "types", + ] + 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"updateOrganizationCampusGatewayMdnsServicesCustom: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.put(metadata, resource, payload) + + def deleteOrganizationCampusGatewayMdnsServicesCustom(self, organizationId: str, key: str): + """ + **Delete an organization-scoped custom mDNS service definition.** + https://developer.cisco.com/meraki/api-v1/#!delete-organization-campus-gateway-mdns-services-custom + + - organizationId (string): Organization ID + - key (string): Key + """ + + metadata = { + "tags": ["campusGateway", "configure", "mdns", "services", "custom"], + "operation": "deleteOrganizationCampusGatewayMdnsServicesCustom", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + key = urllib.parse.quote(str(key), safe="") + resource = f"/organizations/{organizationId}/campusGateway/mdns/services/custom/{key}" + + return self._session.delete(metadata, resource) diff --git a/meraki/api/organizations.py b/meraki/api/organizations.py index 57a49a06..9ee44b32 100644 --- a/meraki/api/organizations.py +++ b/meraki/api/organizations.py @@ -4108,6 +4108,7 @@ def createOrganizationBrandingPolicy(self, organizationId: str, name: str, **kwa - organizationId (string): Organization ID - name (string): Name of the Dashboard branding policy. - enabled (boolean): Boolean indicating whether this policy is enabled. + - appearance (object): Dashboard appearance settings. - adminSettings (object): Settings for describing which kinds of admins this policy applies to. - helpSettings (object): Settings for describing the modifications to various Help page features. Each property in this object accepts one of 'default or inherit' (do not modify functionality), 'hide' (remove the section from Dashboard), or 'show' (always show @@ -4129,6 +4130,7 @@ def createOrganizationBrandingPolicy(self, organizationId: str, name: str, **kwa body_params = [ "name", "enabled", + "appearance", "adminSettings", "helpSettings", "customLogo", @@ -4222,6 +4224,7 @@ def updateOrganizationBrandingPolicy(self, organizationId: str, brandingPolicyId - brandingPolicyId (string): Branding policy ID - name (string): Name of the Dashboard branding policy. - enabled (boolean): Boolean indicating whether this policy is enabled. + - appearance (object): Dashboard appearance settings. - adminSettings (object): Settings for describing which kinds of admins this policy applies to. - helpSettings (object): Settings for describing the modifications to various Help page features. Each property in this object accepts one of 'default or inherit' (do not modify functionality), 'hide' (remove the section from Dashboard), or 'show' (always show @@ -4244,6 +4247,7 @@ def updateOrganizationBrandingPolicy(self, organizationId: str, brandingPolicyId body_params = [ "name", "enabled", + "appearance", "adminSettings", "helpSettings", "customLogo", @@ -4785,7 +4789,7 @@ def getOrganizationClientsBandwidthUsageHistory(self, organizationId: str, **kwa def getOrganizationClientsOverview(self, organizationId: str, **kwargs): """ - **Return summary information around client data usage (in kb) across the given organization.** + **Return summary information around client data usage in MiB across the given organization.** https://developer.cisco.com/meraki/api-v1/#!get-organization-clients-overview - organizationId (string): Organization ID @@ -9751,26 +9755,6 @@ def getAccount(self, organizationId: str, accountId: str): return self._session.get(metadata, resource) - def getAccountStatuses(self, organizationId: str, accountId: str): - """ - **Returns the recorded lifecycle history for the account identified by - `accountId`** - https://developer.cisco.com/meraki/api-v1/#!get-account-statuses - - - organizationId (string): Organization ID - - accountId (string): Account ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "accounts", "statuses"], - "operation": "getAccountStatuses", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - accountId = urllib.parse.quote(str(accountId), safe="") - resource = f"/organizations/{organizationId}/mcf/accounts/{accountId}/statuses" - - return self._session.get(metadata, resource) - def getBgpSessionStatus(self, organizationId: str, **kwargs): """ **Returns aligned aggregate and member BGP-session-health series for @@ -10508,6 +10492,43 @@ def deleteIntegration(self, organizationId: str, integrationId: str): return self._session.delete(metadata, resource) + def updateIntegrationCredentials(self, organizationId: str, integrationId: str, **kwargs): + """ + **Replace the principal for an existing cloud integration while preserving integration, account, and network state** + https://developer.cisco.com/meraki/api-v1/#!update-integration-credentials + + - organizationId (string): Organization ID + - integrationId (string): Integration ID + - aws (object): Replacement AWS IAM role principal for an existing integration + - azure (object): Replacement Azure service principal credentials for an existing integration + - gcp (object): Replacement GCP service account key JSON for an existing integration + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "mcf", "integrations"], + "operation": "updateIntegrationCredentials", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + integrationId = urllib.parse.quote(str(integrationId), safe="") + resource = f"/organizations/{organizationId}/mcf/integrations/{integrationId}/credentials" + + body_params = [ + "aws", + "azure", + "gcp", + ] + 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"updateIntegrationCredentials: ignoring unrecognized kwargs: {invalid}") + + return self._session.put(metadata, resource, payload) + def rotateIntegrationCredentials(self, organizationId: str, integrationId: str, **kwargs): """ **Replaces secret material for an existing Microsoft Azure or Google Cloud integration after validating that the credential belongs to the existing principal** @@ -10562,25 +10583,6 @@ def discoverIntegration(self, organizationId: str, integrationId: str): return self._session.post(metadata, resource) - def getIntegrationStatuses(self, organizationId: str, integrationId: str): - """ - **Returns the recorded lifecycle history for the cloud integration identified by `integrationId`** - https://developer.cisco.com/meraki/api-v1/#!get-integration-statuses - - - organizationId (string): Organization ID - - integrationId (string): Integration ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "integrations", "statuses"], - "operation": "getIntegrationStatuses", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - integrationId = urllib.parse.quote(str(integrationId), safe="") - resource = f"/organizations/{organizationId}/mcf/integrations/{integrationId}/statuses" - - return self._session.get(metadata, resource) - def listRegions(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ **Returns cloud-provider region records correlated with MCN vPOP capacity** @@ -10816,180 +10818,6 @@ def confirmRemovedResource(self, organizationId: str, resourceType: str, resourc return self._session.post(metadata, resource, payload) - def listRouteTableAssociations(self, organizationId: str, total_pages=1, direction="next", **kwargs): - """ - **Lists discovered associations between cloud route tables and VPCs or - subnets in the Meraki Dashboard organization** - https://developer.cisco.com/meraki/api-v1/#!list-route-table-associations - - - 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 - - routeTableId (string): MCN-assigned UUID of the route table whose associations are returned. - - vpcId (string): MCN-assigned UUID of the VPC whose route-table associations are - returned. If deprecated `networkId` is also supplied, the UUIDs must - match. - - subnetId (string): MCN-assigned UUID of the subnet whose association is returned. - - scope (string): Restricts results by association scope. - - - `vpc` — Preferred request alias for a VPC-level association; - responses use `network`. - - `network` — Deprecated: Legacy request value for the same VPC-level - scope. Responses return `network` for compatibility. - - `subnet` — Association between a route table and one subnet. - - isDefault (boolean): Restricts results by provider default-association designation. `true` - returns default associations; `false` returns non-default - associations. Omission does not filter by this designation. - - perPage (integer): Requested maximum number of matching resources to return. The default and maximum, and whether this parameter is applied, are defined by the operation. A response can contain fewer resources than requested. - - startingAfter (string): Forward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - - endingBefore (string): Backward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - """ - - kwargs.update(locals()) - - if "scope" in kwargs: - options = ["network", "subnet", "vpc"] - assert kwargs["scope"] in options, f'''"scope" cannot be "{kwargs["scope"]}", & must be set to one of: {options}''' - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTableAssociations"], - "operation": "listRouteTableAssociations", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTableAssociations" - - query_params = [ - "routeTableId", - "vpcId", - "subnetId", - "scope", - "isDefault", - "perPage", - "startingAfter", - "endingBefore", - ] - params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} - - if self._session._validate_kwargs: - all_params = query_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"listRouteTableAssociations: ignoring unrecognized kwargs: {invalid}") - - return self._session.get_pages(metadata, resource, params, total_pages, direction) - - def getRouteTableAssociation(self, organizationId: str, associationId: str): - """ - **Returns one discovered association between a cloud route table and a VPC - or subnet, selected by its MCN-assigned UUID.** - https://developer.cisco.com/meraki/api-v1/#!get-route-table-association - - - organizationId (string): Organization ID - - associationId (string): Association ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTableAssociations"], - "operation": "getRouteTableAssociation", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - associationId = urllib.parse.quote(str(associationId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTableAssociations/{associationId}" - - return self._session.get(metadata, resource) - - def listRouteTables(self, organizationId: str, total_pages=1, direction="next", **kwargs): - """ - **Lists route tables discovered for cloud accounts in the Meraki Dashboard - organization** - https://developer.cisco.com/meraki/api-v1/#!list-route-tables - - - 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 - - provider (string): Restricts results by the route table's cloud provider. - - - `aws` — Amazon Web Services route tables. - - `azure` — Microsoft Azure route tables. - - `gcp` — Google Cloud route tables. - - accountId (string): MCN-assigned UUID of the cloud account whose route tables are returned. - - vpcId (string): MCN-assigned UUID of the VPC whose network-scoped route tables are - returned. If the deprecated `networkId` is also supplied, the UUIDs - must match. - - isDefault (boolean): Restricts results by provider default-route-table designation. - `true` returns default route tables; `false` returns non-default - route tables. Omission does not filter by this designation. - - scope (string): Restricts results by route-table scope. - - - `vpc` — Preferred request alias for a route table attached to one - VPC; responses use `network`. - - `network` — Deprecated: Legacy request value for the same VPC-level - scope. Responses return `network` for compatibility. - - `global` — Provider-wide route table that is not confined to one - VPC. - - perPage (integer): Requested maximum number of matching resources to return. The default and maximum, and whether this parameter is applied, are defined by the operation. A response can contain fewer resources than requested. - - startingAfter (string): Forward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - - endingBefore (string): Backward page boundary accepted by an operation. Its source, format, and interpretation are defined by that operation; do not reuse it across operations unless their documentation permits it. Cursor validation and interaction with other pagination parameters are operation-specific. - """ - - kwargs.update(locals()) - - if "provider" in kwargs: - options = ["aws", "azure", "gcp"] - assert kwargs["provider"] in options, ( - f'''"provider" cannot be "{kwargs["provider"]}", & must be set to one of: {options}''' - ) - if "scope" in kwargs: - options = ["global", "network", "vpc"] - assert kwargs["scope"] in options, f'''"scope" cannot be "{kwargs["scope"]}", & must be set to one of: {options}''' - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTables"], - "operation": "listRouteTables", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTables" - - query_params = [ - "provider", - "accountId", - "vpcId", - "isDefault", - "scope", - "perPage", - "startingAfter", - "endingBefore", - ] - params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} - - if self._session._validate_kwargs: - all_params = query_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"listRouteTables: ignoring unrecognized kwargs: {invalid}") - - return self._session.get_pages(metadata, resource, params, total_pages, direction) - - def getRouteTable(self, organizationId: str, routeTableId: str): - """ - **Returns one discovered cloud-provider route table by its MCN-assigned - UUID** - https://developer.cisco.com/meraki/api-v1/#!get-route-table - - - organizationId (string): Organization ID - - routeTableId (string): Route table ID - """ - - metadata = { - "tags": ["organizations", "configure", "mcf", "routeTables"], - "operation": "getRouteTable", - } - organizationId = urllib.parse.quote(str(organizationId), safe="") - routeTableId = urllib.parse.quote(str(routeTableId), safe="") - resource = f"/organizations/{organizationId}/mcf/routeTables/{routeTableId}" - - return self._session.get(metadata, resource) - def listSites(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ **Returns Meraki network records represented as MCN Sites for site-to-cloud connectivity in the specified organization** @@ -11110,6 +10938,24 @@ def getSite(self, organizationId: str, siteId: str): return self._session.get(metadata, resource) + def getSummary(self, organizationId: str): + """ + **Returns the aggregate values required to populate organization summary + cards** + https://developer.cisco.com/meraki/api-v1/#!get-summary + + - organizationId (string): Organization ID + """ + + metadata = { + "tags": ["organizations", "configure", "mcf", "summary"], + "operation": "getSummary", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/mcf/summary" + + return self._session.get(metadata, resource) + def listTags(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ **Lists discovery-visible canonical tags for the Meraki Dashboard @@ -13088,6 +12934,199 @@ def deleteOrganizationPoliciesGlobalGroupPoliciesFirewallRulesetsAssignment(self return self._session.delete(metadata, resource) + def getOrganizationPoliciesGlobalGroupPoliciesNetworks( + self, organizationId: str, total_pages=1, direction="next", **kwargs + ): + """ + **List all available Network Enforcement Targets for an Organization and their associated Organization-Wide Policies if applicable** + https://developer.cisco.com/meraki/api-v1/#!get-organization-policies-global-group-policies-networks + + - 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 + - policyIds (array): Filter network enforcement targets by policy IDs + - networkIds (array): Filter network enforcement targets by network IDs + - firewallTypes (array): Filter network enforcement targets by firewall enforcement types for a network + - name (string): Filter network enforcement targets by network name with support for partial matches. Case insensitive. + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 100. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks"], + "operation": "getOrganizationPoliciesGlobalGroupPoliciesNetworks", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks" + + query_params = [ + "policyIds", + "networkIds", + "firewallTypes", + "name", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "policyIds", + "networkIds", + "firewallTypes", + ] + 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"getOrganizationPoliciesGlobalGroupPoliciesNetworks: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def getOrganizationPoliciesGlobalGroupPoliciesNetworksAssignments( + self, organizationId: str, total_pages=1, direction="next", **kwargs + ): + """ + **List Network Enforcement Target Assignments for Organization-Wide policies for the specified organization** + https://developer.cisco.com/meraki/api-v1/#!get-organization-policies-global-group-policies-networks-assignments + + - 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 + - assignmentIds (array): Filter network enforcement target assignments by assignment IDs + - policyIds (array): Filter network enforcement target assignments by policy IDs + - networkIds (array): Filter network enforcement target assignments by network IDs + - firewallTypes (array): Filter network enforcement target assignments by firewall enforcement types for a network + - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 100. Default is 100. + - 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. + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks", "assignments"], + "operation": "getOrganizationPoliciesGlobalGroupPoliciesNetworksAssignments", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments" + + query_params = [ + "assignmentIds", + "policyIds", + "networkIds", + "firewallTypes", + "perPage", + "startingAfter", + "endingBefore", + ] + params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params} + + array_params = [ + "assignmentIds", + "policyIds", + "networkIds", + "firewallTypes", + ] + 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"getOrganizationPoliciesGlobalGroupPoliciesNetworksAssignments: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.get_pages(metadata, resource, params, total_pages, direction) + + def bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsAssign( + self, organizationId: str, policy: dict, targets: list, **kwargs + ): + """ + **Assign Network Enforcement Targets to an Organization-Wide Policy** + https://developer.cisco.com/meraki/api-v1/#!bulk-organization-policies-global-group-policies-networks-assignments-assign + + - organizationId (string): Organization ID + - policy (object): Policy to assign network enforcement targets to + - targets (array): Network enforcement targets to assign to the specified policy. Maximum 1000 per request. + """ + + kwargs = locals() + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks", "assignments"], + "operation": "bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsAssign", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments/bulkAssign" + + body_params = [ + "policy", + "targets", + ] + 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"bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsAssign: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.post(metadata, resource, payload) + + def bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsDelete( + self, organizationId: str, policy: dict, targets: list, **kwargs + ): + """ + **Remove Network Enforcement Targets from an Organization-Wide Policy** + https://developer.cisco.com/meraki/api-v1/#!bulk-organization-policies-global-group-policies-networks-assignments-delete + + - organizationId (string): Organization ID + - policy (object): Policy to remove network enforcement targets from + - targets (array): Network enforcement targets to remove for the specified policy. Maximum 1000 per request. + """ + + kwargs = locals() + + metadata = { + "tags": ["organizations", "configure", "policies", "global", "group", "networks", "assignments"], + "operation": "bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsDelete", + } + organizationId = urllib.parse.quote(str(organizationId), safe="") + resource = f"/organizations/{organizationId}/policies/global/group/policies/networks/assignments/bulkDelete" + + body_params = [ + "policy", + "targets", + ] + 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"bulkOrganizationPoliciesGlobalGroupPoliciesNetworksAssignmentsDelete: ignoring unrecognized kwargs: {invalid}" + ) + + return self._session.post(metadata, resource, payload) + def updateOrganizationPoliciesGlobalGroupPolicy(self, organizationId: str, policyId: str, **kwargs): """ **Update an Organization-Wide Policy** diff --git a/meraki/api/spaces.py b/meraki/api/spaces.py index 12a55310..89a8072f 100644 --- a/meraki/api/spaces.py +++ b/meraki/api/spaces.py @@ -6,6 +6,37 @@ def __init__(self, session): super().__init__() self._session = session + def updateNetworkSpacesAuth(self, networkId: str, **kwargs): + """ + **Set the Spaces token** + https://developer.cisco.com/meraki/api-v1/#!update-network-spaces-auth + + - networkId (string): Network ID + - token (object): The token from Spaces + """ + + kwargs.update(locals()) + + metadata = { + "tags": ["spaces", "configure", "auth"], + "operation": "updateNetworkSpacesAuth", + } + networkId = urllib.parse.quote(str(networkId), safe="") + resource = f"/networks/{networkId}/spaces/auth" + + body_params = [ + "token", + ] + 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"updateNetworkSpacesAuth: ignoring unrecognized kwargs: {invalid}") + + return self._session.put(metadata, resource, payload) + def createNetworkSpacesSitesBuilding(self, networkId: str, name: str, **kwargs): """ **Create a new building** diff --git a/meraki/api/switch.py b/meraki/api/switch.py index 778e33bb..811085d1 100644 --- a/meraki/api/switch.py +++ b/meraki/api/switch.py @@ -200,7 +200,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs): - serial (string): Serial - portId (string): Port ID - - name (string): The name of the switch port. + - name (string): The name of the switch port. For IOS XE Catalyst switches, this value is the interface description. - tags (array): The list of tags of the switch port. - enabled (boolean): The status of the switch port. - poeEnabled (boolean): The PoE status of the switch port. @@ -3609,7 +3609,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort( - configTemplateId (string): Config template ID - profileId (string): Profile ID - portId (string): Port ID - - name (string): The name of the switch template port. + - name (string): The name of the switch template port. For IOS XE Catalyst switches, this value is the interface description. - tags (array): The list of tags of the switch template port. - enabled (boolean): The status of the switch template port. - poeEnabled (boolean): The PoE status of the switch template port. @@ -7335,13 +7335,16 @@ def deleteOrganizationSwitchRoutingBgpRouter(self, organizationId: str, routerId def getOrganizationSwitchRoutingStaticRoutes(self, organizationId: str, total_pages=1, direction="next", **kwargs): """ - **List layer 3 static routes for switches within an organization** + **List layer 3 static routes for switches in an organization** https://developer.cisco.com/meraki/api-v1/#!get-organization-switch-routing-static-routes - 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 - - networkIds (array): Optional parameter to filter the result set by the included set of network IDs + - networkIds (array): Optional parameter to filter static routes by network ID. + - staticRouteIds (array): Optional parameter to filter static routes by static route ID. + - serials (array): Optional parameter to filter static routes by standalone switch serial. + - switchStackIds (array): Optional parameter to filter static routes by switch stack ID. - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 20. - 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. @@ -7358,6 +7361,9 @@ def getOrganizationSwitchRoutingStaticRoutes(self, organizationId: str, total_pa query_params = [ "networkIds", + "staticRouteIds", + "serials", + "switchStackIds", "perPage", "startingAfter", "endingBefore", @@ -7366,6 +7372,9 @@ def getOrganizationSwitchRoutingStaticRoutes(self, organizationId: str, total_pa array_params = [ "networkIds", + "staticRouteIds", + "serials", + "switchStackIds", ] for k, v in kwargs.items(): if k.strip() in array_params: diff --git a/meraki/api/users.py b/meraki/api/users.py index af0776f4..04c09eef 100644 --- a/meraki/api/users.py +++ b/meraki/api/users.py @@ -244,7 +244,7 @@ def createOrganizationIamUsersIdp(self, organizationId: str, name: str, type: st - type (string): Type of the identity provider - idpConfig (object): Identity provider configuration. Required for external identity providers. - description (string): Optional. Description of the identity provider - - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from your identity provider. + - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from Microsoft Entra ID. Set to 'scim' to accept SCIM provisioning requests. Set to null for on-demand user and group provisioning. """ kwargs.update(locals()) @@ -253,7 +253,7 @@ def createOrganizationIamUsersIdp(self, organizationId: str, name: str, type: st options = ["Azure AD"] assert kwargs["type"] in options, f'''"type" cannot be "{kwargs["type"]}", & must be set to one of: {options}''' if "syncType" in kwargs and kwargs["syncType"] is not None: - options = ["proactive"] + options = ["proactive", "scim"] assert kwargs["syncType"] in options, ( f'''"syncType" cannot be "{kwargs["syncType"]}", & must be set to one of: {options}''' ) @@ -524,12 +524,13 @@ def createOrganizationIamUsersIdpsTestConnectivity(self, organizationId: str, ** return self._session.post(metadata, resource, payload) - def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): + def createOrganizationIamUsersIdpsUser(self, organizationId: str, accountType: str, **kwargs): """ **Create a Meraki user** https://developer.cisco.com/meraki/api-v1/#!create-organization-iam-users-idps-user - organizationId (string): Organization ID + - accountType (string): The type of user account to create. - displayName (string): A human-readable identifier for the created user. - email (string): An email address identified with the user. - password (string): The password for the user account. @@ -538,6 +539,12 @@ def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): kwargs.update(locals()) + if "accountType" in kwargs: + options = ["802.1X", "Guest"] + assert kwargs["accountType"] in options, ( + f'''"accountType" cannot be "{kwargs["accountType"]}", & must be set to one of: {options}''' + ) + metadata = { "tags": ["users", "configure", "iam", "idps"], "operation": "createOrganizationIamUsersIdpsUser", @@ -550,6 +557,7 @@ def createOrganizationIamUsersIdpsUser(self, organizationId: str, **kwargs): "email", "password", "sendPassword", + "accountType", ] payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params} @@ -683,13 +691,13 @@ def updateOrganizationIamUsersIdp(self, organizationId: str, id: str, **kwargs): - name (string): Name of the identity provider - description (string): Description of the identity provider - idpConfig (object): Identity provider configuration. You can update individual attributes - - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from your identity provider. Set to 'null' for on-demand user and group provisioning. + - syncType (string): The synchronization method for the identity provider. Set to 'proactive' to sync all users and groups from Microsoft Entra ID. Set to 'scim' to accept SCIM provisioning requests. Set to null for on-demand user and group provisioning. """ kwargs.update(locals()) if "syncType" in kwargs and kwargs["syncType"] is not None: - options = ["proactive"] + options = ["proactive", "scim"] assert kwargs["syncType"] in options, ( f'''"syncType" cannot be "{kwargs["syncType"]}", & must be set to one of: {options}''' ) diff --git a/pyproject.toml b/pyproject.toml index 4e42eaa4..c630ff65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "meraki" -version = "4.5.0b3" +version = "4.5.0b4" description = "Cisco Meraki Dashboard API library" authors = [ {name = "Cisco Meraki", email = "api-feedback@meraki.net"} diff --git a/uv.lock b/uv.lock index 68683d6f..25cba0b9 100644 --- a/uv.lock +++ b/uv.lock @@ -549,7 +549,7 @@ wheels = [ [[package]] name = "meraki" -version = "4.5.0b3" +version = "4.5.0b4" source = { editable = "." } dependencies = [ { name = "aiohttp" },