From cef8c54d5190a5c94eef87fba68520ee077a1155 Mon Sep 17 00:00:00 2001 From: Kaveesh Dubey Date: Wed, 16 Jul 2025 14:13:45 -0700 Subject: [PATCH 1/4] fix: update prom and logs addon to use sdk --- .../command_modules/acs/addonconfiguration.py | 76 ++++++++++++------ .../acs/azuremonitormetrics/addonput.py | 27 +++---- .../acs/azuremonitormetrics/amg/link.py | 80 ++++++++----------- .../acs/azuremonitormetrics/amw/create.py | 19 ++--- .../acs/azuremonitormetrics/dc/dce_api.py | 30 +++---- .../acs/azuremonitormetrics/dc/dcr_api.py | 39 +++++---- .../acs/azuremonitormetrics/dc/dcra_api.py | 53 ++++++------ .../acs/azuremonitormetrics/dc/delete.py | 31 +++---- .../acs/azuremonitormetrics/helper.py | 15 ++-- .../recordingrules/create.py | 19 +++-- .../recordingrules/delete.py | 20 ++--- 11 files changed, 202 insertions(+), 207 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py b/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py index 4937b9369a2..cbc7ff0e2fc 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py +++ b/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py @@ -620,19 +620,25 @@ def ensure_container_insights_for_monitoring( } ) + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cluster_subscription) for _ in range(3): try: if enable_syslog: - send_raw_request( - cmd.cli_ctx, "PUT", dcr_url, body=dcr_creation_body_with_syslog + resources.begin_create_or_update_by_id( + dcr_resource_id, + "2022-06-01", + json.loads(dcr_creation_body_with_syslog) ) else: - send_raw_request( - cmd.cli_ctx, "PUT", dcr_url, body=dcr_creation_body_without_syslog + resources.begin_create_or_update_by_id( + dcr_resource_id, + "2022-06-01", + json.loads(dcr_creation_body_without_syslog) ) error = None break - except AzCLIError as e: + except Exception as e: error = e else: raise error @@ -664,17 +670,19 @@ def create_dce_association(cmd, cluster_region, cluster_resource_id, config_dce_ ) association_url = cmd.cli_ctx.cloud.endpoints.resource_manager + \ f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/configurationAccessEndpoint?api-version=2022-06-01" + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) + association_id = f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/configurationAccessEndpoint" for _ in range(3): try: - send_raw_request( - cmd.cli_ctx, - "PUT", - association_url, - body=association_body, + resources.begin_create_or_update_by_id( + association_id, + "2022-06-01", + json.loads(association_body) ) error = None break - except AzCLIError as e: + except Exception as e: error = e else: raise error @@ -692,17 +700,25 @@ def create_or_delete_dcr_association(cmd, cluster_region, remove_monitoring, clu ) association_url = cmd.cli_ctx.cloud.endpoints.resource_manager + \ f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/ContainerInsightsExtension?api-version=2022-06-01" + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) + association_id = f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/ContainerInsightsExtension" for _ in range(3): try: - send_raw_request( - cmd.cli_ctx, - "PUT" if not remove_monitoring else "DELETE", - association_url, - body=association_body, - ) + if not remove_monitoring: + resources.begin_create_or_update_by_id( + association_id, + "2022-06-01", + json.loads(association_body) + ) + else: + resources.begin_delete_by_id( + association_id, + "2022-06-01" + ) error = None break - except AzCLIError as e: + except Exception as e: error = e else: raise error @@ -719,17 +735,19 @@ def create_ampls_scope(cmd, ampls_resource_id, dce_endpoint_name, dce_resource_i link_dce_ampls_url = cmd.cli_ctx.cloud.endpoints.resource_manager + \ f"{ampls_resource_id}/scopedresources/{dce_endpoint_name}-connection?api-version=2021-07-01-preview" + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) + ampls_scope_id = f"{ampls_resource_id}/scopedresources/{dce_endpoint_name}-connection" for _ in range(3): try: - send_raw_request( - cmd.cli_ctx, - "PUT", - link_dce_ampls_url, - body=link_dce_ampls_body, + resources.begin_create_or_update_by_id( + ampls_scope_id, + "2021-07-01-preview", + json.loads(link_dce_ampls_body) ) error = None break - except AzCLIError as e: + except Exception as e: error = e else: raise error @@ -755,12 +773,18 @@ def create_data_collection_endpoint(cmd, subscription, resource_group, region, e if is_ampls: dce_creation_body_common["properties"]["networkAcls"]["publicNetworkAccess"] = "Disabled" dce_creation_body_ = json.dumps(dce_creation_body_common) + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, subscription) for _ in range(3): try: - send_raw_request(cmd.cli_ctx, "PUT", dce_url, body=dce_creation_body_) + resources.begin_create_or_update_by_id( + dce_resource_id, + "2022-06-01", + json.loads(dce_creation_body_) + ) error = None break - except AzCLIError as e: + except Exception as e: error = e else: raise error diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py index 95b92ce4b27..79b20c3107b 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py @@ -12,25 +12,18 @@ # pylint: disable=line-too-long def addon_put(cmd, cluster_subscription, cluster_resource_group_name, cluster_name): - from azure.cli.core.util import send_raw_request - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - feature_check_url = f"{armendpoint}/subscriptions/{cluster_subscription}/resourceGroups/{cluster_resource_group_name}/providers/Microsoft.ContainerService/managedClusters/{cluster_name}?api-version={AKS_CLUSTER_API}" + from azure.cli.command_modules.acs._client_factory import get_managed_clusters_client + client = get_managed_clusters_client(cmd.cli_ctx, cluster_subscription) try: - headers = ['User-Agent=azuremonitormetrics.addon_get'] - r = send_raw_request(cmd.cli_ctx, "GET", feature_check_url, - body={}, headers=headers) + mc = client.get(cluster_resource_group_name, cluster_name) except CLIError as e: raise UnknownError(e) - json_response = json.loads(r.text) - if "azureMonitorProfile" in json_response["properties"]: - if "metrics" in json_response["properties"]["azureMonitorProfile"]: - if json_response["properties"]["azureMonitorProfile"]["metrics"]["enabled"] is False: - # What if enabled doesn't exist - json_response["properties"]["azureMonitorProfile"]["metrics"]["enabled"] = True + # Enable metrics if present and not already enabled + if hasattr(mc, "azure_monitor_profile") and mc.azure_monitor_profile: + if hasattr(mc.azure_monitor_profile, "metrics") and mc.azure_monitor_profile.metrics: + if getattr(mc.azure_monitor_profile.metrics, "enabled", None) is False: + mc.azure_monitor_profile.metrics.enabled = True try: - headers = ['User-Agent=azuremonitormetrics.addon_put'] - body = json.dumps(json_response) - r = send_raw_request(cmd.cli_ctx, "PUT", feature_check_url, - body=body, headers=headers) - except CLIError as e: + client.begin_create_or_update(cluster_resource_group_name, cluster_name, mc) + except Exception as e: raise UnknownError(e) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py index f78046b71ac..1a74449a217 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py @@ -14,71 +14,62 @@ def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_id): - from azure.cli.core.util import send_raw_request + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, raw_parameters.get("subscription_id")) # GET grafana principal ID try: grafana_resource_id = raw_parameters.get("grafana_resource_id") if grafana_resource_id is None or grafana_resource_id == "": return GrafanaLink.NOPARAMPROVIDED grafana_resource_id = sanitize_resource_id(grafana_resource_id) - grafanaURI = "{0}{1}?api-version={2}".format( - cmd.cli_ctx.cloud.endpoints.resource_manager, - grafana_resource_id, - GRAFANA_API - ) - headers = ['User-Agent=azuremonitormetrics.link_grafana_instance'] - grafanaArmResponse = send_raw_request(cmd.cli_ctx, "GET", grafanaURI, body={}, headers=headers) + grafanaArmResponse = resources.get_by_id(grafana_resource_id, GRAFANA_API) # Check if 'identity' and 'type' exist in the response - identity_info = grafanaArmResponse.json().get("identity", {}) - identity_type = identity_info.get("type", "").lower() + identity_info = getattr(grafanaArmResponse, "identity", {}) + identity_type = getattr(identity_info, "type", "").lower() if identity_info else "" if identity_type == "systemassigned": - servicePrincipalId = identity_info.get("principalId") + servicePrincipalId = getattr(identity_info, "principal_id", None) elif identity_type == "userassigned": - user_assigned_identities = identity_info.get("userAssignedIdentities", {}) + user_assigned_identities = getattr(identity_info, "user_assigned_identities", {}) if not user_assigned_identities: raise CLIError("No user-assigned identities found.") - servicePrincipalId = list(user_assigned_identities.values())[0]["principalId"] + servicePrincipalId = list(user_assigned_identities.values())[0]["principal_id"] else: raise CLIError("Unsupported or missing identity type.") if not servicePrincipalId: raise CLIError("No service principal ID found for the specified identity.") - except CLIError as e: + except Exception as e: raise CLIError(e) # Add Role Assignment try: MonitoringDataReader = "b0d8363b-8ddd-447d-831f-62ca05bff136" - roleDefinitionURI = "{0}{1}/providers/Microsoft.Authorization/roleAssignments/{2}?api-version={3}".format( - cmd.cli_ctx.cloud.endpoints.resource_manager, - azure_monitor_workspace_resource_id, - uuid.uuid4(), - GRAFANA_ROLE_ASSIGNMENT_API - ) - roleDefinitionId = "{0}/providers/Microsoft.Authorization/roleDefinitions/{1}".format( - azure_monitor_workspace_resource_id, - MonitoringDataReader - ) - association_body = json.dumps({ + import uuid as _uuid + roleAssignmentId = str(_uuid.uuid4()) + roleDefinitionId = f"{azure_monitor_workspace_resource_id}/providers/Microsoft.Authorization/roleDefinitions/{MonitoringDataReader}" + roleAssignmentResourceId = f"{azure_monitor_workspace_resource_id}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}" + association_body = { "properties": { "roleDefinitionId": roleDefinitionId, "principalId": servicePrincipalId } - }) - headers = ['User-Agent=azuremonitormetrics.add_role_assignment'] - send_raw_request(cmd.cli_ctx, "PUT", roleDefinitionURI, body=association_body, headers=headers) - except CLIError as e: - if e.response.status_code != 409: - erroString = "Role Assingment failed. Please manually assign the `Monitoring Data Reader` role\ - to the Azure Monitor Workspace ({0}) for the Azure Managed Grafana\ - System Assigned Managed Identity ({1})".format( - azure_monitor_workspace_resource_id, - servicePrincipalId + } + try: + resources.begin_create_or_update_by_id( + roleAssignmentResourceId, + GRAFANA_ROLE_ASSIGNMENT_API, + association_body ) - print(erroString) + except Exception as e: + # If already exists (409), ignore, else print error + if not (hasattr(e, "status_code") and e.status_code == 409): + erroString = f"Role Assingment failed. Please manually assign the `Monitoring Data Reader` role\n to the Azure Monitor Workspace ({azure_monitor_workspace_resource_id}) for the Azure Managed Grafana\n System Assigned Managed Identity ({servicePrincipalId})" + print(erroString) + except Exception as e: + raise CLIError(e) # Setting up AMW Integration - targetGrafanaArmPayload = grafanaArmResponse.json() + targetGrafanaArmPayload = grafanaArmResponse.as_dict() if hasattr(grafanaArmResponse, "as_dict") else grafanaArmResponse if targetGrafanaArmPayload["properties"] is None: raise CLIError("Invalid grafana payload to add AMW integration") if "grafanaIntegrations" not in json.dumps(targetGrafanaArmPayload): @@ -89,17 +80,14 @@ def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_ if amwIntegrations != [] and azure_monitor_workspace_resource_id in json.dumps(amwIntegrations).lower(): return GrafanaLink.ALREADYPRESENT try: - grafanaURI = "{0}{1}?api-version={2}".format( - cmd.cli_ctx.cloud.endpoints.resource_manager, - grafana_resource_id, - GRAFANA_API - ) targetGrafanaArmPayload["properties"]["grafanaIntegrations"]["azureMonitorWorkspaceIntegrations"].append({ "azureMonitorWorkspaceResourceId": azure_monitor_workspace_resource_id }) - targetGrafanaArmPayload = json.dumps(targetGrafanaArmPayload) - headers = ['User-Agent=azuremonitormetrics.setup_amw_grafana_integration', 'Content-Type=application/json'] - send_raw_request(cmd.cli_ctx, "PUT", grafanaURI, body=targetGrafanaArmPayload, headers=headers) - except CLIError as e: + resources.begin_create_or_update_by_id( + grafana_resource_id, + GRAFANA_API, + targetGrafanaArmPayload + ) + except Exception as e: raise CLIError(e) return GrafanaLink.SUCCESS diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py index 05e728813cc..538dbb85724 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py @@ -12,7 +12,6 @@ def create_default_mac(cmd, cluster_subscription, cluster_region): - from azure.cli.core.util import send_raw_request default_mac_name, default_mac_region = get_default_mac_name_and_region(cmd, cluster_region, cluster_subscription) default_resource_group_name = "DefaultResourceGroup-{0}".format(default_mac_region) azure_monitor_workspace_resource_id = \ @@ -36,13 +35,15 @@ def create_default_mac(cmd, cluster_subscription, cluster_region): raise ex else: resource_groups.create_or_update(default_resource_group_name, {"location": default_mac_region}) - association_body = json.dumps({"location": default_mac_region, "properties": {}}) - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - association_url = f"{armendpoint}{azure_monitor_workspace_resource_id}?api-version={MAC_API}" try: - headers = ['User-Agent=azuremonitormetrics.create_default_mac'] - send_raw_request(cmd.cli_ctx, "PUT", association_url, - body=association_body, headers=headers) + resources.begin_create_or_update_by_id( + azure_monitor_workspace_resource_id, + MAC_API, + { + "location": default_mac_region, + "properties": {} + } + ) return azure_monitor_workspace_resource_id, default_mac_region - except CLIError as e: - raise e + except Exception as e: + raise CLIError(e) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py index 9cfda76dd4c..789afcdef1e 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py @@ -9,20 +9,22 @@ def create_dce(cmd, cluster_subscription, cluster_resource_group_name, cluster_name, mac_region): - from azure.cli.core.util import send_raw_request dce_name = get_default_dce_name(mac_region, cluster_name) - dce_resource_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Insights/dataCollectionEndpoints/{2}"\ - .format(cluster_subscription, cluster_resource_group_name, dce_name) + dce_resource_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Insights/dataCollectionEndpoints/{2}".format( + cluster_subscription, cluster_resource_group_name, dce_name) + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cluster_subscription) try: - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - dce_url = f"{armendpoint}{dce_resource_id}?api-version={DC_API}" - dce_creation_body = json.dumps({"name": dce_name, - "location": mac_region, - "kind": "Linux", - "properties": {}}) - headers = ['User-Agent=azuremonitormetrics.create_dce'] - send_raw_request(cmd.cli_ctx, "PUT", - dce_url, body=dce_creation_body, headers=headers) + resources.begin_create_or_update_by_id( + dce_resource_id, + DC_API, + { + "name": dce_name, + "location": mac_region, + "kind": "Linux", + "properties": {} + } + ) return dce_resource_id - except CLIError as error: - raise error + except Exception as error: + raise CLIError(error) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py index 6e92cfd409a..333a4ce4c76 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py @@ -12,28 +12,33 @@ # pylint: disable=too-many-locals,too-many-branches,too-many-statements,line-too-long def create_dcr(cmd, mac_region, azure_monitor_workspace_resource_id, cluster_subscription, cluster_resource_group_name, cluster_name, dce_resource_id): - from azure.cli.core.util import send_raw_request dcr_name = get_default_dcr_name(mac_region, cluster_name) dcr_resource_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Insights/dataCollectionRules/{2}".format( cluster_subscription, cluster_resource_group_name, dcr_name ) - dcr_creation_body = json.dumps({"location": mac_region, - "kind": "Linux", - "properties": { - "dataCollectionEndpointId": dce_resource_id, - "dataSources": {"prometheusForwarder": [{"name": "PrometheusDataSource", "streams": ["Microsoft-PrometheusMetrics"], "labelIncludeFilter": {}}]}, - "dataFlows": [{"destinations": ["MonitoringAccount1"], "streams": ["Microsoft-PrometheusMetrics"]}], - "description": "DCR description", - "destinations": { - "monitoringAccounts": [{"accountResourceId": azure_monitor_workspace_resource_id, "name": "MonitoringAccount1"}]}}}) - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - dcr_url = f"{armendpoint}{dcr_resource_id}?api-version={DC_API}" + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cluster_subscription) + dcr_creation_body = { + "location": mac_region, + "kind": "Linux", + "properties": { + "dataCollectionEndpointId": dce_resource_id, + "dataSources": {"prometheusForwarder": [{"name": "PrometheusDataSource", "streams": ["Microsoft-PrometheusMetrics"], "labelIncludeFilter": {}}]}, + "dataFlows": [{"destinations": ["MonitoringAccount1"], "streams": ["Microsoft-PrometheusMetrics"]}], + "description": "DCR description", + "destinations": { + "monitoringAccounts": [{"accountResourceId": azure_monitor_workspace_resource_id, "name": "MonitoringAccount1"}] + } + } + } try: - headers = ['User-Agent=azuremonitormetrics.create_dcr'] - send_raw_request(cmd.cli_ctx, "PUT", - dcr_url, body=dcr_creation_body, headers=headers) + resources.begin_create_or_update_by_id( + dcr_resource_id, + DC_API, + dcr_creation_body + ) return dcr_resource_id - except CLIError as error: - raise error + except Exception as error: + raise CLIError(error) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py index b402a7a1104..192ca11298e 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py @@ -10,34 +10,33 @@ # pylint: disable=line-too-long def create_dcra(cmd, cluster_region, cluster_subscription, cluster_resource_group_name, cluster_name, dcr_resource_id): - from azure.cli.core.util import send_raw_request - cluster_resource_id = \ - "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.ContainerService/managedClusters/{2}".format( - cluster_subscription, - cluster_resource_group_name, - cluster_name - ) + cluster_resource_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.ContainerService/managedClusters/{2}".format( + cluster_subscription, + cluster_resource_group_name, + cluster_name + ) dcra_name = get_default_dcra_name() - dcra_resource_id = \ - "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{2}"\ - .format( - cluster_subscription, - cluster_resource_group_name, - dcra_name - ) + dcra_resource_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{2}".format( + cluster_subscription, + cluster_resource_group_name, + dcra_name + ) description_str = "Promtheus data collection association between DCR, DCE and target AKS resource" - # only create or delete the association between the DCR and cluster - association_body = json.dumps({"location": cluster_region, - "properties": { - "dataCollectionRuleId": dcr_resource_id, - "description": description_str - }}) - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - association_url = f"{armendpoint}{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{dcra_name}?api-version={DC_API}" + association_body = { + "location": cluster_region, + "properties": { + "dataCollectionRuleId": dcr_resource_id, + "description": description_str + } + } + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cluster_subscription) try: - headers = ['User-Agent=azuremonitormetrics.create_dcra'] - send_raw_request(cmd.cli_ctx, "PUT", association_url, - body=association_body, headers=headers) + resources.begin_create_or_update_by_id( + f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{dcra_name}", + DC_API, + association_body + ) return dcra_resource_id - except CLIError as error: - raise error + except Exception as error: + raise CLIError(error) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/delete.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/delete.py index 48566bae071..3e558297350 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/delete.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/delete.py @@ -47,33 +47,24 @@ def get_dc_objects_list(cmd, cluster_subscription, cluster_resource_group_name, # pylint: disable=line-too-long def delete_dc_objects_if_prometheus_enabled(cmd, dc_objects_list, cluster_subscription, cluster_resource_group_name, cluster_name): - from azure.cli.core.util import send_raw_request + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cluster_subscription) cluster_resource_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.ContainerService/managedClusters/{2}".format( cluster_subscription, cluster_resource_group_name, cluster_name ) for item in dc_objects_list: - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - association_url = f"{armendpoint}{item['dataCollectionRuleId']}?api-version={DC_API}" try: - headers = ['User-Agent=azuremonitormetrics.get_dcr_if_prometheus_enabled'] - r = send_raw_request(cmd.cli_ctx, "GET", association_url, headers=headers) - data = json.loads(r.text) - if 'microsoft-prometheusmetrics' in [stream.lower() for stream in data['properties']['dataFlows'][0]['streams']]: + dcr = resources.get_by_id(item['dataCollectionRuleId'], DC_API) + dataFlows = getattr(dcr, 'properties', {}).get('dataFlows', []) if hasattr(dcr, 'properties') else dcr.get('properties', {}).get('dataFlows', []) + if dataFlows and 'microsoft-prometheusmetrics' in [stream.lower() for stream in dataFlows[0].get('streams', [])]: # delete DCRA - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - url = f"{armendpoint}{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{item['name']}?api-version={DC_API}" - headers = ['User-Agent=azuremonitormetrics.delete_dcra'] - send_raw_request(cmd.cli_ctx, "DELETE", url, headers=headers) + dcra_id = f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{item['name']}" + resources.begin_delete_by_id(dcra_id, DC_API) # delete DCR - url = f"{armendpoint}{item['dataCollectionRuleId']}?api-version={DC_API}" - headers = ['User-Agent=azuremonitormetrics.delete_dcr'] - send_raw_request(cmd.cli_ctx, "DELETE", url, headers=headers) + resources.begin_delete_by_id(item['dataCollectionRuleId'], DC_API) # delete DCE - url = f"{armendpoint}{item['dceId']}?api-version={DC_API}" - headers = ['User-Agent=azuremonitormetrics.delete_dce'] - send_raw_request(cmd.cli_ctx, "DELETE", url, headers=headers) - except CLIError as e: - error = e - raise CLIError(error) + resources.begin_delete_by_id(item['dceId'], DC_API) + except Exception as e: + raise CLIError(e) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py index 46deecf4b2a..582ae0aafa9 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py @@ -7,6 +7,8 @@ from azure.cli.core.azclierror import ( UnknownError ) +from azure.cli.core.commands.client_factory import get_mgmt_service_client +from azure.cli.core.profiles import ResourceType from azure.cli.command_modules.acs.azuremonitormetrics.constants import ( RP_API, AKS_CLUSTER_API @@ -23,17 +25,10 @@ def sanitize_resource_id(resource_id): def post_request(cmd, subscription_id, rp_name, headers): - from azure.cli.core.util import send_raw_request - armendpoint = cmd.cli_ctx.cloud.endpoints.resource_manager - customUrl = "{0}/subscriptions/{1}/providers/{2}/register?api-version={3}".format( - armendpoint, - subscription_id, - rp_name, - RP_API, - ) + resource_client = get_mgmt_service_client(cmd.cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) try: - send_raw_request(cmd.cli_ctx, "POST", customUrl, headers=headers) - except CLIError as e: + resource_client.providers.register(rp_name) + except Exception as e: raise CLIError(e) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/create.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/create.py index 78544002268..a35b62a5911 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/create.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/create.py @@ -32,8 +32,9 @@ def get_recording_rules_template(cmd, azure_monitor_workspace_resource_id): # pylint: disable=line-too-long def put_rules(cmd, default_rule_group_id, default_rule_group_name, mac_region, cluster_resource_id, azure_monitor_workspace_resource_id, cluster_name, default_rules_template, url, enable_rules, i): - from azure.cli.core.util import send_raw_request - body = json.dumps({ + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) + body = { "id": default_rule_group_id, "name": default_rule_group_name, "type": "Microsoft.AlertsManagement/prometheusRuleGroups", @@ -48,15 +49,17 @@ def put_rules(cmd, default_rule_group_id, default_rule_group_name, mac_region, c "interval": "PT1M", "rules": default_rules_template[i]["properties"]["rulesArmTemplate"]["resources"][0]["properties"]["rules"] } - }) + } for _ in range(3): try: - headers = ['User-Agent=azuremonitormetrics.put_rules.' + default_rule_group_name] - send_raw_request(cmd.cli_ctx, "PUT", url, - body=body, headers=headers) + resources.begin_create_or_update_by_id( + default_rule_group_id, + url.split('api-version=')[1], + body + ) break - except CLIError as e: - raise e + except Exception as e: + raise CLIError(e) # pylint: disable=line-too-long diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py index 50e495f7f55..ec669e71b12 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py @@ -7,20 +7,14 @@ def delete_rule(cmd, cluster_subscription, cluster_resource_group_name, default_rule_group_name): - from azure.cli.core.util import send_raw_request - default_rule_group_id = \ - "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.AlertsManagement/prometheusRuleGroups/{2}".format( - cluster_subscription, - cluster_resource_group_name, - default_rule_group_name - ) - headers = ['User-Agent=azuremonitormetrics.delete_rule.' + default_rule_group_name] - url = "{0}{1}?api-version={2}".format( - cmd.cli_ctx.cloud.endpoints.resource_manager, - default_rule_group_id, - RULES_API + from azure.cli.command_modules.acs._client_factory import get_resources_client + resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) + default_rule_group_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.AlertsManagement/prometheusRuleGroups/{2}".format( + cluster_subscription, + cluster_resource_group_name, + default_rule_group_name ) - send_raw_request(cmd.cli_ctx, "DELETE", url, headers=headers) + resources.begin_delete_by_id(default_rule_group_id, RULES_API) def delete_rules(cmd, cluster_subscription, cluster_resource_group_name, cluster_name): From 1995c29c1a56cce2f97a486e74c333f2ee25eab2 Mon Sep 17 00:00:00 2001 From: Kaveesh Dubey Date: Thu, 17 Jul 2025 13:12:47 -0700 Subject: [PATCH 2/4] style fixes --- .../command_modules/acs/addonconfiguration.py | 24 ++++----------- .../acs/azuremonitormetrics/addonput.py | 6 ++-- .../acs/azuremonitormetrics/amg/link.py | 30 ++++++++++++++----- .../acs/azuremonitormetrics/amw/create.py | 2 -- .../acs/azuremonitormetrics/dc/dce_api.py | 11 +++++-- .../acs/azuremonitormetrics/dc/dcr_api.py | 1 - .../acs/azuremonitormetrics/dc/dcra_api.py | 1 - .../acs/azuremonitormetrics/helper.py | 4 +-- .../recordingrules/delete.py | 5 +++- 9 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py b/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py index cbc7ff0e2fc..20c76808ebe 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py +++ b/src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py @@ -620,7 +620,6 @@ def ensure_container_insights_for_monitoring( } ) - from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, cluster_subscription) for _ in range(3): try: @@ -638,7 +637,7 @@ def ensure_container_insights_for_monitoring( ) error = None break - except Exception as e: + except CLIError as e: error = e else: raise error @@ -668,9 +667,6 @@ def create_dce_association(cmd, cluster_region, cluster_resource_id, config_dce_ }, } ) - association_url = cmd.cli_ctx.cloud.endpoints.resource_manager + \ - f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/configurationAccessEndpoint?api-version=2022-06-01" - from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) association_id = f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/configurationAccessEndpoint" for _ in range(3): @@ -682,7 +678,7 @@ def create_dce_association(cmd, cluster_region, cluster_resource_id, config_dce_ ) error = None break - except Exception as e: + except CLIError as e: error = e else: raise error @@ -698,9 +694,6 @@ def create_or_delete_dcr_association(cmd, cluster_region, remove_monitoring, clu }, } ) - association_url = cmd.cli_ctx.cloud.endpoints.resource_manager + \ - f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/ContainerInsightsExtension?api-version=2022-06-01" - from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) association_id = f"{cluster_resource_id}/providers/Microsoft.Insights/dataCollectionRuleAssociations/ContainerInsightsExtension" for _ in range(3): @@ -718,7 +711,7 @@ def create_or_delete_dcr_association(cmd, cluster_region, remove_monitoring, clu ) error = None break - except Exception as e: + except CLIError as e: error = e else: raise error @@ -732,10 +725,6 @@ def create_ampls_scope(cmd, ampls_resource_id, dce_endpoint_name, dce_resource_i }, } ) - link_dce_ampls_url = cmd.cli_ctx.cloud.endpoints.resource_manager + \ - f"{ampls_resource_id}/scopedresources/{dce_endpoint_name}-connection?api-version=2021-07-01-preview" - - from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) ampls_scope_id = f"{ampls_resource_id}/scopedresources/{dce_endpoint_name}-connection" for _ in range(3): @@ -747,7 +736,7 @@ def create_ampls_scope(cmd, ampls_resource_id, dce_endpoint_name, dce_resource_i ) error = None break - except Exception as e: + except CLIError as e: error = e else: raise error @@ -758,8 +747,6 @@ def create_data_collection_endpoint(cmd, subscription, resource_group, region, e f"/subscriptions/{subscription}/resourceGroups/{resource_group}/" f"providers/Microsoft.Insights/dataCollectionEndpoints/{endpoint_name}" ) - dce_url = cmd.cli_ctx.cloud.endpoints.resource_manager + \ - f"{dce_resource_id}?api-version=2022-06-01" # create the DCE dce_creation_body_common = { "location": region, @@ -773,7 +760,6 @@ def create_data_collection_endpoint(cmd, subscription, resource_group, region, e if is_ampls: dce_creation_body_common["properties"]["networkAcls"]["publicNetworkAccess"] = "Disabled" dce_creation_body_ = json.dumps(dce_creation_body_common) - from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, subscription) for _ in range(3): try: @@ -784,7 +770,7 @@ def create_data_collection_endpoint(cmd, subscription, resource_group, region, e ) error = None break - except Exception as e: + except CLIError as e: error = e else: raise error diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py index 79b20c3107b..39040dc9b14 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/addonput.py @@ -2,8 +2,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -import json -from azure.cli.command_modules.acs.azuremonitormetrics.constants import AKS_CLUSTER_API +from azure.cli.command_modules.acs._client_factory import get_container_service_client from azure.cli.core.azclierror import ( UnknownError, CLIError @@ -12,8 +11,7 @@ # pylint: disable=line-too-long def addon_put(cmd, cluster_subscription, cluster_resource_group_name, cluster_name): - from azure.cli.command_modules.acs._client_factory import get_managed_clusters_client - client = get_managed_clusters_client(cmd.cli_ctx, cluster_subscription) + client = get_container_service_client(cmd.cli_ctx, cluster_subscription).managed_clusters try: mc = client.get(cluster_resource_group_name, cluster_name) except CLIError as e: diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py index 1a74449a217..06249bb9131 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py @@ -13,6 +13,7 @@ from azure.cli.command_modules.acs.azuremonitormetrics.helper import sanitize_resource_id +# pylint: disable=line-too-long def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_id): from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, raw_parameters.get("subscription_id")) @@ -45,10 +46,15 @@ def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_ # Add Role Assignment try: MonitoringDataReader = "b0d8363b-8ddd-447d-831f-62ca05bff136" - import uuid as _uuid - roleAssignmentId = str(_uuid.uuid4()) - roleDefinitionId = f"{azure_monitor_workspace_resource_id}/providers/Microsoft.Authorization/roleDefinitions/{MonitoringDataReader}" - roleAssignmentResourceId = f"{azure_monitor_workspace_resource_id}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}" + roleAssignmentId = str(uuid.uuid4()) + roleDefinitionId = ( + f"{azure_monitor_workspace_resource_id}/providers/Microsoft.Authorization/roleDefinitions/" + f"{MonitoringDataReader}" + ) + roleAssignmentResourceId = ( + f"{azure_monitor_workspace_resource_id}/providers/Microsoft.Authorization/roleAssignments/" + f"{roleAssignmentId}" + ) association_body = { "properties": { "roleDefinitionId": roleDefinitionId, @@ -61,15 +67,23 @@ def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_ GRAFANA_ROLE_ASSIGNMENT_API, association_body ) - except Exception as e: + except CLIError as e: # If already exists (409), ignore, else print error if not (hasattr(e, "status_code") and e.status_code == 409): - erroString = f"Role Assingment failed. Please manually assign the `Monitoring Data Reader` role\n to the Azure Monitor Workspace ({azure_monitor_workspace_resource_id}) for the Azure Managed Grafana\n System Assigned Managed Identity ({servicePrincipalId})" + erroString = ( + f"Role Assingment failed. Please manually assign the `Monitoring Data Reader` role\n" + f"to the Azure Monitor Workspace ({azure_monitor_workspace_resource_id}) " + f"for the Azure Managed Grafana\nSystem Assigned Managed Identity ({servicePrincipalId})" + ) print(erroString) except Exception as e: raise CLIError(e) # Setting up AMW Integration - targetGrafanaArmPayload = grafanaArmResponse.as_dict() if hasattr(grafanaArmResponse, "as_dict") else grafanaArmResponse + targetGrafanaArmPayload = ( + grafanaArmResponse.as_dict() + if hasattr(grafanaArmResponse, "as_dict") + else grafanaArmResponse + ) if targetGrafanaArmPayload["properties"] is None: raise CLIError("Invalid grafana payload to add AMW integration") if "grafanaIntegrations" not in json.dumps(targetGrafanaArmPayload): @@ -88,6 +102,6 @@ def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_ GRAFANA_API, targetGrafanaArmPayload ) - except Exception as e: + except CLIError as e: raise CLIError(e) return GrafanaLink.SUCCESS diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py index 538dbb85724..42d66ff3897 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amw/create.py @@ -2,8 +2,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -import json - from azure.cli.command_modules.acs.azuremonitormetrics.constants import MAC_API from azure.cli.command_modules.acs.azuremonitormetrics.amw.defaults import get_default_mac_name_and_region from azure.cli.command_modules.acs._client_factory import get_resource_groups_client, get_resources_client diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py index 789afcdef1e..be05f7ac1c0 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dce_api.py @@ -2,7 +2,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -import json from azure.cli.command_modules.acs.azuremonitormetrics.constants import DC_API from azure.cli.command_modules.acs.azuremonitormetrics.dc.defaults import get_default_dce_name from knack.util import CLIError @@ -10,8 +9,14 @@ def create_dce(cmd, cluster_subscription, cluster_resource_group_name, cluster_name, mac_region): dce_name = get_default_dce_name(mac_region, cluster_name) - dce_resource_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Insights/dataCollectionEndpoints/{2}".format( - cluster_subscription, cluster_resource_group_name, dce_name) + dce_resource_id = ( + "/subscriptions/{0}/resourceGroups/{1}/providers/" + "Microsoft.Insights/dataCollectionEndpoints/{2}" + ).format( + cluster_subscription, + cluster_resource_group_name, + dce_name + ) from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, cluster_subscription) try: diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py index 333a4ce4c76..631fd477f2c 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcr_api.py @@ -2,7 +2,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -import json from azure.cli.command_modules.acs.azuremonitormetrics.dc.defaults import get_default_dcr_name from azure.cli.command_modules.acs.azuremonitormetrics.constants import ( DC_API diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py index 192ca11298e..04603323d7f 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/dc/dcra_api.py @@ -2,7 +2,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- -import json from azure.cli.command_modules.acs.azuremonitormetrics.constants import DC_API from azure.cli.command_modules.acs.azuremonitormetrics.dc.defaults import get_default_dcra_name from knack.util import CLIError diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py index 582ae0aafa9..a71a6562a1b 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/helper.py @@ -24,7 +24,7 @@ def sanitize_resource_id(resource_id): return resource_id.lower() -def post_request(cmd, subscription_id, rp_name, headers): +def post_request(cmd, rp_name): resource_client = get_mgmt_service_client(cmd.cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES) try: resource_client.providers.register(rp_name) @@ -54,7 +54,7 @@ def register_rps(cmd, subscription_id, rp_namespaces, user_agent): for namespace, registered in rp_namespaces.items(): if not registered: headers = ['User-Agent=azuremonitormetrics.register_{}_rp'.format(namespace.split('.')[1].lower())] - post_request(cmd, subscription_id, namespace, headers) + post_request(cmd, namespace) except CLIError as e: raise CLIError(e) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py index ec669e71b12..b4c1d5f9a74 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/recordingrules/delete.py @@ -9,7 +9,10 @@ def delete_rule(cmd, cluster_subscription, cluster_resource_group_name, default_rule_group_name): from azure.cli.command_modules.acs._client_factory import get_resources_client resources = get_resources_client(cmd.cli_ctx, cmd.cli_ctx.data.get('subscription_id')) - default_rule_group_id = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.AlertsManagement/prometheusRuleGroups/{2}".format( + default_rule_group_id = ( + "/subscriptions/{0}/resourceGroups/{1}/providers/" + "Microsoft.AlertsManagement/prometheusRuleGroups/{2}" + ).format( cluster_subscription, cluster_resource_group_name, default_rule_group_name From 5e54a48f888e4351a4a3cd00828a0d4bfbdc78b0 Mon Sep 17 00:00:00 2001 From: bragi92 Date: Thu, 17 Jul 2025 13:13:33 -0700 Subject: [PATCH 3/4] Update src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../cli/command_modules/acs/azuremonitormetrics/amg/link.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py index 06249bb9131..dc6538bbcc1 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py @@ -35,7 +35,10 @@ def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_ user_assigned_identities = getattr(identity_info, "user_assigned_identities", {}) if not user_assigned_identities: raise CLIError("No user-assigned identities found.") - servicePrincipalId = list(user_assigned_identities.values())[0]["principal_id"] + user_assigned_values = list(user_assigned_identities.values()) + if not user_assigned_values or "principal_id" not in user_assigned_values[0]: + raise CLIError("Invalid user-assigned identity structure or missing principal_id.") + servicePrincipalId = user_assigned_values[0]["principal_id"] else: raise CLIError("Unsupported or missing identity type.") From e2d4351f68ee9eb30d4464d44cf0fb137a132157 Mon Sep 17 00:00:00 2001 From: Kaveesh Dubey Date: Thu, 17 Jul 2025 13:14:15 -0700 Subject: [PATCH 4/4] fix spelling --- .../cli/command_modules/acs/azuremonitormetrics/amg/link.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py index 06249bb9131..898dbc0df7c 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py +++ b/src/azure-cli/azure/cli/command_modules/acs/azuremonitormetrics/amg/link.py @@ -71,7 +71,7 @@ def link_grafana_instance(cmd, raw_parameters, azure_monitor_workspace_resource_ # If already exists (409), ignore, else print error if not (hasattr(e, "status_code") and e.status_code == 409): erroString = ( - f"Role Assingment failed. Please manually assign the `Monitoring Data Reader` role\n" + f"Role Assignment failed. Please manually assign the `Monitoring Data Reader` role\n" f"to the Azure Monitor Workspace ({azure_monitor_workspace_resource_id}) " f"for the Azure Managed Grafana\nSystem Assigned Managed Identity ({servicePrincipalId})" )