Skip to content

Commit 4f9b9f8

Browse files
authored
Merge branch 'aws:master' into master
2 parents 834ab00 + f9508a3 commit 4f9b9f8

File tree

4 files changed

+187
-139
lines changed

4 files changed

+187
-139
lines changed

src/sagemaker/model_monitor/model_monitoring.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2413,7 +2413,12 @@ def _update_data_quality_monitoring_schedule(
24132413
)
24142414
self.sagemaker_session.sagemaker_client.create_data_quality_job_definition(**request_dict)
24152415
try:
2416-
self._update_monitoring_schedule(new_job_definition_name, schedule_cron_expression)
2416+
self._update_monitoring_schedule(
2417+
job_definition_name=new_job_definition_name,
2418+
schedule_cron_expression=schedule_cron_expression,
2419+
data_analysis_start_time=data_analysis_start_time,
2420+
data_analysis_end_time=data_analysis_end_time,
2421+
)
24172422
self.job_definition_name = new_job_definition_name
24182423
if role is not None:
24192424
self.role = role

src/sagemaker/session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5286,7 +5286,7 @@ def get_tagging_resources(self, tag_filters, resource_type_filters):
52865286
resource_tag_response = self.resource_group_tagging_client.get_resources(
52875287
TagFilters=tag_filters,
52885288
ResourceTypeFilters=resource_type_filters,
5289-
NextToken=next_token,
5289+
PaginationToken=next_token,
52905290
)
52915291
resource_list = resource_list + resource_tag_response["ResourceTagMappingList"]
52925292
next_token = resource_tag_response.get("PaginationToken")

tests/integ/test_collection.py

Lines changed: 149 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,22 @@
1919
def test_create_collection_root_success(sagemaker_session):
2020
collection = Collection(sagemaker_session)
2121
collection_name = unique_name_from_base("test-collection")
22-
collection.create(collection_name)
23-
collection_filter = [
24-
{
25-
"Name": "resource-type",
26-
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
27-
},
28-
]
29-
collection_details = sagemaker_session.list_group_resources(
30-
group=collection_name, filters=collection_filter
31-
)
32-
assert collection_details["ResponseMetadata"]["HTTPStatusCode"] == 200
33-
delete_response = collection.delete([collection_name])
34-
assert len(delete_response["deleted_collections"]) == 1
35-
assert len(delete_response["delete_collection_failures"]) == 0
22+
try:
23+
collection.create(collection_name)
24+
collection_filter = [
25+
{
26+
"Name": "resource-type",
27+
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
28+
},
29+
]
30+
collection_details = sagemaker_session.list_group_resources(
31+
group=collection_name, filters=collection_filter
32+
)
33+
assert collection_details["ResponseMetadata"]["HTTPStatusCode"] == 200
34+
finally:
35+
delete_response = collection.delete([collection_name])
36+
assert len(delete_response["deleted_collections"]) == 1
37+
assert len(delete_response["delete_collection_failures"]) == 0
3638

3739

3840
def test_create_collection_nested_success(sagemaker_session):
@@ -41,25 +43,27 @@ def test_create_collection_nested_success(sagemaker_session):
4143
child_collection_name = unique_name_from_base("test-collection-2")
4244
collection.create(collection_name)
4345
collection.create(collection_name=child_collection_name, parent_collection_name=collection_name)
44-
collection_filter = [
45-
{
46-
"Name": "resource-type",
47-
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
48-
},
49-
]
50-
collection_details = sagemaker_session.list_group_resources(
51-
group=collection_name, filters=collection_filter
52-
)
53-
# has one child i.e child collection
54-
assert len(collection_details["Resources"]) == 1
55-
56-
collection_details = sagemaker_session.list_group_resources(
57-
group=child_collection_name, filters=collection_filter
58-
)
59-
collection_details["ResponseMetadata"]["HTTPStatusCode"]
60-
delete_response = collection.delete([child_collection_name, collection_name])
61-
assert len(delete_response["deleted_collections"]) == 2
62-
assert len(delete_response["delete_collection_failures"]) == 0
46+
try:
47+
collection_filter = [
48+
{
49+
"Name": "resource-type",
50+
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
51+
},
52+
]
53+
collection_details = sagemaker_session.list_group_resources(
54+
group=collection_name, filters=collection_filter
55+
)
56+
# has one child i.e child collection
57+
assert len(collection_details["Resources"]) == 1
58+
59+
collection_details = sagemaker_session.list_group_resources(
60+
group=child_collection_name, filters=collection_filter
61+
)
62+
collection_details["ResponseMetadata"]["HTTPStatusCode"]
63+
finally:
64+
delete_response = collection.delete([child_collection_name, collection_name])
65+
assert len(delete_response["deleted_collections"]) == 2
66+
assert len(delete_response["delete_collection_failures"]) == 0
6367

6468

6569
def test_add_remove_model_groups_in_collection_success(sagemaker_session):
@@ -70,40 +74,42 @@ def test_add_remove_model_groups_in_collection_success(sagemaker_session):
7074
collection = Collection(sagemaker_session)
7175
collection_name = unique_name_from_base("test-collection")
7276
collection.create(collection_name)
73-
model_groups = []
74-
model_groups.append(model_group_name)
75-
add_response = collection.add_model_groups(
76-
collection_name=collection_name, model_groups=model_groups
77-
)
78-
collection_filter = [
79-
{
80-
"Name": "resource-type",
81-
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
82-
},
83-
]
84-
collection_details = sagemaker_session.list_group_resources(
85-
group=collection_name, filters=collection_filter
86-
)
87-
88-
assert len(add_response["failure"]) == 0
89-
assert len(add_response["added_groups"]) == 1
90-
assert len(collection_details["Resources"]) == 1
91-
92-
remove_response = collection.remove_model_groups(
93-
collection_name=collection_name, model_groups=model_groups
94-
)
95-
collection_details = sagemaker_session.list_group_resources(
96-
group=collection_name, filters=collection_filter
97-
)
98-
assert len(remove_response["failure"]) == 0
99-
assert len(remove_response["removed_groups"]) == 1
100-
assert len(collection_details["Resources"]) == 0
101-
102-
delete_response = collection.delete([collection_name])
103-
assert len(delete_response["deleted_collections"]) == 1
104-
sagemaker_session.sagemaker_client.delete_model_package_group(
105-
ModelPackageGroupName=model_group_name
106-
)
77+
try:
78+
model_groups = []
79+
model_groups.append(model_group_name)
80+
add_response = collection.add_model_groups(
81+
collection_name=collection_name, model_groups=model_groups
82+
)
83+
collection_filter = [
84+
{
85+
"Name": "resource-type",
86+
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
87+
},
88+
]
89+
collection_details = sagemaker_session.list_group_resources(
90+
group=collection_name, filters=collection_filter
91+
)
92+
93+
assert len(add_response["failure"]) == 0
94+
assert len(add_response["added_groups"]) == 1
95+
assert len(collection_details["Resources"]) == 1
96+
97+
remove_response = collection.remove_model_groups(
98+
collection_name=collection_name, model_groups=model_groups
99+
)
100+
collection_details = sagemaker_session.list_group_resources(
101+
group=collection_name, filters=collection_filter
102+
)
103+
assert len(remove_response["failure"]) == 0
104+
assert len(remove_response["removed_groups"]) == 1
105+
assert len(collection_details["Resources"]) == 0
106+
107+
finally:
108+
delete_response = collection.delete([collection_name])
109+
assert len(delete_response["deleted_collections"]) == 1
110+
sagemaker_session.sagemaker_client.delete_model_package_group(
111+
ModelPackageGroupName=model_group_name
112+
)
107113

108114

109115
def test_move_model_groups_in_collection_success(sagemaker_session):
@@ -116,56 +122,58 @@ def test_move_model_groups_in_collection_success(sagemaker_session):
116122
destination_collection_name = unique_name_from_base("test-collection-destination")
117123
collection.create(source_collection_name)
118124
collection.create(destination_collection_name)
119-
model_groups = []
120-
model_groups.append(model_group_name)
121-
add_response = collection.add_model_groups(
122-
collection_name=source_collection_name, model_groups=model_groups
123-
)
124-
collection_filter = [
125-
{
126-
"Name": "resource-type",
127-
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
128-
},
129-
]
130-
collection_details = sagemaker_session.list_group_resources(
131-
group=source_collection_name, filters=collection_filter
132-
)
133-
134-
assert len(add_response["failure"]) == 0
135-
assert len(add_response["added_groups"]) == 1
136-
assert len(collection_details["Resources"]) == 1
137-
138-
move_response = collection.move_model_group(
139-
source_collection_name=source_collection_name,
140-
model_group=model_group_name,
141-
destination_collection_name=destination_collection_name,
142-
)
143-
144-
assert move_response["moved_success"] == model_group_name
145-
146-
collection_details = sagemaker_session.list_group_resources(
147-
group=destination_collection_name, filters=collection_filter
148-
)
149-
150-
assert len(collection_details["Resources"]) == 1
151-
152-
collection_details = sagemaker_session.list_group_resources(
153-
group=source_collection_name, filters=collection_filter
154-
)
155-
assert len(collection_details["Resources"]) == 0
156-
157-
remove_response = collection.remove_model_groups(
158-
collection_name=destination_collection_name, model_groups=model_groups
159-
)
160-
161-
assert len(remove_response["failure"]) == 0
162-
assert len(remove_response["removed_groups"]) == 1
163-
164-
delete_response = collection.delete([source_collection_name, destination_collection_name])
165-
assert len(delete_response["deleted_collections"]) == 2
166-
sagemaker_session.sagemaker_client.delete_model_package_group(
167-
ModelPackageGroupName=model_group_name
168-
)
125+
try:
126+
model_groups = []
127+
model_groups.append(model_group_name)
128+
add_response = collection.add_model_groups(
129+
collection_name=source_collection_name, model_groups=model_groups
130+
)
131+
collection_filter = [
132+
{
133+
"Name": "resource-type",
134+
"Values": ["AWS::ResourceGroups::Group", "AWS::SageMaker::ModelPackageGroup"],
135+
},
136+
]
137+
collection_details = sagemaker_session.list_group_resources(
138+
group=source_collection_name, filters=collection_filter
139+
)
140+
141+
assert len(add_response["failure"]) == 0
142+
assert len(add_response["added_groups"]) == 1
143+
assert len(collection_details["Resources"]) == 1
144+
145+
move_response = collection.move_model_group(
146+
source_collection_name=source_collection_name,
147+
model_group=model_group_name,
148+
destination_collection_name=destination_collection_name,
149+
)
150+
151+
assert move_response["moved_success"] == model_group_name
152+
153+
collection_details = sagemaker_session.list_group_resources(
154+
group=destination_collection_name, filters=collection_filter
155+
)
156+
157+
assert len(collection_details["Resources"]) == 1
158+
159+
collection_details = sagemaker_session.list_group_resources(
160+
group=source_collection_name, filters=collection_filter
161+
)
162+
assert len(collection_details["Resources"]) == 0
163+
164+
remove_response = collection.remove_model_groups(
165+
collection_name=destination_collection_name, model_groups=model_groups
166+
)
167+
168+
assert len(remove_response["failure"]) == 0
169+
assert len(remove_response["removed_groups"]) == 1
170+
171+
finally:
172+
delete_response = collection.delete([source_collection_name, destination_collection_name])
173+
assert len(delete_response["deleted_collections"]) == 2
174+
sagemaker_session.sagemaker_client.delete_model_package_group(
175+
ModelPackageGroupName=model_group_name
176+
)
169177

170178

171179
def test_list_collection_success(sagemaker_session):
@@ -176,23 +184,27 @@ def test_list_collection_success(sagemaker_session):
176184
collection = Collection(sagemaker_session)
177185
collection_name = unique_name_from_base("test-collection")
178186
collection.create(collection_name)
179-
model_groups = []
180-
model_groups.append(model_group_name)
181-
collection.add_model_groups(collection_name=collection_name, model_groups=model_groups)
182-
child_collection_name = unique_name_from_base("test-collection")
183-
collection.create(parent_collection_name=collection_name, collection_name=child_collection_name)
184-
root_collections = collection.list_collection()
185-
is_collection_found = False
186-
for root_collection in root_collections:
187-
if root_collection["Name"] == collection_name:
188-
is_collection_found = True
189-
assert is_collection_found
190-
191-
collection_content = collection.list_collection(collection_name)
192-
assert len(collection_content) == 2
193-
194-
collection.remove_model_groups(collection_name=collection_name, model_groups=model_groups)
195-
collection.delete([child_collection_name, collection_name])
196-
sagemaker_session.sagemaker_client.delete_model_package_group(
197-
ModelPackageGroupName=model_group_name
198-
)
187+
try:
188+
model_groups = []
189+
model_groups.append(model_group_name)
190+
collection.add_model_groups(collection_name=collection_name, model_groups=model_groups)
191+
child_collection_name = unique_name_from_base("test-collection")
192+
collection.create(
193+
parent_collection_name=collection_name, collection_name=child_collection_name
194+
)
195+
root_collections = collection.list_collection()
196+
is_collection_found = False
197+
for root_collection in root_collections:
198+
if root_collection["Name"] == collection_name:
199+
is_collection_found = True
200+
assert is_collection_found
201+
202+
collection_content = collection.list_collection(collection_name)
203+
assert len(collection_content) == 2
204+
205+
collection.remove_model_groups(collection_name=collection_name, model_groups=model_groups)
206+
finally:
207+
collection.delete([child_collection_name, collection_name])
208+
sagemaker_session.sagemaker_client.delete_model_package_group(
209+
ModelPackageGroupName=model_group_name
210+
)

tests/unit/sagemaker/monitor/test_model_monitoring.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
LINFINITY_METHOD = "LInfinity"
7474

7575
CRON_DAILY = CronExpressionGenerator.daily()
76+
CRON_NOW = CronExpressionGenerator.now()
7677
BASELINING_JOB_NAME = "baselining-job"
7778
BASELINE_DATASET_PATH = "/my/local/path/baseline.csv"
7879
PREPROCESSOR_PATH = "/my/local/path/preprocessor.py"
@@ -1136,6 +1137,36 @@ def _test_data_quality_monitor_update_schedule(data_quality_monitor, sagemaker_s
11361137
sagemaker_session.sagemaker_client.delete_data_quality_job_definition.assert_not_called()
11371138
sagemaker_session.sagemaker_client.create_data_quality_job_definition.assert_not_called()
11381139

1140+
# update schedule
1141+
sagemaker_session.describe_monitoring_schedule = MagicMock()
1142+
sagemaker_session.sagemaker_client.describe_data_quality_job_definition = MagicMock()
1143+
sagemaker_session.sagemaker_client.create_data_quality_job_definition = MagicMock()
1144+
1145+
# Test updating monitoring schedule with schedule_cron_expression set to NOW
1146+
sagemaker_session.sagemaker_client.update_monitoring_schedule = Mock()
1147+
data_quality_monitor.update_monitoring_schedule(
1148+
data_analysis_start_time="-PT24H",
1149+
data_analysis_end_time="-PT0H",
1150+
schedule_cron_expression=CRON_NOW,
1151+
)
1152+
1153+
sagemaker_session.sagemaker_client.update_monitoring_schedule.assert_called_once_with(
1154+
MonitoringScheduleName=data_quality_monitor.monitoring_schedule_name,
1155+
MonitoringScheduleConfig={
1156+
"MonitoringJobDefinitionName": data_quality_monitor.job_definition_name,
1157+
"MonitoringType": DefaultModelMonitor.monitoring_type(),
1158+
"ScheduleConfig": {
1159+
"ScheduleExpression": CRON_NOW,
1160+
"DataAnalysisStartTime": "-PT24H",
1161+
"DataAnalysisEndTime": "-PT0H",
1162+
},
1163+
},
1164+
)
1165+
1166+
# A new data quality job definition should be created
1167+
sagemaker_session.sagemaker_client.describe_data_quality_job_definition.assert_called_once()
1168+
sagemaker_session.sagemaker_client.create_data_quality_job_definition.assert_called_once()
1169+
11391170
# update one property of job definition
11401171
time.sleep(
11411172
0.001

0 commit comments

Comments
 (0)