Skip to content

Commit 1727c7a

Browse files
authored
Update datastore rest client to 2023-04-01-preview + OneLake datastore fixes (Azure#31517)
* Fixed serialization issue in OneLakeArtifact and updated datastore service client to support OneLake datastore types. Updated test fixtures using datastores to also use mock updated datastore service clients. * artifact_type: lakehouse -> artifact_type: lake_house * Fixed equality comparison. * Fixed credential getting set to NoneCredentialConfiguration by updating the restclient to the correct version (2023_04_01_preview) used in DatastoreOperations. Also updated other datastore entities to use the 2023_04_01_preview client. * Added test to validate credential less onelake datastore schema. * Formatting fixes for pylint. * Code formatting updates from running black. * Added docstrings for newly added OneLakeArtifact and LakeHouseArtifact classes.
1 parent e0bb3da commit 1727c7a

File tree

25 files changed

+171
-74
lines changed

25 files changed

+171
-74
lines changed

sdk/ml/azure-ai-ml/azure/ai/ml/_ml_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ def __init__(
363363
self._datastores = DatastoreOperations(
364364
operation_scope=self._operation_scope,
365365
operation_config=self._operation_config,
366-
serviceclient_2022_10_01=self._service_client_10_2022,
366+
serviceclient_2023_04_01_preview=self._service_client_04_2023_preview,
367367
**ops_kwargs,
368368
)
369369
self._operation_container.add(AzureMLResourceType.DATASTORE, self._datastores)

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_datastore/one_lake.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@
66

77
from typing import Any, Dict
88

9-
from marshmallow import fields, post_load
9+
from marshmallow import fields, post_load, Schema
1010

11-
from azure.ai.ml._restclient.v2023_04_01_preview.models import DatastoreType
11+
from azure.ai.ml._restclient.v2023_04_01_preview.models import DatastoreType, OneLakeArtifactType
1212

1313
from azure.ai.ml._schema.core.fields import NestedField, PathAwareSchema, StringTransformedEnum, UnionField
1414
from azure.ai.ml._utils.utils import camel_to_snake
1515

1616
from .credentials import NoneCredentialsSchema, ServicePrincipalSchema
1717

1818

19-
class OneLakeArtifactSchema(PathAwareSchema):
19+
class OneLakeArtifactSchema(Schema):
2020
artifact_name = fields.Str(required=True)
21-
artifact_type = fields.Str()
21+
artifact_type = StringTransformedEnum(
22+
allowed_values=OneLakeArtifactType.LAKE_HOUSE, casing_transform=camel_to_snake
23+
)
2224

2325

2426
class OneLakeSchema(PathAwareSchema):

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_credentials.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,23 @@
2525
)
2626
from azure.ai.ml._restclient.v2022_05_01.models import ManagedServiceIdentity as RestManagedServiceIdentityConfiguration
2727
from azure.ai.ml._restclient.v2022_05_01.models import UserAssignedIdentity as RestUserAssignedIdentityConfiguration
28-
from azure.ai.ml._restclient.v2022_10_01.models import (
28+
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
2929
AccountKeyDatastoreCredentials as RestAccountKeyDatastoreCredentials,
3030
)
31-
from azure.ai.ml._restclient.v2022_10_01.models import AccountKeyDatastoreSecrets as RestAccountKeyDatastoreSecrets
32-
from azure.ai.ml._restclient.v2022_10_01.models import (
31+
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
32+
AccountKeyDatastoreSecrets as RestAccountKeyDatastoreSecrets,
33+
)
34+
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
3335
CertificateDatastoreCredentials as RestCertificateDatastoreCredentials,
3436
)
35-
from azure.ai.ml._restclient.v2022_10_01.models import CertificateDatastoreSecrets, CredentialsType
36-
from azure.ai.ml._restclient.v2022_10_01.models import NoneDatastoreCredentials as RestNoneDatastoreCredentials
37-
from azure.ai.ml._restclient.v2022_10_01.models import SasDatastoreCredentials as RestSasDatastoreCredentials
38-
from azure.ai.ml._restclient.v2022_10_01.models import SasDatastoreSecrets as RestSasDatastoreSecrets
39-
from azure.ai.ml._restclient.v2022_10_01.models import (
37+
from azure.ai.ml._restclient.v2023_04_01_preview.models import CertificateDatastoreSecrets, CredentialsType
38+
from azure.ai.ml._restclient.v2023_04_01_preview.models import NoneDatastoreCredentials as RestNoneDatastoreCredentials
39+
from azure.ai.ml._restclient.v2023_04_01_preview.models import SasDatastoreCredentials as RestSasDatastoreCredentials
40+
from azure.ai.ml._restclient.v2023_04_01_preview.models import SasDatastoreSecrets as RestSasDatastoreSecrets
41+
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
4042
ServicePrincipalDatastoreCredentials as RestServicePrincipalDatastoreCredentials,
4143
)
42-
from azure.ai.ml._restclient.v2022_10_01.models import (
44+
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
4345
ServicePrincipalDatastoreSecrets as RestServicePrincipalDatastoreSecrets,
4446
)
4547

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_datastore/_on_prem.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from pathlib import Path
99
from typing import Dict, Optional, Union
1010

11-
from azure.ai.ml._restclient.v2022_10_01_preview.models import Datastore as DatastoreData, DatastoreType
12-
from azure.ai.ml._restclient.v2022_10_01_preview.models import HdfsDatastore as RestHdfsDatastore
11+
from azure.ai.ml._restclient.v2023_04_01_preview.models import Datastore as DatastoreData, DatastoreType
12+
from azure.ai.ml._restclient.v2023_04_01_preview.models import HdfsDatastore as RestHdfsDatastore
1313
from azure.ai.ml._schema._datastore._on_prem import HdfsSchema
1414
from azure.ai.ml._utils._experimental import experimental
1515
from azure.ai.ml.constants._common import BASE_PATH_CONTEXT_KEY, TYPE

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_datastore/_on_prem_credentials.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from base64 import b64encode
66

7-
from azure.ai.ml._restclient.v2022_10_01_preview import models as model_preview
7+
from azure.ai.ml._restclient.v2023_04_01_preview import models as model_preview
88
from azure.ai.ml._utils._experimental import experimental
99
from azure.ai.ml.entities._credentials import NoneCredentialConfiguration
1010

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_datastore/adls_gen1.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
from pathlib import Path
88
from typing import Dict, Optional, Union
99

10-
from azure.ai.ml._restclient.v2022_10_01.models import AzureDataLakeGen1Datastore as RestAzureDatalakeGen1Datastore
11-
from azure.ai.ml._restclient.v2022_10_01.models import Datastore as DatastoreData, DatastoreType
10+
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
11+
AzureDataLakeGen1Datastore as RestAzureDatalakeGen1Datastore,
12+
)
13+
from azure.ai.ml._restclient.v2023_04_01_preview.models import Datastore as DatastoreData, DatastoreType
1214
from azure.ai.ml._schema._datastore.adls_gen1 import AzureDataLakeGen1Schema
1315
from azure.ai.ml.constants._common import BASE_PATH_CONTEXT_KEY, TYPE
1416
from azure.ai.ml.entities._credentials import CertificateConfiguration, ServicePrincipalConfiguration

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_datastore/azure_storage.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
from typing import Dict, Optional, Union
99

1010
from azure.ai.ml._azure_environments import _get_storage_endpoint_from_metadata
11-
from azure.ai.ml._restclient.v2022_10_01.models import AzureBlobDatastore as RestAzureBlobDatastore
12-
from azure.ai.ml._restclient.v2022_10_01.models import AzureDataLakeGen2Datastore as RestAzureDataLakeGen2Datastore
13-
from azure.ai.ml._restclient.v2022_10_01.models import AzureFileDatastore as RestAzureFileDatastore
14-
from azure.ai.ml._restclient.v2022_10_01.models import Datastore as DatastoreData, DatastoreType
11+
from azure.ai.ml._restclient.v2023_04_01_preview.models import AzureBlobDatastore as RestAzureBlobDatastore
12+
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
13+
AzureDataLakeGen2Datastore as RestAzureDataLakeGen2Datastore,
14+
)
15+
from azure.ai.ml._restclient.v2023_04_01_preview.models import AzureFileDatastore as RestAzureFileDatastore
16+
from azure.ai.ml._restclient.v2023_04_01_preview.models import Datastore as DatastoreData, DatastoreType
1517
from azure.ai.ml._schema._datastore import AzureBlobSchema, AzureDataLakeGen2Schema, AzureFileSchema
1618
from azure.ai.ml.constants._common import BASE_PATH_CONTEXT_KEY, TYPE
1719
from azure.ai.ml.entities._credentials import (

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_datastore/datastore.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
from pathlib import Path
1010
from typing import IO, Any, AnyStr, Dict, Optional, Union
1111

12-
from azure.ai.ml._restclient.v2022_10_01.models import Datastore as DatastoreData, DatastoreType
13-
from azure.ai.ml._restclient.v2023_04_01_preview.models import DatastoreType as DatastoreTypePreview
12+
from azure.ai.ml._restclient.v2023_04_01_preview.models import Datastore as DatastoreData, DatastoreType
1413
from azure.ai.ml._utils.utils import camel_to_snake, dump_yaml_to_file
1514
from azure.ai.ml.constants._common import BASE_PATH_CONTEXT_KEY, PARAMS_OVERRIDE_KEY, CommonYamlFields
1615
from azure.ai.ml.entities._credentials import NoneCredentialConfiguration
@@ -122,7 +121,7 @@ def _load(
122121
ds_type = AzureDataLakeGen1Datastore
123122
elif type == camel_to_snake(DatastoreType.AZURE_DATA_LAKE_GEN2):
124123
ds_type = AzureDataLakeGen2Datastore
125-
elif type == camel_to_snake(DatastoreTypePreview.ONE_LAKE):
124+
elif type == camel_to_snake(DatastoreType.ONE_LAKE):
126125
ds_type = OneLakeDatastore
127126
# disable unless preview release
128127
# elif type == camel_to_snake(DatastoreTypePreview.HDFS):
@@ -167,7 +166,7 @@ def _from_rest_object(cls, datastore_resource: DatastoreData) -> "Datastore":
167166
return AzureBlobDatastore._from_rest_object(datastore_resource)
168167
if datastore_type == DatastoreType.AZURE_FILE:
169168
return AzureFileDatastore._from_rest_object(datastore_resource)
170-
if datastore_type == DatastoreTypePreview.ONE_LAKE:
169+
if datastore_type == DatastoreType.ONE_LAKE:
171170
return OneLakeDatastore._from_rest_object(datastore_resource)
172171
# disable unless preview release
173172
# elif datastore_type == DatastoreTypePreview.HDFS:

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_datastore/one_lake.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,54 @@
44

55
# pylint: disable=protected-access,no-member
66

7+
from abc import ABC
78
from pathlib import Path
89
from typing import Dict, Optional, Union
910

1011
from azure.ai.ml._restclient.v2023_04_01_preview.models import (
1112
OneLakeDatastore as RestOneLakeDatastore,
1213
Datastore as DatastoreData,
1314
DatastoreType,
14-
OneLakeArtifact,
15+
LakeHouseArtifact as RestLakeHouseArtifact,
1516
)
1617
from azure.ai.ml._schema._datastore.one_lake import OneLakeSchema
1718
from azure.ai.ml.constants._common import BASE_PATH_CONTEXT_KEY, TYPE
1819
from azure.ai.ml.entities._credentials import NoneCredentialConfiguration, ServicePrincipalConfiguration
1920
from azure.ai.ml.entities._datastore.datastore import Datastore
2021
from azure.ai.ml.entities._datastore.utils import from_rest_datastore_credentials
22+
from azure.ai.ml.entities._mixins import DictMixin, RestTranslatableMixin
2123
from azure.ai.ml.entities._util import load_from_dict
2224

2325

26+
class OneLakeArtifact(RestTranslatableMixin, DictMixin, ABC):
27+
"""OneLake artifact (data source) backing the OneLake workspace.
28+
29+
:param artifact_name: OneLake artifact name/GUID. ex) 01234567-abcd-1234-5678-012345678901
30+
:type artifact_name: str
31+
:param artifact_type: OneLake artifact type. Only LakeHouse artifacts are currently supported.
32+
:type artifact_type: str
33+
"""
34+
35+
def __init__(self, artifact_name: str, artifact_type: Optional[str] = None):
36+
super().__init__()
37+
self.artifact_name = artifact_name
38+
self.artifact_type = artifact_type
39+
40+
41+
class LakeHouseArtifact(OneLakeArtifact):
42+
"""LakeHouse artifact type for OneLake.
43+
44+
:param artifact_name: OneLake LakeHouse artifact name/GUID. ex) 01234567-abcd-1234-5678-012345678901
45+
:type artifact_name: str
46+
"""
47+
48+
def __init__(self, artifact_name: str):
49+
super(LakeHouseArtifact, self).__init__(artifact_name=artifact_name, artifact_type="lake_house")
50+
51+
def _to_datastore_rest_object(self) -> RestLakeHouseArtifact:
52+
return RestLakeHouseArtifact(artifact_name=self.artifact_name)
53+
54+
2455
class OneLakeDatastore(Datastore):
2556
"""OneLake datastore that is linked to an Azure ML workspace.
2657
@@ -40,8 +71,7 @@ class OneLakeDatastore(Datastore):
4071
:type properties: dict[str, str]
4172
:param credentials: Credentials to use to authenticate against OneLake.
4273
:type credentials: Union[
43-
~azure.ai.ml.entities.ServicePrincipalConfiguration, ~azure.ai.ml.entities.NoneCredentialConfiguration
44-
]
74+
~azure.ai.ml.entities.ServicePrincipalConfiguration, ~azure.ai.ml.entities.NoneCredentialConfiguration]
4575
:param kwargs: A dictionary of additional configuration parameters.
4676
:type kwargs: dict
4777
"""
@@ -70,7 +100,7 @@ def __init__(
70100
def _to_rest_object(self) -> DatastoreData:
71101
one_lake_ds = RestOneLakeDatastore(
72102
credentials=self.credentials._to_datastore_rest_object(),
73-
artifact=self.artifact,
103+
artifact=RestLakeHouseArtifact(artifact_name=self.artifact["artifact_name"]),
74104
one_lake_workspace_name=self.one_lake_workspace_name,
75105
endpoint=self.endpoint,
76106
description=self.description,
@@ -88,7 +118,7 @@ def _from_rest_object(cls, datastore_resource: DatastoreData):
88118
return OneLakeDatastore(
89119
name=datastore_resource.name,
90120
id=datastore_resource.id,
91-
artifact=properties.artifact,
121+
artifact=LakeHouseArtifact(artifact_name=properties.artifact.artifact_name),
92122
one_lake_workspace_name=properties.one_lake_workspace_name,
93123
endpoint=properties.endpoint,
94124
credentials=from_rest_datastore_credentials(properties.credentials),
@@ -100,7 +130,8 @@ def __eq__(self, other) -> bool:
100130
return (
101131
super().__eq__(other)
102132
and self.one_lake_workspace_name == other.one_lake_workspace_name
103-
and self.artifact == other.artifact
133+
and self.artifact.artifact_type == other.artifact["artifact_type"]
134+
and self.artifact.artifact_name == other.artifact["artifact_name"]
104135
and self.endpoint == other.endpoint
105136
)
106137

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_datastore/utils.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66

77
from typing import Optional
88

9-
from azure.ai.ml._restclient.v2022_10_01_preview import models as models_preview
10-
from azure.ai.ml._restclient.v2022_10_01 import models
9+
from azure.ai.ml._restclient.v2023_04_01_preview import models
1110
from azure.ai.ml.entities._credentials import (
1211
AccountKeyConfiguration,
1312
CertificateConfiguration,
@@ -38,11 +37,11 @@ def from_rest_datastore_credentials(rest_credentials: models.DatastoreCredential
3837

3938

4039
def _from_rest_datastore_credentials_preview(
41-
rest_credentials: models_preview.DatastoreCredentials,
40+
rest_credentials: models.DatastoreCredentials,
4241
) -> Optional[BaseKerberosCredentials]:
43-
if isinstance(rest_credentials, models_preview.KerberosKeytabCredentials):
42+
if isinstance(rest_credentials, models.KerberosKeytabCredentials):
4443
return KerberosKeytabCredentials._from_rest_object(rest_credentials)
45-
if isinstance(rest_credentials, models_preview.KerberosPasswordCredentials):
44+
if isinstance(rest_credentials, models.KerberosPasswordCredentials):
4645
return KerberosPasswordCredentials._from_rest_object(rest_credentials)
4746

4847
return None

0 commit comments

Comments
 (0)