Skip to content

Commit c26f6a9

Browse files
u9009Jing Li
and
Jing Li
authored
Added Workspace property ProvisionNetworkNow. (#38404)
* Added Workspace property `ProvisionNetworkNow`. - Updated `CHANGELOG.md` to add this feature - Updated ARM templated - Patching for this property is not supported as defined in its requirement - Updated Workspace logic to support `ProvisionNetworkNow` - Updated sample code - Updated test cases - Please note that the Swagger (API spec) and the REST client for `v2024-10-01-preview` have updated earlier * Added Workspace property `ProvisionNetworkNow`. - Updated `CHANGELOG.md` to add this feature - Updated ARM templated - Patching for this property is not supported as defined in its requirement - Updated Workspace logic to support `ProvisionNetworkNow` - Updated sample code - Updated test cases - Please note that the Swagger (API spec) and the REST client for `v2024-10-01-preview` have updated earlier --------- Co-authored-by: Jing Li <[email protected]>
1 parent 10bea08 commit c26f6a9

File tree

10 files changed

+64
-3
lines changed

10 files changed

+64
-3
lines changed

sdk/ml/azure-ai-ml/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
- Added support to select firewall sku to used for provisioning azure firewall when FQDN rules are added in
1212
AllowOnlyApprovedOutbound mode. FirewallSku options are `Standard` or `Basic`, defaults to `Standard`
1313
- Update TLS version from 1.0 to 1.2
14-
- Added support for Distillation jobs. Can be created by importing `disillation` from `azure.ai.ml.model_customization`
14+
- Added support for Distillation jobs. Can be created by importing `disillation` from `azure.ai.ml.distillation`
15+
- Added Workspace property `ProvisionNetworkNow` to trigger the provisioning of the managed VNet with the default
16+
Options when creating a Workspace with the managed VNet enabled, or else it does nothing
1517
### Bugs Fixed
1618
- Fix send email notification issue in model monitoring
1719

sdk/ml/azure-ai-ml/azure/ai/ml/_arm_deployments/arm_templates/workspace_base.json

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,17 @@
432432
"description": "Managed network settings to be used for the workspace. If not specified, isolation mode Disabled is the default"
433433
}
434434
},
435+
"provisionNetworkNow": {
436+
"type": "string",
437+
"defaultValue": "false",
438+
"allowedValues": [
439+
"true",
440+
"false"
441+
],
442+
"metadata": {
443+
"description": "Set to provision the managed VNet with the default Options when creating a Workspace with the managed VNet enabled"
444+
}
445+
},
435446
"allowRoleAssignmentOnRG": {
436447
"type": "string",
437448
"defaultValue": "true",
@@ -885,6 +896,7 @@
885896
"systemDatastoresAuthMode": "[parameters('systemDatastoresAuthMode')]",
886897
"allowRoleAssignmentOnRG": "[parameters('allowRoleAssignmentOnRG')]",
887898
"managedNetwork": "[parameters('managedNetwork')]",
899+
"provisionNetworkNow": "[parameters('provisionNetworkNow')]",
888900
"featureStoreSettings": {
889901
"computeruntime": {
890902
"SparkRuntimeVersion": "[parameters('spark_runtime_version')]"
@@ -1001,6 +1013,7 @@
10011013
"systemDatastoresAuthMode": "[parameters('systemDatastoresAuthMode')]",
10021014
"allowRoleAssignmentOnRG": "[parameters('allowRoleAssignmentOnRG')]",
10031015
"managedNetwork": "[parameters('managedNetwork')]",
1016+
"provisionNetworkNow": "[parameters('provisionNetworkNow')]",
10041017
"featureStoreSettings": {
10051018
"computeruntime": {
10061019
"SparkRuntimeVersion": "[parameters('spark_runtime_version')]"
@@ -1178,4 +1191,4 @@
11781191
}
11791192
}
11801193
]
1181-
}
1194+
}

sdk/ml/azure-ai-ml/azure/ai/ml/_arm_deployments/arm_templates/workspace_param.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@
134134
"managedNetwork": {
135135
"value": {}
136136
},
137+
"provisionNetworkNow": {
138+
"value": "false"
139+
},
137140
"spark_runtime_version" : {
138141
"value": null
139142
},

sdk/ml/azure-ai-ml/azure/ai/ml/_arm_deployments/arm_templates/workspace_project.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,17 @@
432432
"description": "Managed network settings to be used for the workspace. If not specified, isolation mode Disabled is the default"
433433
}
434434
},
435+
"provisionNetworkNow": {
436+
"type": "string",
437+
"defaultValue": "false",
438+
"allowedValues": [
439+
"true",
440+
"false"
441+
],
442+
"metadata": {
443+
"description": "Set to provision the managed VNet with the default Options when creating a Workspace with the managed VNet enabled"
444+
}
445+
},
435446
"enable_data_isolation": {
436447
"type": "string",
437448
"defaultValue": "false",
@@ -717,4 +728,4 @@
717728
}
718729
}
719730
]
720-
}
731+
}

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/workspace/workspace.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class WorkspaceSchema(PathAwareSchema):
4141
primary_user_assigned_identity = fields.Str()
4242
workspace_hub = fields.Str(validate=validate_arm_str)
4343
managed_network = NestedField(ManagedNetworkSchema, unknown=EXCLUDE)
44+
provision_network_now = fields.Bool()
4445
enable_data_isolation = fields.Bool()
4546
allow_roleassignment_on_rg = fields.Bool()
4647
serverless_compute = NestedField(ServerlessComputeSettingsSchema)

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_workspace/workspace.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ class Workspace(Resource):
8181
:type primary_user_assigned_identity: str
8282
:param managed_network: workspace's Managed Network configuration
8383
:type managed_network: ~azure.ai.ml.entities.ManagedNetwork
84+
:param provision_network_now: Set to trigger the provisioning of the managed vnet with the default options when
85+
creating a workspace with the managed vnet enable, or else it does nothing
86+
:type provision_network_now: Optional[bool]
8487
:param system_datastores_auth_mode: The authentication mode for system datastores.
8588
:type system_datastores_auth_mode: str
8689
:param enable_data_isolation: A flag to determine if workspace has data isolation enabled.
@@ -104,6 +107,7 @@ class Workspace(Resource):
104107
:caption: Creating a Workspace object.
105108
"""
106109

110+
# pylint: disable=too-many-locals
107111
def __init__(
108112
self,
109113
*,
@@ -124,6 +128,7 @@ def __init__(
124128
identity: Optional[IdentityConfiguration] = None,
125129
primary_user_assigned_identity: Optional[str] = None,
126130
managed_network: Optional[ManagedNetwork] = None,
131+
provision_network_now: Optional[bool] = None,
127132
system_datastores_auth_mode: Optional[str] = None,
128133
enable_data_isolation: bool = False,
129134
allow_roleassignment_on_rg: Optional[bool] = None,
@@ -164,6 +169,7 @@ def __init__(
164169
self.identity = identity
165170
self.primary_user_assigned_identity = primary_user_assigned_identity
166171
self.managed_network = managed_network
172+
self.provision_network_now = provision_network_now
167173
self.system_datastores_auth_mode = system_datastores_auth_mode
168174
self.enable_data_isolation = enable_data_isolation
169175
self.allow_roleassignment_on_rg = allow_roleassignment_on_rg
@@ -363,6 +369,11 @@ def _from_rest_object(
363369
rest_obj.managed_network
364370
)
365371

372+
# TODO: Remove once it's included in response
373+
provision_network_now = None
374+
if hasattr(rest_obj, "provision_network_now"):
375+
provision_network_now = rest_obj.provision_network_now
376+
366377
armid_parts = str(rest_obj.id).split("/")
367378
group = None if len(armid_parts) < 4 else armid_parts[4]
368379
identity = None
@@ -407,6 +418,7 @@ def _from_rest_object(
407418
identity=identity,
408419
primary_user_assigned_identity=rest_obj.primary_user_assigned_identity,
409420
managed_network=managed_network,
421+
provision_network_now=provision_network_now,
410422
system_datastores_auth_mode=system_datastores_auth_mode,
411423
feature_store_settings=feature_store_settings,
412424
enable_data_isolation=rest_obj.enable_data_isolation,
@@ -454,6 +466,7 @@ def _to_rest_object(self) -> RestWorkspace:
454466
if self.managed_network
455467
else None
456468
), # pylint: disable=protected-access
469+
provision_network_now=self.provision_network_now,
457470
system_datastores_auth_mode=self.system_datastores_auth_mode,
458471
feature_store_settings=feature_store_settings,
459472
enable_data_isolation=self.enable_data_isolation,

sdk/ml/azure-ai-ml/azure/ai/ml/operations/_workspace_operations_base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,9 @@ def _populate_arm_parameters(self, workspace: Workspace, **kwargs: Any) -> Tuple
781781
if not kwargs.get("grant_materialization_permissions", None):
782782
_set_val(param["grant_materialization_permissions"], "false")
783783

784+
if workspace.provision_network_now:
785+
_set_val(param["provisionNetworkNow"], "true")
786+
784787
managed_network = None
785788
if workspace.managed_network:
786789
managed_network = workspace.managed_network._to_rest_object()

sdk/ml/azure-ai-ml/samples/ml_samples_workspace.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ def ml_workspace_config_sample_snippets_entities(self):
116116
ws = Workspace(name="ws-name", location="eastus", managed_network=network)
117117
# [END workspace_managed_network]
118118

119+
# [START workspace_managed_network_provision_now]
120+
from azure.ai.ml.entities import IsolationMode, ManagedNetwork, Workspace
121+
122+
managed_net = ManagedNetwork(isolation_mode=IsolationMode.ALLOW_INTERNET_OUTBOUND)
123+
ws = Workspace(name="ws-name", location="eastus", managed_network=managed_net, provision_network_now=True)
124+
# [END workspace_managed_network_provision_now]
125+
119126
# [START fqdn_outboundrule]
120127
from azure.ai.ml.entities import FqdnDestination
121128

sdk/ml/azure-ai-ml/tests/conftest.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,11 @@ def mock_aml_services_2024_07_01_preview(mocker: MockFixture) -> Mock:
308308
return mocker.patch("azure.ai.ml._restclient.v2024_07_01_preview")
309309

310310

311+
@pytest.fixture
312+
def mock_aml_services_2024_10_01_preview(mocker: MockFixture) -> Mock:
313+
return mocker.patch("azure.ai.ml._restclient.v2024_10_01_preview")
314+
315+
311316
@pytest.fixture
312317
def mock_aml_services_run_history(mocker: MockFixture) -> Mock:
313318
return mocker.patch("azure.ai.ml._restclient.runhistory")

sdk/ml/azure-ai-ml/tests/workspace/unittests/test_workspace_operations_base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def outgoing_get_call(rg, name):
136136
),
137137
],
138138
)
139+
ws.provision_network_now = True
139140
ws.system_datastores_auth_mode = "identity"
140141
ws.allow_roleassignment_on_rg = True
141142
return ws._to_rest_object()
@@ -163,6 +164,8 @@ def outgoing_get_call(rg, name):
163164
assert rules[2].protocol == "*"
164165
assert rules[2].port_ranges == "1,2"
165166

167+
assert ws.provision_network_now == True
168+
166169
def test_create_get_exception_swallow(
167170
self,
168171
mock_workspace_operation_base: WorkspaceOperationsBase,

0 commit comments

Comments
 (0)