Skip to content

Commit cdc8b52

Browse files
Fixed handling of missing but linked cluster policies. (#361)
Fixes #358
1 parent f3886f7 commit cdc8b52

File tree

2 files changed

+39
-10
lines changed

2 files changed

+39
-10
lines changed

src/databricks/labs/ucx/assessment/crawlers.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import json
2+
import logging
23
import re
34
from dataclasses import dataclass
45

56
from databricks.sdk import WorkspaceClient
7+
from databricks.sdk.core import DatabricksError
68
from databricks.sdk.service.compute import ClusterSource
79
from databricks.sdk.service.jobs import BaseJob
810

911
from databricks.labs.ucx.framework.crawlers import CrawlerBase, SqlBackend
1012

13+
logger = logging.getLogger(__name__)
14+
1115
INCOMPATIBLE_SPARK_CONFIG_KEYS = [
1216
"spark.databricks.passthrough.enabled",
1317
"spark.hadoop.javax.jdo.option.ConnectionURL",
@@ -145,12 +149,15 @@ def _assess_clusters(self, all_clusters):
145149

146150
# Checking if Azure cluster config is present in cluster policies
147151
if cluster.policy_id:
148-
policy = self._ws.cluster_policies.get(cluster.policy_id)
149-
if _azure_sp_conf_present_check(json.loads(policy.definition)):
150-
failures.append(f"{_AZURE_SP_CONF_FAILURE_MSG} cluster.")
151-
if policy.policy_family_definition_overrides:
152-
if _azure_sp_conf_present_check(json.loads(policy.policy_family_definition_overrides)):
152+
try:
153+
policy = self._ws.cluster_policies.get(cluster.policy_id)
154+
if _azure_sp_conf_present_check(json.loads(policy.definition)):
153155
failures.append(f"{_AZURE_SP_CONF_FAILURE_MSG} cluster.")
156+
if policy.policy_family_definition_overrides:
157+
if _azure_sp_conf_present_check(json.loads(policy.policy_family_definition_overrides)):
158+
failures.append(f"{_AZURE_SP_CONF_FAILURE_MSG} cluster.")
159+
except DatabricksError as err:
160+
logger.warning(f"Error retrieving cluster policy {cluster.policy_id}. Error: {err}")
154161

155162
cluster_info.failures = json.dumps(failures)
156163
if len(failures) > 0:
@@ -220,12 +227,15 @@ def _assess_jobs(self, all_jobs: list[BaseJob], all_clusters_by_id) -> list[JobI
220227

221228
# Checking if Azure cluster config is present in cluster policies
222229
if cluster_config.policy_id:
223-
policy = self._ws.cluster_policies.get(cluster_config.policy_id)
224-
if _azure_sp_conf_present_check(json.loads(policy.definition)):
225-
job_assessment[job.job_id].add(f"{_AZURE_SP_CONF_FAILURE_MSG} Job cluster.")
226-
if policy.policy_family_definition_overrides:
227-
if _azure_sp_conf_present_check(json.loads(policy.policy_family_definition_overrides)):
230+
try:
231+
policy = self._ws.cluster_policies.get(cluster_config.policy_id)
232+
if _azure_sp_conf_present_check(json.loads(policy.definition)):
228233
job_assessment[job.job_id].add(f"{_AZURE_SP_CONF_FAILURE_MSG} Job cluster.")
234+
if policy.policy_family_definition_overrides:
235+
if _azure_sp_conf_present_check(json.loads(policy.policy_family_definition_overrides)):
236+
job_assessment[job.job_id].add(f"{_AZURE_SP_CONF_FAILURE_MSG} Job cluster.")
237+
except DatabricksError as err:
238+
logger.warning(f"Error retrieving cluster policy {cluster_config.policy_id}. Error: {err}")
229239

230240
for job_key in job_details.keys():
231241
job_details[job_key].failures = json.dumps(list(job_assessment[job_key]))

tests/unit/assessment/test_assessment.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from unittest.mock import Mock
22

3+
from databricks.sdk.core import DatabricksError
34
from databricks.sdk.service.compute import AutoScale, ClusterDetails, ClusterSource
45
from databricks.sdk.service.jobs import BaseJob, JobSettings, NotebookTask, Task
56
from databricks.sdk.service.pipelines import PipelineState, PipelineStateInfo
@@ -395,6 +396,24 @@ def test_cluster_assessment_cluster_policy_no_spark_conf(mocker):
395396
assert result_set1[0].success == 1
396397

397398

399+
def test_cluster_assessment_cluster_policy_not_found(mocker):
400+
sample_clusters1 = [
401+
ClusterDetails(
402+
cluster_name="cluster1",
403+
autoscale=AutoScale(min_workers=1, max_workers=6),
404+
spark_context_id=5134472582179565315,
405+
spark_env_vars=None,
406+
policy_id="D96308F1BF0003A8",
407+
spark_version="13.3.x-cpu-ml-scala2.12",
408+
cluster_id="0915-190044-3dqy6751",
409+
)
410+
]
411+
ws = Mock()
412+
ws.cluster_policies.get.side_effect = DatabricksError(error="NO_POLICY", error_code="NO_POLICY")
413+
crawler = ClustersCrawler(ws, MockBackend(), "ucx")._assess_clusters(sample_clusters1)
414+
list(crawler)
415+
416+
398417
def test_pipeline_assessment_with_config(mocker):
399418
sample_pipelines = [
400419
PipelineStateInfo(

0 commit comments

Comments
 (0)