45
45
get_sas_uri_for_registry_asset ,
46
46
)
47
47
from azure .ai .ml ._utils .utils import is_url
48
- from azure .ai .ml .constants ._common import MLTABLE_METADATA_SCHEMA_URL_FALLBACK , AssetTypes
49
- from azure .ai .ml .entities ._assets import Data
48
+ from azure .ai .ml .constants ._common import (
49
+ MLTABLE_METADATA_SCHEMA_URL_FALLBACK ,
50
+ AssetTypes ,
51
+ ASSET_ID_FORMAT ,
52
+ AzureMLResourceType ,
53
+ )
54
+ from azure .ai .ml .entities ._assets import Data , WorkspaceAssetReference
50
55
from azure .ai .ml .entities ._data .mltable_metadata import MLTableMetadata
51
56
from azure .ai .ml .exceptions import (
52
57
AssetPathException ,
58
63
from azure .ai .ml .operations ._datastore_operations import DatastoreOperations
59
64
from azure .core .exceptions import HttpResponseError
60
65
from azure .core .paging import ItemPaged
66
+ from azure .core .exceptions import ResourceNotFoundError
61
67
62
68
ops_logger = OpsLogger (__name__ )
63
69
module_logger = ops_logger .module_logger
@@ -230,7 +236,6 @@ def create_or_update(self, data: Data) -> Data:
230
236
:return: Data asset object.
231
237
:rtype: ~azure.ai.ml.entities.Data
232
238
"""
233
-
234
239
try :
235
240
name = data .name
236
241
if not data .version and self ._registry_name :
@@ -246,6 +251,34 @@ def create_or_update(self, data: Data) -> Data:
246
251
247
252
sas_uri = None
248
253
if self ._registry_name :
254
+ # If the data asset is a workspace asset, promote to registry
255
+ if isinstance (data , WorkspaceAssetReference ):
256
+ try :
257
+ self ._operation .get (
258
+ name = data .name ,
259
+ version = data .version ,
260
+ resource_group_name = self ._resource_group_name ,
261
+ registry_name = self ._registry_name ,
262
+ )
263
+ except Exception as err : # pylint: disable=broad-except
264
+ if isinstance (err , ResourceNotFoundError ):
265
+ pass
266
+ else :
267
+ raise err
268
+ else :
269
+ msg = "An data asset with this name and version already exists in registry"
270
+ raise ValidationException (
271
+ message = msg ,
272
+ no_personal_data_message = msg ,
273
+ target = ErrorTarget .DATA ,
274
+ error_category = ErrorCategory .USER_ERROR ,
275
+ )
276
+ data = data ._to_rest_object ()
277
+ result = self ._service_client .resource_management_asset_reference .begin_import_method (
278
+ resource_group_name = self ._resource_group_name , registry_name = self ._registry_name , body = data
279
+ )
280
+ return result
281
+
249
282
sas_uri = get_sas_uri_for_registry_asset (
250
283
service_client = self ._service_client ,
251
284
name = name ,
@@ -445,6 +478,43 @@ def _get_latest_version(self, name: str) -> Data:
445
478
)
446
479
return self .get (name , version = latest_version )
447
480
481
+ # pylint: disable=no-self-use
482
+ def _prepare_to_copy (
483
+ self , data : Data , name : Optional [str ] = None , version : Optional [str ] = None
484
+ ) -> WorkspaceAssetReference :
485
+
486
+ """Returns WorkspaceAssetReference
487
+ to copy a registered data to registry given the asset id
488
+
489
+ :param data: Registered data
490
+ :type data: Data
491
+ :param name: Destination name
492
+ :type name: str
493
+ :param version: Destination version
494
+ :type version: str
495
+ """
496
+ # Get workspace info to get workspace GUID
497
+ workspace = self ._service_client .workspaces .get (
498
+ resource_group_name = self ._resource_group_name , workspace_name = self ._workspace_name
499
+ )
500
+ workspace_guid = workspace .workspace_id
501
+ workspace_location = workspace .location
502
+
503
+ # Get data asset ID
504
+ asset_id = ASSET_ID_FORMAT .format (
505
+ workspace_location ,
506
+ workspace_guid ,
507
+ AzureMLResourceType .DATA ,
508
+ data .name ,
509
+ data .version ,
510
+ )
511
+
512
+ return WorkspaceAssetReference (
513
+ name = name if name else data .name ,
514
+ version = version if version else data .version ,
515
+ asset_id = asset_id ,
516
+ )
517
+
448
518
449
519
def _assert_local_path_matches_asset_type (
450
520
local_path : str ,
0 commit comments