azext_iot/central/services/device_group.py (140 lines of code) (raw):
# coding=utf-8
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
from typing import List
import requests
from knack.log import get_logger
from azure.cli.core.azclierror import AzureResponseError
from azext_iot.constants import CENTRAL_ENDPOINT
from azext_iot.central.services import _utility
from azext_iot.central.models.ga_2022_07_31 import DeviceGroupGa
from azext_iot.central.common import API_VERSION
logger = get_logger(__name__)
BASE_PATH = "api/deviceGroups"
MODEL = "DeviceGroup"
def list_device_groups(
cmd,
app_id: str,
token: str,
api_version=API_VERSION,
max_pages=0,
central_dns_suffix=CENTRAL_ENDPOINT,
) -> List[DeviceGroupGa]:
"""
Get a list of all device groups.
Args:
cmd: command passed into az
app_id: name of app (used for forming request URL)
token: (OPTIONAL) authorization token to fetch device details from IoTC.
MUST INCLUDE type (e.g. 'SharedAccessToken ...', 'Bearer ...')
central_dns_suffix: {centralDnsSuffixInPath} as found in docs
Returns:
list of device groups
"""
api_version = API_VERSION
device_groups = []
url = "https://{}.{}/{}".format(app_id, central_dns_suffix, BASE_PATH)
headers = _utility.get_headers(token, cmd)
# Construct parameters
query_parameters = {}
query_parameters["api-version"] = api_version
pages_processed = 0
while (max_pages == 0 or pages_processed < max_pages) and url:
response = requests.get(url, headers=headers, params=query_parameters)
result = _utility.try_extract_result(response)
if "value" not in result:
raise AzureResponseError("Value is not present in body: {}".format(result))
for device_group in result["value"]:
device_groups.append(DeviceGroupGa(device_group))
url = result.get("nextLink", None)
pages_processed = pages_processed + 1
return device_groups
def get_device_group(
cmd,
app_id: str,
device_group_id: str,
token: str,
api_version=API_VERSION,
central_dns_suffix=CENTRAL_ENDPOINT,
) -> DeviceGroupGa:
"""
Get a specific device group.
Args:
cmd: command passed into az
device_group_id: case sensitive device group id,
app_id: name of app (used for forming request URL)
token: (OPTIONAL) authorization token to fetch device details from IoTC.
MUST INCLUDE type (e.g. 'SharedAccessToken ...', 'Bearer ...')
central_dns_suffix: {centralDnsSuffixInPath} as found in docs
Returns:
device_group: dict
"""
api_version = API_VERSION
result = _utility.make_api_call(
cmd,
app_id=app_id,
method="GET",
url="https://{}.{}/{}/{}".format(app_id, central_dns_suffix, BASE_PATH, device_group_id),
payload=None,
token=token,
api_version=api_version,
central_dnx_suffix=central_dns_suffix,
)
return _utility.get_object(result, model=MODEL, api_version=api_version)
def create_device_group(
cmd,
app_id: str,
device_group_id: str,
display_name: str,
filter: str,
description: str,
etag: str,
organizations: List[str],
token: str,
api_version=API_VERSION,
central_dns_suffix=CENTRAL_ENDPOINT,
) -> DeviceGroupGa:
"""
Create a device group.
Args:
cmd: command passed into az
app_id: name of app (used for forming request URL)
device_group_id: case sensitive device group id
display_name: Display name of the device group
filter: Query defining which devices should be in this group,
or check here for more information
https://learn.microsoft.com/en-us/azure/iot-central/core/howto-query-with-rest-api
description: Short summary of device group
organizations: List of organization IDs of the device group
token: (OPTIONAL) authorization token to fetch device details from IoTC.
MUST INCLUDE type (e.g. 'SharedAccessToken ...', 'Bearer ...')
central_dns_suffix: {centralDnsSuffixInPath} as found in docs
Returns:
device_group: dict
"""
api_version = API_VERSION
payload = {"displayName": display_name, "filter": filter}
if description is not None:
payload['description'] = description
if organizations is not None:
payload['organizations'] = organizations
if etag is not None:
payload['etag'] = etag
result = _utility.make_api_call(
cmd,
app_id=app_id,
method="PUT",
url="https://{}.{}/{}/{}".format(app_id, central_dns_suffix, BASE_PATH, device_group_id),
payload=payload,
token=token,
api_version=api_version,
central_dnx_suffix=central_dns_suffix,
)
return _utility.get_object(result, model=MODEL, api_version=api_version)
def update_device_group(
cmd,
app_id: str,
device_group_id: str,
display_name: str,
filter: str,
description: str,
organizations: List[str],
token: str,
api_version=API_VERSION,
central_dns_suffix=CENTRAL_ENDPOINT,
) -> DeviceGroupGa:
"""
Updates a device group.
Args:
cmd: command passed into az
app_id: name of app (used for forming request URL)
device_group_id: case sensitive device group id
display_name: Display name of the device group
filter: Query defining which devices should be in this group,
or check here for more information
https://learn.microsoft.com/en-us/azure/iot-central/core/howto-query-with-rest-api
description: Short summary of device group
organizations: List of organization IDs of the device group
token: (OPTIONAL) authorization token to fetch device details from IoTC.
MUST INCLUDE type (e.g. 'SharedAccessToken ...', 'Bearer ...')
central_dns_suffix: {centralDnsSuffixInPath} as found in docs
Returns:
device_group: dict
"""
api_version = API_VERSION
payload = {}
if display_name is not None:
payload["displayName"] = display_name
if filter is not None:
payload["filter"] = filter
if description is not None:
payload["description"] = description
if organizations is not None:
payload["organizations"] = organizations
result = _utility.make_api_call(
cmd,
app_id=app_id,
method="PATCH",
url="https://{}.{}/{}/{}".format(app_id, central_dns_suffix, BASE_PATH, device_group_id),
payload=payload,
token=token,
api_version=api_version,
central_dnx_suffix=central_dns_suffix,
)
return _utility.get_object(result, MODEL, api_version)
def delete_device_group(
cmd,
app_id: str,
device_group_id: str,
token: str,
api_version=API_VERSION,
central_dns_suffix=CENTRAL_ENDPOINT,
) -> dict:
"""
Delete a device group.
Args:
cmd: command passed into az
app_id: name of app (used for forming request URL)
device_group_id: case sensitive device group id,
token: (OPTIONAL) authorization token to fetch device details from IoTC.
MUST INCLUDE type (e.g. 'SharedAccessToken ...', 'Bearer ...')
central_dns_suffix: {centralDnsSuffixInPath} as found in docs
Returns:
device_group: dict
"""
api_version = API_VERSION
return _utility.make_api_call(
cmd,
app_id=app_id,
method="DELETE",
url="https://{}.{}/{}/{}".format(app_id, central_dns_suffix, BASE_PATH, device_group_id),
payload=None,
token=token,
api_version=api_version,
central_dnx_suffix=central_dns_suffix,
)