|
19 | 19 | from google.api_core import operation as ga_operation
|
20 | 20 | from google.cloud import aiplatform
|
21 | 21 | import vertexai
|
| 22 | +from vertexai.preview.developer import remote_specs |
22 | 23 | from google.cloud.aiplatform_v1beta1.services.persistent_resource_service import (
|
23 | 24 | PersistentResourceServiceClient,
|
24 | 25 | )
|
25 | 26 | from google.cloud.aiplatform_v1beta1.types import persistent_resource_service
|
| 27 | +from google.cloud.aiplatform_v1beta1.types.machine_resources import DiskSpec |
| 28 | +from google.cloud.aiplatform_v1beta1.types.machine_resources import ( |
| 29 | + MachineSpec, |
| 30 | +) |
26 | 31 | from google.cloud.aiplatform_v1beta1.types.persistent_resource import (
|
27 | 32 | PersistentResource,
|
28 | 33 | )
|
|
48 | 53 | _TEST_PERSISTENT_RESOURCE_ERROR = PersistentResource()
|
49 | 54 | _TEST_PERSISTENT_RESOURCE_ERROR.state = "ERROR"
|
50 | 55 |
|
51 |
| -_TEST_REQUEST_RUNNING_DEFAULT = PersistentResource() |
52 |
| -resource_pool = ResourcePool() |
53 |
| -resource_pool.machine_spec.machine_type = "n1-standard-4" |
54 |
| -resource_pool.replica_count = 1 |
55 |
| -resource_pool.disk_spec.boot_disk_type = "pd-ssd" |
56 |
| -resource_pool.disk_spec.boot_disk_size_gb = 100 |
57 |
| -_TEST_REQUEST_RUNNING_DEFAULT.resource_pools = [resource_pool] |
58 |
| - |
| 56 | +resource_pool_0 = ResourcePool( |
| 57 | + machine_spec=MachineSpec(machine_type="n1-standard-4"), |
| 58 | + disk_spec=DiskSpec( |
| 59 | + boot_disk_type="pd-ssd", |
| 60 | + boot_disk_size_gb=100, |
| 61 | + ), |
| 62 | + replica_count=1, |
| 63 | +) |
| 64 | +resource_pool_1 = ResourcePool( |
| 65 | + machine_spec=MachineSpec( |
| 66 | + machine_type="n1-standard-8", |
| 67 | + accelerator_type="NVIDIA_TESLA_T4", |
| 68 | + accelerator_count=1, |
| 69 | + ), |
| 70 | + disk_spec=DiskSpec( |
| 71 | + boot_disk_type="pd-ssd", |
| 72 | + boot_disk_size_gb=100, |
| 73 | + ), |
| 74 | + replica_count=2, |
| 75 | +) |
| 76 | +_TEST_REQUEST_RUNNING_DEFAULT = PersistentResource( |
| 77 | + resource_pools=[resource_pool_0], |
| 78 | +) |
| 79 | +_TEST_REQUEST_RUNNING_CUSTOM = PersistentResource( |
| 80 | + resource_pools=[resource_pool_0, resource_pool_1], |
| 81 | +) |
59 | 82 |
|
60 | 83 | _TEST_PERSISTENT_RESOURCE_RUNNING = PersistentResource()
|
61 | 84 | _TEST_PERSISTENT_RESOURCE_RUNNING.state = "RUNNING"
|
62 | 85 |
|
63 |
| - |
64 |
| -@pytest.fixture |
65 |
| -def persistent_resource_running_mock(): |
66 |
| - with mock.patch.object( |
67 |
| - PersistentResourceServiceClient, |
68 |
| - "get_persistent_resource", |
69 |
| - ) as persistent_resource_running_mock: |
70 |
| - persistent_resource_running_mock.return_value = ( |
71 |
| - _TEST_PERSISTENT_RESOURCE_RUNNING |
72 |
| - ) |
73 |
| - yield persistent_resource_running_mock |
74 |
| - |
75 |
| - |
76 |
| -@pytest.fixture |
77 |
| -def persistent_resource_exception_mock(): |
78 |
| - with mock.patch.object( |
79 |
| - PersistentResourceServiceClient, |
80 |
| - "get_persistent_resource", |
81 |
| - ) as persistent_resource_exception_mock: |
82 |
| - persistent_resource_exception_mock.side_effect = Exception |
83 |
| - yield persistent_resource_exception_mock |
| 86 | +# user-configured remote_specs.ResourcePool |
| 87 | +remote_specs_resource_pool_0 = remote_specs.ResourcePool(replica_count=1) |
| 88 | +remote_specs_resource_pool_1 = remote_specs.ResourcePool( |
| 89 | + machine_type="n1-standard-8", |
| 90 | + replica_count=2, |
| 91 | + accelerator_type="NVIDIA_TESLA_T4", |
| 92 | + accelerator_count=1, |
| 93 | +) |
| 94 | +_TEST_CUSTOM_RESOURCE_POOLS = [ |
| 95 | + remote_specs_resource_pool_0, |
| 96 | + remote_specs_resource_pool_1, |
| 97 | +] |
84 | 98 |
|
85 | 99 |
|
86 | 100 | @pytest.fixture
|
87 |
| -def create_persistent_resource_default_mock(): |
| 101 | +def create_persistent_resource_custom_mock(): |
88 | 102 | with mock.patch.object(
|
89 | 103 | PersistentResourceServiceClient,
|
90 | 104 | "create_persistent_resource",
|
91 |
| - ) as create_persistent_resource_default_mock: |
| 105 | + ) as create_persistent_resource_custom_mock: |
92 | 106 | create_persistent_resource_lro_mock = mock.Mock(ga_operation.Operation)
|
93 | 107 | create_persistent_resource_lro_mock.result.return_value = (
|
94 |
| - _TEST_REQUEST_RUNNING_DEFAULT |
| 108 | + _TEST_REQUEST_RUNNING_CUSTOM |
95 | 109 | )
|
96 |
| - create_persistent_resource_default_mock.return_value = ( |
| 110 | + create_persistent_resource_custom_mock.return_value = ( |
97 | 111 | create_persistent_resource_lro_mock
|
98 | 112 | )
|
99 |
| - yield create_persistent_resource_default_mock |
| 113 | + yield create_persistent_resource_custom_mock |
100 | 114 |
|
101 | 115 |
|
102 | 116 | @pytest.fixture
|
@@ -180,6 +194,25 @@ def test_create_persistent_resource_default_success(
|
180 | 194 | request,
|
181 | 195 | )
|
182 | 196 |
|
| 197 | + @pytest.mark.usefixtures("persistent_resource_running_mock") |
| 198 | + def test_create_persistent_resource_custom_success( |
| 199 | + self, create_persistent_resource_custom_mock |
| 200 | + ): |
| 201 | + persistent_resource_util.create_persistent_resource( |
| 202 | + cluster_resource_name=_TEST_CLUSTER_RESOURCE_NAME, |
| 203 | + resource_pools=_TEST_CUSTOM_RESOURCE_POOLS, |
| 204 | + ) |
| 205 | + |
| 206 | + request = persistent_resource_service.CreatePersistentResourceRequest( |
| 207 | + parent=_TEST_PARENT, |
| 208 | + persistent_resource=_TEST_REQUEST_RUNNING_CUSTOM, |
| 209 | + persistent_resource_id=_TEST_CLUSTER_NAME, |
| 210 | + ) |
| 211 | + |
| 212 | + create_persistent_resource_custom_mock.assert_called_with( |
| 213 | + request, |
| 214 | + ) |
| 215 | + |
183 | 216 | @pytest.mark.usefixtures("create_persistent_resource_exception_mock")
|
184 | 217 | def test_create_ray_cluster_state_error(self):
|
185 | 218 | with pytest.raises(ValueError) as e:
|
|
0 commit comments