azext_edge/edge/util/resource_graph.py (34 lines of code) (raw):
# coding=utf-8
# ----------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License file in the project root for license information.
# ----------------------------------------------------------------------------------------------
import json
from typing import List, Optional, TYPE_CHECKING
from azure.cli.core.util import send_raw_request
GRAPH_API_VERSION = "2022-10-01"
GRAPH_RESOURCE_PATH = f"/providers/Microsoft.ResourceGraph/resources?api-version={GRAPH_API_VERSION}"
if TYPE_CHECKING:
from requests.models import Response
class ResourceGraph:
def __init__(self, cmd, subscriptions: Optional[List[str]] = None):
self.cmd = cmd
self.subscriptions = []
if subscriptions:
self.subscriptions.extend(subscriptions)
def query_resources(self, query: str, page_size: Optional[int] = None) -> dict:
"""Query Azure Resource Graph (ARG).
Args:
query: An ARG compatible query string.
page_size: Integer corresponding to max records per page. Currently Id must be included
for skipToken paging to work correctly.
Returns:
A dict including a 'data' property that has the accumulated resources.
"""
return self._process_resource_query(query=query, page_size=page_size)
def _process_resource_query(self, query: str, page_size: Optional[int] = None) -> List[dict]:
result = {"data": []}
request_payload = {"subscriptions": self.subscriptions, "query": query, "options": {}}
if page_size:
request_payload["options"]["$top"] = page_size
while True:
request_body = json.dumps(request_payload)
# send_raw_request throws azure.cli.core.azclierror.HTTPError on not OK status code.
raw_request_response: Response = send_raw_request(
cli_ctx=self.cmd.cli_ctx,
url=GRAPH_RESOURCE_PATH,
body=request_body,
method="POST",
)
response_payload: dict = raw_request_response.json()
result["data"].extend(response_payload.get("data", []))
if "$skipToken" not in response_payload:
break
request_payload["options"] = {"$skipToken": response_payload["$skipToken"]}
return result