Skip to content

Commit f3027ca

Browse files
author
Chuyang Deng
committed
fix: check optional keyword before accessing
1 parent 233e9b9 commit f3027ca

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

src/sagemaker/model_monitor/model_monitoring.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -672,15 +672,24 @@ def attach(cls, monitor_schedule_name, sagemaker_session=None):
672672
"MonitoringJobDefinition"
673673
]["StoppingCondition"].get("MaxRuntimeInSeconds")
674674

675-
env = schedule_desc["MonitoringScheduleConfig"]["MonitoringJobDefinition"]["Environment"]
675+
env = schedule_desc["MonitoringScheduleConfig"]["MonitoringJobDefinition"].get(
676+
"Environment", None
677+
)
676678

677679
network_config_dict = schedule_desc["MonitoringScheduleConfig"][
678680
"MonitoringJobDefinition"
679681
].get("NetworkConfig")
680682

681-
vpc_config = schedule_desc["MonitoringScheduleConfig"]["MonitoringJobDefinition"][
682-
"NetworkConfig"
683-
].get("VpcConfig")
683+
vpc_config = None
684+
if (
685+
schedule_desc["MonitoringScheduleConfig"]["MonitoringJobDefinition"].get(
686+
"NetworkConfig"
687+
)
688+
is not None
689+
):
690+
vpc_config = schedule_desc["MonitoringScheduleConfig"]["MonitoringJobDefinition"][
691+
"NetworkConfig"
692+
].get("VpcConfig")
684693

685694
security_group_ids = None
686695
if vpc_config is not None:
@@ -690,6 +699,7 @@ def attach(cls, monitor_schedule_name, sagemaker_session=None):
690699
if vpc_config is not None:
691700
subnets = vpc_config["Subnets"]
692701

702+
network_config = None
693703
if network_config_dict:
694704
network_config = NetworkConfig(
695705
enable_network_isolation=network_config_dict["EnableNetworkIsolation"],

tests/unit/sagemaker/monitor/test_model_monitoring.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,31 @@
6363
)
6464
"encrypt_inter_container_traffic=None when creating your NetworkConfig object."
6565

66+
MONITORING_SCHEDULE_DESC = {
67+
"MonitoringScheduleArn": "arn:aws:monitoring-schedule",
68+
"MonitoringScheduleName": "my-monitoring-schedule",
69+
"MonitoringScheduleConfig": {
70+
"MonitoringJobDefinition": {
71+
"MonitoringOutputConfig": {},
72+
"MonitoringResources": {
73+
"ClusterConfig": {
74+
"InstanceCount": 1,
75+
"InstanceType": "ml.t3.medium",
76+
"VolumeSizeInGB": 8,
77+
}
78+
},
79+
"MonitoringAppSpecification": {
80+
"ImageUri": "image-uri",
81+
"ContainerEntrypoint": [
82+
"entrypoint.py",
83+
],
84+
},
85+
"RoleArn": ROLE,
86+
}
87+
},
88+
"EndpointName": "my-endpoint",
89+
}
90+
6691

6792
# TODO-reinvent-2019: Continue to flesh these out.
6893
@pytest.fixture()
@@ -80,6 +105,9 @@ def sagemaker_session():
80105
name="upload_data", return_value="mocked_s3_uri_from_upload_data"
81106
)
82107
session_mock.download_data = Mock(name="download_data")
108+
session_mock.describe_monitoring_schedule = Mock(
109+
name="describe_monitoring_schedule", return_value=MONITORING_SCHEDULE_DESC
110+
)
83111
return session_mock
84112

85113

@@ -153,6 +181,17 @@ def test_default_model_monitor_with_invalid_network_config(sagemaker_session):
153181
assert INTER_CONTAINER_ENCRYPTION_EXCEPTION_MSG in str(exception.value)
154182

155183

184+
def test_model_monitor_without_network_config(sagemaker_session):
185+
my_model_monitor = ModelMonitor(
186+
role=ROLE,
187+
image_uri=CUSTOM_IMAGE_URI,
188+
sagemaker_session=sagemaker_session,
189+
)
190+
model_monitor_schedule_name = "model-monitoring-without-netwotk-config"
191+
attached = my_model_monitor.attach(model_monitor_schedule_name, sagemaker_session)
192+
assert attached.network_config is None
193+
194+
156195
def test_model_monitor_with_invalid_network_config(sagemaker_session):
157196
invalid_network_config = NetworkConfig(encrypt_inter_container_traffic=False)
158197
my_model_monitor = ModelMonitor(

0 commit comments

Comments
 (0)