Skip to content

Commit 20d732a

Browse files
committed
added logic for Azure AS
1 parent 79e6a97 commit 20d732a

File tree

1 file changed

+48
-8
lines changed

1 file changed

+48
-8
lines changed

src/sempy_labs/tom/_model.py

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,58 @@ class TOMWrapper:
4545

4646
def __init__(self, dataset, workspace, readonly, token_provider):
4747

48-
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
49-
(dataset_name, dataset_id) = resolve_dataset_name_and_id(dataset, workspace_id)
50-
self._dataset_id = dataset_id
51-
self._dataset_name = dataset_name
52-
self._workspace_name = workspace_name
53-
self._workspace_id = workspace_id
48+
self._is_azure_as = False
49+
prefix = "asazure"
50+
prefix_full = f"{prefix}://"
51+
read_write = ":rw"
52+
53+
# Azure AS workspace logic
54+
if workspace.startswith(prefix_full):
55+
# Set read or read/write accordingly
56+
if readonly is False and not workspace.endswith(read_write):
57+
workspace += read_write
58+
elif readonly is True and workspace.endswith(read_write):
59+
workspace = workspace[: -len(read_write)]
60+
self._workspace_name = workspace
61+
self._workspace_id
62+
self._dataset_id = dataset
63+
self._dataset_name = dataset
64+
self._is_azure_as = True
65+
if token_provider is None:
66+
raise ValueError(
67+
f"{icons.red_dot} A token provider must be provided when connecting to an Azure AS workspace."
68+
)
69+
else:
70+
(workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
71+
(dataset_name, dataset_id) = resolve_dataset_name_and_id(
72+
dataset, workspace_id
73+
)
74+
self._dataset_id = dataset_id
75+
self._dataset_name = dataset_name
76+
self._workspace_name = workspace_name
77+
self._workspace_id = workspace_id
5478
self._readonly = readonly
5579
self._tables_added = []
5680
self._token_provider = token_provider
5781

58-
# Token provider logid
82+
# No token provider (standard authentication)
5983
if self._token_provider is None:
6084
self._tom_server = fabric.create_tom_server(
6185
readonly=readonly, workspace=workspace_id
6286
)
87+
# Service Principal Authentication for Azure AS via token provider
88+
elif self._is_azure_as:
89+
import Microsoft.AnalysisServices.Tabular as TOM
90+
91+
# Extract region from the workspace
92+
match = re.search(rf"{prefix_full}(.*?).{prefix}", self._workspace_name)
93+
if match:
94+
region = match.group(1)
95+
token = token_provider(audience="asazure", region=region)
96+
connection_str = f'Provider=MSOLAP;Data Source={self._workspace_name};Password="{token.token}";Persist Security Info=True;Impersonation Level=Impersonate'
97+
self._tom_server = TOM.Server()
98+
self._tom_server.Connect(connection_str)
99+
# Service Principal Authentication for Power BI via token provider
63100
else:
64101
from sempy.fabric._client._utils import _build_adomd_connection_string
65102
import Microsoft.AnalysisServices.Tabular as TOM
@@ -85,7 +122,10 @@ def __init__(self, dataset, workspace, readonly, token_provider):
85122
)
86123
self._tom_server.Connect(connection_str)
87124

88-
self.model = self._tom_server.Databases[dataset_id].Model
125+
if self._is_azure_as:
126+
self.model = self._tom_server.Databases.GetByName(self._dataset_name).Model
127+
else:
128+
self.model = self._tom_server.Databases[dataset_id].Model
89129

90130
self._table_map = {}
91131
self._column_map = {}

0 commit comments

Comments
 (0)