@@ -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