| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | import datetime | 
					
						
							| 
									
										
										
										
											2023-08-08 06:06:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2021-01-29 01:06:25 -08:00
										 |  |  | from botocore.exceptions import ClientError | 
					
						
							| 
									
										
										
										
											2023-08-08 06:06:51 -04:00
										 |  |  | import pytest | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | from moto import mock_sagemaker | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  | from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST_REGION_NAME = "us-east-1" | 
					
						
							|  |  |  | FAKE_SUBNET_ID = "subnet-012345678" | 
					
						
							|  |  |  | FAKE_SECURITY_GROUP_IDS = ["sg-0123456789abcdef0", "sg-0123456789abcdef1"] | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  | FAKE_ROLE_ARN = f"arn:aws:iam::{ACCOUNT_ID}:role/FakeRole" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | FAKE_KMS_KEY_ID = "62d4509a-9f96-446c-a9ba-6b1c353c8c58" | 
					
						
							|  |  |  | GENERIC_TAGS_PARAM = [ | 
					
						
							|  |  |  |     {"Key": "newkey1", "Value": "newval1"}, | 
					
						
							|  |  |  |     {"Key": "newkey2", "Value": "newval2"}, | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | FAKE_LIFECYCLE_CONFIG_NAME = "FakeLifecycleConfigName" | 
					
						
							|  |  |  | FAKE_DEFAULT_CODE_REPO = "https://github.com/user/repo1" | 
					
						
							|  |  |  | FAKE_ADDL_CODE_REPOS = [ | 
					
						
							|  |  |  |     "https://github.com/user/repo2", | 
					
						
							|  |  |  |     "https://github.com/user/repo2", | 
					
						
							|  |  |  | ] | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  | FAKE_NAME_PARAM = "MyNotebookInstance" | 
					
						
							|  |  |  | FAKE_INSTANCE_TYPE_PARAM = "ml.t2.medium" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | @pytest.fixture(name="client") | 
					
						
							| 
									
										
										
										
											2022-10-04 16:28:30 +00:00
										 |  |  | def fixture_sagemaker_client(): | 
					
						
							|  |  |  |     with mock_sagemaker(): | 
					
						
							|  |  |  |         yield boto3.client("sagemaker", region_name=TEST_REGION_NAME) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _get_notebook_instance_arn(notebook_name): | 
					
						
							|  |  |  |     return f"arn:aws:sagemaker:{TEST_REGION_NAME}:{ACCOUNT_ID}:notebook-instance/{notebook_name}" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  | def _get_notebook_instance_lifecycle_arn(lifecycle_name): | 
					
						
							| 
									
										
										
										
											2023-08-08 06:06:51 -04:00
										 |  |  |     return ( | 
					
						
							|  |  |  |         f"arn:aws:sagemaker:{TEST_REGION_NAME}:{ACCOUNT_ID}" | 
					
						
							|  |  |  |         f":notebook-instance-lifecycle-configuration/{lifecycle_name}" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_create_notebook_instance_minimal_params(client): | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |     args = { | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |         "NotebookInstanceName": FAKE_NAME_PARAM, | 
					
						
							|  |  |  |         "InstanceType": FAKE_INSTANCE_TYPE_PARAM, | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |         "RoleArn": FAKE_ROLE_ARN, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.create_notebook_instance(**args) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     expected_notebook_arn = _get_notebook_instance_arn(FAKE_NAME_PARAM) | 
					
						
							|  |  |  |     assert resp["NotebookInstanceArn"] == expected_notebook_arn | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.describe_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert resp["NotebookInstanceArn"] == expected_notebook_arn | 
					
						
							|  |  |  |     assert resp["NotebookInstanceName"] == FAKE_NAME_PARAM | 
					
						
							|  |  |  |     assert resp["NotebookInstanceStatus"] == "InService" | 
					
						
							|  |  |  |     assert resp["Url"] == f"{FAKE_NAME_PARAM}.notebook.{TEST_REGION_NAME}.sagemaker.aws" | 
					
						
							|  |  |  |     assert resp["InstanceType"] == FAKE_INSTANCE_TYPE_PARAM | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["RoleArn"] == FAKE_ROLE_ARN | 
					
						
							|  |  |  |     assert isinstance(resp["LastModifiedTime"], datetime.datetime) | 
					
						
							|  |  |  |     assert isinstance(resp["CreationTime"], datetime.datetime) | 
					
						
							|  |  |  |     assert resp["DirectInternetAccess"] == "Enabled" | 
					
						
							|  |  |  |     assert resp["VolumeSizeInGB"] == 5 | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  | #    assert resp["RootAccess"] == True     # ToDo: Not sure if this defaults... | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_create_notebook_instance_params(client): | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     fake_direct_internet_access_param = "Enabled" | 
					
						
							|  |  |  |     volume_size_in_gb_param = 7 | 
					
						
							|  |  |  |     accelerator_types_param = ["ml.eia1.medium", "ml.eia2.medium"] | 
					
						
							|  |  |  |     root_access_param = "Disabled" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     args = { | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |         "NotebookInstanceName": FAKE_NAME_PARAM, | 
					
						
							|  |  |  |         "InstanceType": FAKE_INSTANCE_TYPE_PARAM, | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |         "SubnetId": FAKE_SUBNET_ID, | 
					
						
							|  |  |  |         "SecurityGroupIds": FAKE_SECURITY_GROUP_IDS, | 
					
						
							|  |  |  |         "RoleArn": FAKE_ROLE_ARN, | 
					
						
							|  |  |  |         "KmsKeyId": FAKE_KMS_KEY_ID, | 
					
						
							|  |  |  |         "Tags": GENERIC_TAGS_PARAM, | 
					
						
							|  |  |  |         "LifecycleConfigName": FAKE_LIFECYCLE_CONFIG_NAME, | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |         "DirectInternetAccess": fake_direct_internet_access_param, | 
					
						
							|  |  |  |         "VolumeSizeInGB": volume_size_in_gb_param, | 
					
						
							|  |  |  |         "AcceleratorTypes": accelerator_types_param, | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |         "DefaultCodeRepository": FAKE_DEFAULT_CODE_REPO, | 
					
						
							|  |  |  |         "AdditionalCodeRepositories": FAKE_ADDL_CODE_REPOS, | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |         "RootAccess": root_access_param, | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.create_notebook_instance(**args) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     expected_notebook_arn = _get_notebook_instance_arn(FAKE_NAME_PARAM) | 
					
						
							|  |  |  |     assert resp["NotebookInstanceArn"] == expected_notebook_arn | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.describe_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert resp["NotebookInstanceArn"] == expected_notebook_arn | 
					
						
							|  |  |  |     assert resp["NotebookInstanceName"] == FAKE_NAME_PARAM | 
					
						
							|  |  |  |     assert resp["NotebookInstanceStatus"] == "InService" | 
					
						
							|  |  |  |     assert resp["Url"] == f"{FAKE_NAME_PARAM}.notebook.{TEST_REGION_NAME}.sagemaker.aws" | 
					
						
							|  |  |  |     assert resp["InstanceType"] == FAKE_INSTANCE_TYPE_PARAM | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["RoleArn"] == FAKE_ROLE_ARN | 
					
						
							|  |  |  |     assert isinstance(resp["LastModifiedTime"], datetime.datetime) | 
					
						
							|  |  |  |     assert isinstance(resp["CreationTime"], datetime.datetime) | 
					
						
							|  |  |  |     assert resp["DirectInternetAccess"] == "Enabled" | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert resp["VolumeSizeInGB"] == volume_size_in_gb_param | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     #    assert resp["RootAccess"] == True     # ToDo: Not sure if this defaults... | 
					
						
							|  |  |  |     assert resp["SubnetId"] == FAKE_SUBNET_ID | 
					
						
							|  |  |  |     assert resp["SecurityGroups"] == FAKE_SECURITY_GROUP_IDS | 
					
						
							|  |  |  |     assert resp["KmsKeyId"] == FAKE_KMS_KEY_ID | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert resp["NotebookInstanceLifecycleConfigName"] == FAKE_LIFECYCLE_CONFIG_NAME | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert resp["AcceleratorTypes"] == accelerator_types_param | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["DefaultCodeRepository"] == FAKE_DEFAULT_CODE_REPO | 
					
						
							|  |  |  |     assert resp["AdditionalCodeRepositories"] == FAKE_ADDL_CODE_REPOS | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.list_tags(ResourceArn=resp["NotebookInstanceArn"]) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["Tags"] == GENERIC_TAGS_PARAM | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_create_notebook_instance_invalid_instance_type(client): | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |     instance_type = "undefined_instance_type" | 
					
						
							|  |  |  |     args = { | 
					
						
							|  |  |  |         "NotebookInstanceName": "MyNotebookInstance", | 
					
						
							|  |  |  |         "InstanceType": instance_type, | 
					
						
							|  |  |  |         "RoleArn": FAKE_ROLE_ARN, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |         client.create_notebook_instance(**args) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ex.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2023-08-08 06:06:51 -04:00
										 |  |  |     expected_message = ( | 
					
						
							|  |  |  |         f"Value '{instance_type}' at 'instanceType' failed to satisfy " | 
					
						
							|  |  |  |         "constraint: Member must satisfy enum value set: [" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert expected_message in ex.value.response["Error"]["Message"] | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_notebook_instance_lifecycle(client): | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |     args = { | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |         "NotebookInstanceName": FAKE_NAME_PARAM, | 
					
						
							|  |  |  |         "InstanceType": FAKE_INSTANCE_TYPE_PARAM, | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |         "RoleArn": FAKE_ROLE_ARN, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.create_notebook_instance(**args) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     expected_notebook_arn = _get_notebook_instance_arn(FAKE_NAME_PARAM) | 
					
						
							|  |  |  |     assert resp["NotebookInstanceArn"] == expected_notebook_arn | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.describe_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  |     notebook_instance_arn = resp["NotebookInstanceArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |         client.delete_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ex.value.response["Error"]["Code"] == "ValidationException" | 
					
						
							| 
									
										
										
										
											2023-08-08 06:06:51 -04:00
										 |  |  |     expected_message = ( | 
					
						
							|  |  |  |         f"Status (InService) not in ([Stopped, Failed]). Unable to " | 
					
						
							|  |  |  |         f"transition to (Deleting) for Notebook Instance ({notebook_instance_arn})" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert expected_message in ex.value.response["Error"]["Message"] | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     client.stop_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.describe_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["NotebookInstanceStatus"] == "Stopped" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     client.list_notebook_instances() | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     client.start_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.describe_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["NotebookInstanceStatus"] == "InService" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     client.stop_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.describe_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["NotebookInstanceStatus"] == "Stopped" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     client.delete_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |         client.describe_notebook_instance(NotebookInstanceName=FAKE_NAME_PARAM) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert ex.value.response["Error"]["Message"] == "RecordNotFound" | 
					
						
							| 
									
										
											  
											
												Sagemaker models (#3105)
* First failing test, and enough framework to run it.
* Rudimentary passing test.
* Sagemaker Notebook Support, take-1: create, describe, start, stop, delete.
* Added list_tags.
* Merged in model support from https://github.com/porthunt/moto/tree/sagemaker-support.
* Re-org'd
* Fixed up describe_model exception when no matching model.
* Segregated tests by Sagemaker entity.  Model arn check by regex..
* Python2 compabitility changes.
* Added sagemaker to list of known backends.  Corrected urls.
* Added sagemaker special case to moto.server.infer_service_region_host due to irregular url format (use of 'api' subdomain) to support server mode.
* Changes for PR 3105 comments of July 10, 2020
* PR3105 July 10, 2020, 8:55 AM EDT comment: dropped unnecessary re-addition of arn when formulating model list response.
* PR 3105 July 15, 2020 9:10 AM EDT Comment: clean-up SageMakerModelBackend.describe_models logic for finding the model in the dict.
* Optimized imports
Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
											
										 
											2020-07-16 08:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_describe_nonexistent_model(client): | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |         client.describe_model(ModelName="Nonexistent") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     assert e.value.response["Error"]["Message"].startswith("Could not find model") | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_notebook_instance_lifecycle_config(client): | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  |     name = "MyLifeCycleConfig" | 
					
						
							|  |  |  |     on_create = [{"Content": "Create Script Line 1"}] | 
					
						
							|  |  |  |     on_start = [{"Content": "Start Script Line 1"}] | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.create_notebook_instance_lifecycle_config( | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  |         NotebookInstanceLifecycleConfigName=name, OnCreate=on_create, OnStart=on_start | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     expected_arn = _get_notebook_instance_lifecycle_arn(name) | 
					
						
							|  |  |  |     assert resp["NotebookInstanceLifecycleConfigArn"] == expected_arn | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |         client.create_notebook_instance_lifecycle_config( | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  |             NotebookInstanceLifecycleConfigName=name, | 
					
						
							|  |  |  |             OnCreate=on_create, | 
					
						
							|  |  |  |             OnStart=on_start, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert e.value.response["Error"]["Message"].endswith( | 
					
						
							|  |  |  |         "Notebook Instance Lifecycle Config already exists.)" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.describe_notebook_instance_lifecycle_config( | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |         NotebookInstanceLifecycleConfigName=name | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["NotebookInstanceLifecycleConfigName"] == name | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert resp["NotebookInstanceLifecycleConfigArn"] == expected_arn | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     assert resp["OnStart"] == on_start | 
					
						
							|  |  |  |     assert resp["OnCreate"] == on_create | 
					
						
							|  |  |  |     assert isinstance(resp["LastModifiedTime"], datetime.datetime) | 
					
						
							|  |  |  |     assert isinstance(resp["CreationTime"], datetime.datetime) | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     client.delete_notebook_instance_lifecycle_config( | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |         NotebookInstanceLifecycleConfigName=name | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |         client.describe_notebook_instance_lifecycle_config( | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |             NotebookInstanceLifecycleConfigName=name | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert e.value.response["Error"]["Message"].endswith( | 
					
						
							|  |  |  |         "Notebook Instance Lifecycle Config does not exist.)" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as e: | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |         client.delete_notebook_instance_lifecycle_config( | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |             NotebookInstanceLifecycleConfigName=name | 
					
						
							| 
									
										
										
										
											2020-10-30 17:05:06 -04:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:46:05 +02:00
										 |  |  |     assert e.value.response["Error"]["Message"].endswith( | 
					
						
							|  |  |  |         "Notebook Instance Lifecycle Config does not exist.)" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_add_tags_to_notebook(client): | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     args = { | 
					
						
							|  |  |  |         "NotebookInstanceName": FAKE_NAME_PARAM, | 
					
						
							|  |  |  |         "InstanceType": FAKE_INSTANCE_TYPE_PARAM, | 
					
						
							|  |  |  |         "RoleArn": FAKE_ROLE_ARN, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.create_notebook_instance(**args) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     resource_arn = resp["NotebookInstanceArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tags = [ | 
					
						
							|  |  |  |         {"Key": "myKey", "Value": "myValue"}, | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     response = client.add_tags(ResourceArn=resource_arn, Tags=tags) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert response["ResponseMetadata"]["HTTPStatusCode"] == 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     response = client.list_tags(ResourceArn=resource_arn) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert response["Tags"] == tags | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | def test_delete_tags_from_notebook(client): | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     args = { | 
					
						
							|  |  |  |         "NotebookInstanceName": FAKE_NAME_PARAM, | 
					
						
							|  |  |  |         "InstanceType": FAKE_INSTANCE_TYPE_PARAM, | 
					
						
							|  |  |  |         "RoleArn": FAKE_ROLE_ARN, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     resp = client.create_notebook_instance(**args) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     resource_arn = resp["NotebookInstanceArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tags = [ | 
					
						
							|  |  |  |         {"Key": "myKey", "Value": "myValue"}, | 
					
						
							|  |  |  |     ] | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     response = client.add_tags(ResourceArn=resource_arn, Tags=tags) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert response["ResponseMetadata"]["HTTPStatusCode"] == 200 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tag_keys = [tag["Key"] for tag in tags] | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     response = client.delete_tags(ResourceArn=resource_arn, TagKeys=tag_keys) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert response["ResponseMetadata"]["HTTPStatusCode"] == 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  |     response = client.list_tags(ResourceArn=resource_arn) | 
					
						
							| 
									
										
										
										
											2022-04-27 12:56:08 +01:00
										 |  |  |     assert response["Tags"] == [] | 
					
						
							| 
									
										
										
										
											2023-09-02 06:34:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_list_notebook_instances(client): | 
					
						
							|  |  |  |     for i in range(3): | 
					
						
							|  |  |  |         args = { | 
					
						
							|  |  |  |             "NotebookInstanceName": f"Name{i}", | 
					
						
							|  |  |  |             "InstanceType": FAKE_INSTANCE_TYPE_PARAM, | 
					
						
							|  |  |  |             "RoleArn": FAKE_ROLE_ARN, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         client.create_notebook_instance(**args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.stop_notebook_instance(NotebookInstanceName="Name1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = client.list_notebook_instances()["NotebookInstances"] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == ["Name0", "Name1", "Name2"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = client.list_notebook_instances(SortBy="Status")["NotebookInstances"] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == ["Name0", "Name2", "Name1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = client.list_notebook_instances(SortOrder="Descending")[ | 
					
						
							|  |  |  |         "NotebookInstances" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == ["Name2", "Name1", "Name0"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = client.list_notebook_instances(NameContains="1")["NotebookInstances"] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == ["Name1"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = client.list_notebook_instances(StatusEquals="InService")[ | 
					
						
							|  |  |  |         "NotebookInstances" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == ["Name0", "Name2"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     instances = client.list_notebook_instances(StatusEquals="Pending")[ | 
					
						
							|  |  |  |         "NotebookInstances" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.list_notebook_instances(MaxResults=1) | 
					
						
							|  |  |  |     instances = resp["NotebookInstances"] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == ["Name0"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = client.list_notebook_instances(NextToken=resp["NextToken"]) | 
					
						
							|  |  |  |     instances = resp["NotebookInstances"] | 
					
						
							|  |  |  |     assert [i["NotebookInstanceName"] for i in instances] == ["Name1", "Name2"] | 
					
						
							|  |  |  |     assert "NextToken" not in resp |