Repository: cloud-custodian/cloud-custodian

Issue:
Add support for SageMaker Model Quality Job Definition resource
### Describe the feature

Would be useful to support SageMaker Model Quality Job Definitions as a aws.sagemaker-model-quality-job-definition resource type



### Extra information or context

_No response_


Discussion:

Resolving patch:
diff --git a/c7n/resources/resource_map.py b/c7n/resources/resource_map.py
--- a/c7n/resources/resource_map.py
+++ b/c7n/resources/resource_map.py
@@ -222,9 +222,17 @@
   "aws.s3-storage-lens": "c7n.resources.s3control.StorageLens",
   "aws.sagemaker-auto-ml-job": "c7n.resources.sagemaker.SagemakerAutoMLJob",
   "aws.sagemaker-cluster": "c7n.resources.sagemaker.Cluster",
+  "aws.sagemaker-compilation-job": "c7n.resources.sagemaker.SagemakerCompilationJob",
+  "aws.sagemaker-data-quality-job-definition":
+    "c7n.resources.sagemaker.SagemakerDataQualityJobDefinition",
   "aws.sagemaker-domain": "c7n.resources.sagemaker.SagemakerDomain",
   "aws.sagemaker-endpoint": "c7n.resources.sagemaker.SagemakerEndpoint",
   "aws.sagemaker-endpoint-config": "c7n.resources.sagemaker.SagemakerEndpointConfig",
+  "aws.sagemaker-model-explainability-job-definition":
+    "c7n.resources.sagemaker.SagemakerModelExplainabilityJobDefinition",
+  "aws.sagemaker-model-quality-job-definition":
+    "c7n.resources.sagemaker.SagemakerModelQualityJobDefinition",
+  "aws.sagemaker-processing-job": "c7n.resources.sagemaker.SagemakerProcessingJob",
   "aws.sagemaker-job": "c7n.resources.sagemaker.SagemakerJob",
   "aws.sagemaker-model": "c7n.resources.sagemaker.Model",
   "aws.sagemaker-notebook": "c7n.resources.sagemaker.NotebookInstance",
diff --git a/c7n/resources/sagemaker.py b/c7n/resources/sagemaker.py
--- a/c7n/resources/sagemaker.py
+++ b/c7n/resources/sagemaker.py
@@ -220,6 +220,82 @@ def resources(self, query=None):
         return super(SagemakerAutoMLJob, self).resources(query=query)
 
 
+class SagemakerCompilationJobDescribe(DescribeSource):
+
+    def augment(self, resources):
+        return universal_augment(self.manager, super().augment(resources))
+
+
+@resources.register('sagemaker-compilation-job')
+class SagemakerCompilationJob(QueryResourceManager):
+
+    class resource_type(TypeInfo):
+        service = 'sagemaker'
+        enum_spec = ('list_compilation_jobs', 'CompilationJobSummaries', None)
+        detail_spec = (
+            'describe_compilation_job', 'CompilationJobName', 'CompilationJobName', None)
+        arn = id = 'CompilationJobArn'
+        name = 'CompilationJobName'
+        date = 'CreationTime'
+        permission_prefix = 'sagemaker'
+        universal_taggable = object()
+
+    source_mapping = {'describe': SagemakerCompilationJobDescribe}
+
+    def __init__(self, ctx, data):
+        super(SagemakerCompilationJob, self).__init__(ctx, data)
+        self.queries = QueryFilter.parse(
+            self.data.get('query', [
+                {'StatusEquals': 'INPROGRESS'}]))
+
+    def resources(self, query=None):
+        for q in self.queries:
+            if q is None:
+                continue
+            query = query or {}
+            for k, v in q.items():
+                query[k] = v
+        return super(SagemakerCompilationJob, self).resources(query=query)
+
+
+class SagemakerProcessingJobDescribe(DescribeSource):
+
+    def augment(self, resources):
+        return universal_augment(self.manager, super().augment(resources))
+
+
+@resources.register('sagemaker-processing-job')
+class SagemakerProcessingJob(QueryResourceManager):
+
+    class resource_type(TypeInfo):
+        service = 'sagemaker'
+        enum_spec = ('list_processing_jobs', 'ProcessingJobSummaries', None)
+        detail_spec = (
+            'describe_processing_job', 'ProcessingJobName', 'ProcessingJobName', None)
+        arn = id = 'ProcessingJobArn'
+        name = 'ProcessingJobName'
+        date = 'CreationTime'
+        permission_prefix = 'sagemaker'
+        universal_taggable = object()
+
+    source_mapping = {'describe': SagemakerProcessingJobDescribe}
+
+    def __init__(self, ctx, data):
+        super(SagemakerProcessingJob, self).__init__(ctx, data)
+        self.queries = QueryFilter.parse(
+            self.data.get('query', [
+                {'StatusEquals': 'InProgress'}]))
+
+    def resources(self, query=None):
+        for q in self.queries:
+            if q is None:
+                continue
+            query = query or {}
+            for k, v in q.items():
+                query[k] = v
+        return super(SagemakerProcessingJob, self).resources(query=query)
+
+
 class QueryFilter:
 
     JOB_FILTERS = ('StatusEquals', 'NameContains',)
@@ -420,6 +496,81 @@ class resource_type(TypeInfo):
     source_mapping = {'describe': SagemakerClusterDescribe}
 
 
+class SagemakerDataQualityJobDefinitionDescribe(DescribeSource):
+
+    def augment(self, resources):
+        return universal_augment(self.manager, super().augment(resources))
+
+
+@resources.register('sagemaker-data-quality-job-definition')
+class SagemakerDataQualityJobDefinition(QueryResourceManager):
+    class resource_type(TypeInfo):
+        service = 'sagemaker'
+        enum_spec = ('list_data_quality_job_definitions', 'JobDefinitionSummaries', None)
+        detail_spec = ('describe_data_quality_job_definition', 'JobDefinitionName',
+                       'MonitoringJobDefinitionName', None)
+        arn = id = 'JobDefinitionArn'
+        name = 'JobDefinitionName'
+        date = 'CreationTime'
+        cfn_type = 'AWS::SageMaker::DataQualityJobDefinition'
+        permission_prefix = 'sagemaker'
+        filter_name = 'EndpointName'
+        filter_type = 'scalar'
+        universal_taggable = object()
+
+    source_mapping = {'describe': SagemakerDataQualityJobDefinitionDescribe}
+
+
+class SagemakerModelExplainabilityJobDefinitionDescribe(DescribeSource):
+
+    def augment(self, resources):
+        return universal_augment(self.manager, super().augment(resources))
+
+
+@resources.register('sagemaker-model-explainability-job-definition')
+class SagemakerModelExplainabilityJobDefinition(QueryResourceManager):
+    class resource_type(TypeInfo):
+        service = 'sagemaker'
+        enum_spec = ('list_model_explainability_job_definitions', 'JobDefinitionSummaries', None)
+        detail_spec = ('describe_model_explainability_job_definition', 'JobDefinitionName',
+                       'MonitoringJobDefinitionName', None)
+        arn = id = 'JobDefinitionArn'
+        name = 'JobDefinitionName'
+        date = 'CreationTime'
+        cfn_type = 'AWS::SageMaker::ModelExplainabilityJobDefinition'
+        permission_prefix = 'sagemaker'
+        filter_name = 'EndpointName'
+        filter_type = 'scalar'
+        universal_taggable = object()
+
+    source_mapping = {'describe': SagemakerModelExplainabilityJobDefinitionDescribe}
+
+
+class SagemakerModelQualityJobDefinitionDescribe(DescribeSource):
+
+    def augment(self, resources):
+        return universal_augment(self.manager, super().augment(resources))
+
+
+@resources.register('sagemaker-model-quality-job-definition')
+class SagemakerModelQualityJobDefinition(QueryResourceManager):
+    class resource_type(TypeInfo):
+        service = 'sagemaker'
+        enum_spec = ('list_model_quality_job_definitions', 'JobDefinitionSummaries', None)
+        detail_spec = ('describe_model_quality_job_definition', 'JobDefinitionName',
+                       'MonitoringJobDefinitionName', None)
+        arn = id = 'JobDefinitionArn'
+        name = 'JobDefinitionName'
+        date = 'CreationTime'
+        cfn_type = 'AWS::SageMaker::ModelQualityJobDefinition'
+        permission_prefix = 'sagemaker'
+        filter_name = 'EndpointName'
+        filter_type = 'scalar'
+        universal_taggable = object()
+
+    source_mapping = {'describe': SagemakerModelQualityJobDefinitionDescribe}
+
+
 @SagemakerEndpoint.action_registry.register('tag')
 @SagemakerEndpointConfig.action_registry.register('tag')
 @NotebookInstance.action_registry.register('tag')
@@ -833,6 +984,93 @@ def process(self, endpoints):
                 pass
 
 
+@SagemakerDataQualityJobDefinition.action_registry.register('delete')
+class SagemakerDataQualityJobDefinitionDelete(BaseAction):
+    """Delete a SageMaker Data Quality Job Definition
+
+    :example:
+
+    .. code-block:: yaml
+
+        policies:
+          - name: delete-sagemaker-data-quality-job-definition
+            resource: sagemaker-data-quality-job-definition
+            filters:
+              - JobDefinitionName: job-def-1
+            actions:
+              - delete
+    """
+    schema = type_schema('delete')
+    permissions = ('sagemaker:DeleteDataQualityJobDefinition',)
+
+    def process(self, job_definitions):
+        client = local_session(self.manager.session_factory).client('sagemaker')
+        for j in job_definitions:
+            try:
+                client.delete_data_quality_job_definition(
+                    JobDefinitionName=j['JobDefinitionName'])
+            except client.exceptions.ResourceNotFound:
+                pass
+
+
+@SagemakerModelExplainabilityJobDefinition.action_registry.register('delete')
+class SagemakerModelExplainabilityJobDefinitionDelete(BaseAction):
+    """Delete a SageMaker Model Explainability Job Definition
+
+    :example:
+
+    .. code-block:: yaml
+
+        policies:
+          - name: delete-sagemaker-model-explainability-job-definition
+            resource: sagemaker-model-explainability-job-definition
+            filters:
+              - JobDefinitionName: job-def-1
+            actions:
+              - delete
+    """
+    schema = type_schema('delete')
+    permissions = ('sagemaker:DeleteModelExplainabilityJobDefinition',)
+
+    def process(self, job_definitions):
+        client = local_session(self.manager.session_factory).client('sagemaker')
+        for j in job_definitions:
+            try:
+                client.delete_model_explainability_job_definition(
+                    JobDefinitionName=j['JobDefinitionName'])
+            except client.exceptions.ResourceNotFound:
+                pass
+
+
+@SagemakerModelQualityJobDefinition.action_registry.register('delete')
+class SagemakerModelQualityJobDefinitionDelete(BaseAction):
+    """Delete a SageMaker Model Quality Job Definition
+
+    :example:
+
+    .. code-block:: yaml
+
+        policies:
+          - name: delete-sagemaker-model-quality-job-definition
+            resource: sagemaker-model-quality-job-definition
+            filters:
+              - JobDefinitionName: job-def-1
+            actions:
+              - delete
+    """
+    schema = type_schema('delete')
+    permissions = ('sagemaker:DeleteModelQualityJobDefinition',)
+
+    def process(self, job_definitions):
+        client = local_session(self.manager.session_factory).client('sagemaker')
+        for j in job_definitions:
+            try:
+                client.delete_model_quality_job_definition(
+                    JobDefinitionName=j['JobDefinitionName'])
+            except client.exceptions.ResourceNotFound:
+                pass
+
+
 @SagemakerTransformJob.action_registry.register('stop')
 class SagemakerTransformJobStop(BaseAction):
     """Stops a SageMaker Transform job
@@ -920,6 +1158,64 @@ def process(self, jobs):
                 pass
 
 
+@SagemakerCompilationJob.action_registry.register('stop')
+class SagemakerCompilationJobStop(BaseAction):
+    """Stops a SageMaker Compilation job
+
+    :example:
+
+    .. code-block:: yaml
+
+        policies:
+          - name: stop-compilation-job
+            resource: sagemaker-compilation-job
+            filters:
+              - CompilationJobName: ml-job-10
+            actions:
+              - stop
+    """
+    schema = type_schema('stop')
+    permissions = ('sagemaker:StopCompilationJob',)
+
+    def process(self, jobs):
+        client = local_session(self.manager.session_factory).client('sagemaker')
+
+        for j in jobs:
+            try:
+                client.stop_compilation_job(CompilationJobName=j['CompilationJobName'])
+            except client.exceptions.ResourceNotFound:
+                pass
+
+
+@SagemakerProcessingJob.action_registry.register('stop')
+class SagemakerProcessingJobStop(BaseAction):
+    """Stops a Sagemaker Processing job
+
+    :example:
+
+    .. code-block:: yaml
+
+        policies:
+          - name: stop-processing-job
+            resource: sagemaker-processing-job
+            filters:
+              - ProcessingJobName: ml-job-10
+            actions:
+              - stop
+    """
+    schema = type_schema('stop')
+    permissions = ('sagemaker:StopProcessingJob',)
+
+    def process(self, jobs):
+        client = local_session(self.manager.session_factory).client('sagemaker')
+
+        for j in jobs:
+            try:
+                client.stop_processing_job(ProcessingJobName=j['ProcessingJobName'])
+            except client.exceptions.ResourceNotFound:
+                pass
+
+
 @Cluster.action_registry.register('delete')
 class ClusterDelete(BaseAction):
     """Deletes sagemaker-cluster(s)


Test patch:
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_query/api.sagemaker.DescribeCompilationJob_1.json b/tests/data/placebo/test_sagemaker_compilation_job_query/api.sagemaker.DescribeCompilationJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_query/api.sagemaker.DescribeCompilationJob_1.json
@@ -0,0 +1,64 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobName": "c7n-test-1",
+        "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-1",
+        "CompilationJobStatus": "FAILED",
+        "CompilationStartTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 31,
+            "second": 31,
+            "microsecond": 0
+        },
+        "CompilationEndTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 32,
+            "second": 56,
+            "microsecond": 0
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 900
+        },
+        "InferenceImage": "644160558196.dkr.ecr.us-east-1.amazonaws.com/xgboost-neo:latest",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 29,
+            "second": 49,
+            "microsecond": 170000
+        },
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 32,
+            "second": 56,
+            "microsecond": 0
+        },
+        "FailureReason": "ClientError: InputConfiguration: Unable to untar input model.Please confirm the model is a tar.gz file')  For further troubleshooting common failures please visit: https://docs.aws.amazon.com/sagemaker/latest/dg/neo-troubleshooting-compilation.html",
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "InputConfig": {
+            "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train/train.csv",
+            "DataInputConfig": "{\"data\": [1, 2, 3, 4]}",
+            "Framework": "XGBOOST"
+        },
+        "OutputConfig": {
+            "S3OutputLocation": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/",
+            "TargetDevice": "ml_c4"
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_query/api.sagemaker.ListCompilationJobs_1.json b/tests/data/placebo/test_sagemaker_compilation_job_query/api.sagemaker.ListCompilationJobs_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_query/api.sagemaker.ListCompilationJobs_1.json
@@ -0,0 +1,54 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobSummaries": [
+            {
+                "CompilationJobName": "c7n-test-1",
+                "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-1",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 29,
+                    "second": 49,
+                    "microsecond": 170000
+                },
+                "CompilationStartTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 31,
+                    "second": 31,
+                    "microsecond": 0
+                },
+                "CompilationEndTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 32,
+                    "second": 56,
+                    "microsecond": 0
+                },
+                "CompilationTargetDevice": "ml_c4",
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 32,
+                    "second": 56,
+                    "microsecond": 0
+                },
+                "CompilationJobStatus": "FAILED"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_query/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_compilation_job_query/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_query/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.DescribeCompilationJob_1.json b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.DescribeCompilationJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.DescribeCompilationJob_1.json
@@ -0,0 +1,53 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobName": "c7n-test-2",
+        "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-2",
+        "CompilationJobStatus": "INPROGRESS",
+        "CompilationStartTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 42,
+            "second": 29,
+            "microsecond": 0
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 900
+        },
+        "InferenceImage": "644160558196.dkr.ecr.us-east-1.amazonaws.com/xgboost-neo:latest",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 40,
+            "second": 35,
+            "microsecond": 546000
+        },
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 42,
+            "second": 29,
+            "microsecond": 0
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "InputConfig": {
+            "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train/train.csv",
+            "DataInputConfig": "{\"data\": [1, 2, 3, 4]}",
+            "Framework": "XGBOOST"
+        },
+        "OutputConfig": {
+            "S3OutputLocation": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/",
+            "TargetDevice": "ml_c4"
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.DescribeCompilationJob_2.json b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.DescribeCompilationJob_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.DescribeCompilationJob_2.json
@@ -0,0 +1,53 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobName": "c7n-test-2",
+        "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-2",
+        "CompilationJobStatus": "STOPPING",
+        "CompilationStartTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 42,
+            "second": 29,
+            "microsecond": 0
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 900
+        },
+        "InferenceImage": "644160558196.dkr.ecr.us-east-1.amazonaws.com/xgboost-neo:latest",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 40,
+            "second": 35,
+            "microsecond": 546000
+        },
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 42,
+            "second": 35,
+            "microsecond": 0
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "InputConfig": {
+            "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train/train.csv",
+            "DataInputConfig": "{\"data\": [1, 2, 3, 4]}",
+            "Framework": "XGBOOST"
+        },
+        "OutputConfig": {
+            "S3OutputLocation": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/",
+            "TargetDevice": "ml_c4"
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.ListCompilationJobs_1.json b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.ListCompilationJobs_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.ListCompilationJobs_1.json
@@ -0,0 +1,44 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobSummaries": [
+            {
+                "CompilationJobName": "c7n-test-2",
+                "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-2",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 40,
+                    "second": 35,
+                    "microsecond": 546000
+                },
+                "CompilationStartTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 42,
+                    "second": 29,
+                    "microsecond": 0
+                },
+                "CompilationTargetDevice": "ml_c4",
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 42,
+                    "second": 29,
+                    "microsecond": 0
+                },
+                "CompilationJobStatus": "INPROGRESS"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.StopCompilationJob_1.json b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.StopCompilationJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_stop/api.sagemaker.StopCompilationJob_1.json
@@ -0,0 +1,6 @@
+{
+    "status_code": 200,
+    "data": {
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_stop/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_compilation_job_stop/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_stop/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.DescribeCompilationJob_1.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.DescribeCompilationJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.DescribeCompilationJob_1.json
@@ -0,0 +1,53 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobName": "c7n-test-3",
+        "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-3",
+        "CompilationJobStatus": "INPROGRESS",
+        "CompilationStartTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 49,
+            "second": 13,
+            "microsecond": 0
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 900
+        },
+        "InferenceImage": "644160558196.dkr.ecr.us-east-1.amazonaws.com/xgboost-neo:latest",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 46,
+            "second": 52,
+            "microsecond": 792000
+        },
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 49,
+            "second": 13,
+            "microsecond": 0
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "InputConfig": {
+            "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train/train.csv",
+            "DataInputConfig": "{\"data\": [1, 2, 3, 4]}",
+            "Framework": "XGBOOST"
+        },
+        "OutputConfig": {
+            "S3OutputLocation": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/",
+            "TargetDevice": "ml_c4"
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.DescribeCompilationJob_2.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.DescribeCompilationJob_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.DescribeCompilationJob_2.json
@@ -0,0 +1,53 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobName": "c7n-test-3",
+        "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-3",
+        "CompilationJobStatus": "INPROGRESS",
+        "CompilationStartTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 49,
+            "second": 13,
+            "microsecond": 0
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 900
+        },
+        "InferenceImage": "644160558196.dkr.ecr.us-east-1.amazonaws.com/xgboost-neo:latest",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 46,
+            "second": 52,
+            "microsecond": 792000
+        },
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 16,
+            "hour": 13,
+            "minute": 49,
+            "second": 13,
+            "microsecond": 0
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "InputConfig": {
+            "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train/train.csv",
+            "DataInputConfig": "{\"data\": [1, 2, 3, 4]}",
+            "Framework": "XGBOOST"
+        },
+        "OutputConfig": {
+            "S3OutputLocation": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/",
+            "TargetDevice": "ml_c4"
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListCompilationJobs_1.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListCompilationJobs_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListCompilationJobs_1.json
@@ -0,0 +1,44 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobSummaries": [
+            {
+                "CompilationJobName": "c7n-test-3",
+                "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-3",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 46,
+                    "second": 52,
+                    "microsecond": 792000
+                },
+                "CompilationStartTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 49,
+                    "second": 13,
+                    "microsecond": 0
+                },
+                "CompilationTargetDevice": "ml_c4",
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 49,
+                    "second": 13,
+                    "microsecond": 0
+                },
+                "CompilationJobStatus": "INPROGRESS"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListCompilationJobs_2.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListCompilationJobs_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListCompilationJobs_2.json
@@ -0,0 +1,44 @@
+{
+    "status_code": 200,
+    "data": {
+        "CompilationJobSummaries": [
+            {
+                "CompilationJobName": "c7n-test-3",
+                "CompilationJobArn": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-3",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 46,
+                    "second": 52,
+                    "microsecond": 792000
+                },
+                "CompilationStartTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 49,
+                    "second": 13,
+                    "microsecond": 0
+                },
+                "CompilationTargetDevice": "ml_c4",
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 16,
+                    "hour": 13,
+                    "minute": 49,
+                    "second": 13,
+                    "microsecond": 0
+                },
+                "CompilationJobStatus": "INPROGRESS"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListTags_1.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListTags_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListTags_1.json
@@ -0,0 +1,12 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [
+            {
+                "Key": "JobTag",
+                "Value": "JobTagValue"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListTags_2.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListTags_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/api.sagemaker.ListTags_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.GetResources_2.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.GetResources_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.GetResources_2.json
@@ -0,0 +1,18 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:compilation-job/c7n-test-3",
+                "Tags": [
+                    {
+                        "Key": "JobTag",
+                        "Value": "JobTagValue"
+                    }
+                ]
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.TagResources_1.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.TagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.TagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.UntagResources_1.json b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.UntagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_compilation_job_tag/tagging.UntagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.DeleteDataQualityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.DeleteDataQualityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.DeleteDataQualityJobDefinition_1.json
@@ -0,0 +1,6 @@
+{
+    "status_code": 200,
+    "data": {
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.DescribeDataQualityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.DescribeDataQualityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.DescribeDataQualityJobDefinition_1.json
@@ -0,0 +1,51 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:data-quality-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 24,
+            "hour": 15,
+            "minute": 33,
+            "second": 33,
+            "microsecond": 57000
+        },
+        "DataQualityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/data-quality-job:latest"
+        },
+        "DataQualityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated"
+            }
+        },
+        "DataQualityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.ListDataQualityJobDefinitions_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.ListDataQualityJobDefinitions_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.ListDataQualityJobDefinitions_1.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:data-quality-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 24,
+                    "hour": 15,
+                    "minute": 33,
+                    "second": 33,
+                    "microsecond": 57000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.ListDataQualityJobDefinitions_2.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.ListDataQualityJobDefinitions_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/api.sagemaker.ListDataQualityJobDefinitions_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_delete/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.DescribeDataQualityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.DescribeDataQualityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.DescribeDataQualityJobDefinition_1.json
@@ -0,0 +1,51 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:data-quality-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 24,
+            "hour": 15,
+            "minute": 28,
+            "second": 49,
+            "microsecond": 175000
+        },
+        "DataQualityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/data-quality-job:latest"
+        },
+        "DataQualityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated"
+            }
+        },
+        "DataQualityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.DescribeDataQualityJobDefinition_2.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.DescribeDataQualityJobDefinition_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.DescribeDataQualityJobDefinition_2.json
@@ -0,0 +1,51 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:data-quality-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 24,
+            "hour": 15,
+            "minute": 28,
+            "second": 49,
+            "microsecond": 175000
+        },
+        "DataQualityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/data-quality-job:latest"
+        },
+        "DataQualityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated"
+            }
+        },
+        "DataQualityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListDataQualityJobDefinitions_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListDataQualityJobDefinitions_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListDataQualityJobDefinitions_1.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:data-quality-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 24,
+                    "hour": 15,
+                    "minute": 28,
+                    "second": 49,
+                    "microsecond": 175000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListDataQualityJobDefinitions_2.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListDataQualityJobDefinitions_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListDataQualityJobDefinitions_2.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:data-quality-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 24,
+                    "hour": 15,
+                    "minute": 28,
+                    "second": 49,
+                    "microsecond": 175000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListTags_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListTags_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListTags_1.json
@@ -0,0 +1,12 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [
+            {
+                "Key": "Owner",
+                "Value": "c7n"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListTags_2.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListTags_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/api.sagemaker.ListTags_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.GetResources_2.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.GetResources_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.GetResources_2.json
@@ -0,0 +1,18 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:data-quality-job-definition/c7n-test",
+                "Tags": [
+                    {
+                        "Key": "Owner",
+                        "Value": "c7n"
+                    }
+                ]
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.TagResources_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.TagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.TagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.UntagResources_1.json b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.UntagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_data_quality_job_definition_tag/tagging.UntagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.DeleteModelExplainabilityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.DeleteModelExplainabilityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.DeleteModelExplainabilityJobDefinition_1.json
@@ -0,0 +1,6 @@
+{
+    "status_code": 200,
+    "data": {
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.DescribeModelExplainabilityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.DescribeModelExplainabilityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.DescribeModelExplainabilityJobDefinition_1.json
@@ -0,0 +1,52 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 25,
+            "hour": 11,
+            "minute": 27,
+            "second": 13,
+            "microsecond": 953000
+        },
+        "ModelExplainabilityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/model-explainability-job:latest",
+            "ConfigUri": "s3://c7n-test-s3-bucket/config.json"
+        },
+        "ModelExplainabilityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated"
+            }
+        },
+        "ModelExplainabilityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.ListModelExplainabilityJobDefinitions_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.ListModelExplainabilityJobDefinitions_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.ListModelExplainabilityJobDefinitions_1.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 25,
+                    "hour": 11,
+                    "minute": 27,
+                    "second": 13,
+                    "microsecond": 953000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.ListModelExplainabilityJobDefinitions_2.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.ListModelExplainabilityJobDefinitions_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/api.sagemaker.ListModelExplainabilityJobDefinitions_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_delete/tagging.GetResources_1.json
@@ -0,0 +1,13 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+                "Tags": []
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.DescribeModelExplainabilityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.DescribeModelExplainabilityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.DescribeModelExplainabilityJobDefinition_1.json
@@ -0,0 +1,52 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 25,
+            "hour": 11,
+            "minute": 27,
+            "second": 13,
+            "microsecond": 953000
+        },
+        "ModelExplainabilityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/model-explainability-job:latest",
+            "ConfigUri": "s3://c7n-test-s3-bucket/config.json"
+        },
+        "ModelExplainabilityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated"
+            }
+        },
+        "ModelExplainabilityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.DescribeModelExplainabilityJobDefinition_2.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.DescribeModelExplainabilityJobDefinition_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.DescribeModelExplainabilityJobDefinition_2.json
@@ -0,0 +1,52 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 25,
+            "hour": 11,
+            "minute": 27,
+            "second": 13,
+            "microsecond": 953000
+        },
+        "ModelExplainabilityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/model-explainability-job:latest",
+            "ConfigUri": "s3://c7n-test-s3-bucket/config.json"
+        },
+        "ModelExplainabilityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated"
+            }
+        },
+        "ModelExplainabilityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListModelExplainabilityJobDefinitions_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListModelExplainabilityJobDefinitions_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListModelExplainabilityJobDefinitions_1.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 25,
+                    "hour": 11,
+                    "minute": 27,
+                    "second": 13,
+                    "microsecond": 953000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListModelExplainabilityJobDefinitions_2.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListModelExplainabilityJobDefinitions_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListModelExplainabilityJobDefinitions_2.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 25,
+                    "hour": 11,
+                    "minute": 27,
+                    "second": 13,
+                    "microsecond": 953000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListTags_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListTags_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListTags_1.json
@@ -0,0 +1,12 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [
+            {
+                "Key": "Owner",
+                "Value": "c7n"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListTags_2.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListTags_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/api.sagemaker.ListTags_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.GetResources_2.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.GetResources_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.GetResources_2.json
@@ -0,0 +1,18 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:model-explainability-job-definition/c7n-test",
+                "Tags": [
+                    {
+                        "Key": "Owner",
+                        "Value": "c7n"
+                    }
+                ]
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.TagResources_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.TagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.TagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.UntagResources_1.json b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.UntagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_explainability_job_definition_tag/tagging.UntagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.DeleteModelQualityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.DeleteModelQualityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.DeleteModelQualityJobDefinition_1.json
@@ -0,0 +1,6 @@
+{
+    "status_code": 200,
+    "data": {
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.DescribeModelQualityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.DescribeModelQualityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.DescribeModelQualityJobDefinition_1.json
@@ -0,0 +1,56 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 25,
+            "hour": 11,
+            "minute": 50,
+            "second": 30,
+            "microsecond": 782000
+        },
+        "ModelQualityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/model-explainability-job:latest",
+            "ProblemType": "Regression"
+        },
+        "ModelQualityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated",
+                "InferenceAttribute": "test"
+            },
+            "GroundTruthS3Input": {
+                "S3Uri": "s3://c7n-test-s3-bucket/config.json"
+            }
+        },
+        "ModelQualityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.ListModelQualityJobDefinitions_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.ListModelQualityJobDefinitions_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.ListModelQualityJobDefinitions_1.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 25,
+                    "hour": 11,
+                    "minute": 50,
+                    "second": 30,
+                    "microsecond": 782000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.ListModelQualityJobDefinitions_2.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.ListModelQualityJobDefinitions_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/api.sagemaker.ListModelQualityJobDefinitions_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_delete/tagging.GetResources_1.json
@@ -0,0 +1,13 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+                "Tags": []
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.DescribeModelQualityJobDefinition_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.DescribeModelQualityJobDefinition_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.DescribeModelQualityJobDefinition_1.json
@@ -0,0 +1,56 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 25,
+            "hour": 11,
+            "minute": 50,
+            "second": 30,
+            "microsecond": 782000
+        },
+        "ModelQualityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/model-explainability-job:latest",
+            "ProblemType": "Regression"
+        },
+        "ModelQualityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated",
+                "InferenceAttribute": "test"
+            },
+            "GroundTruthS3Input": {
+                "S3Uri": "s3://c7n-test-s3-bucket/config.json"
+            }
+        },
+        "ModelQualityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.DescribeModelQualityJobDefinition_2.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.DescribeModelQualityJobDefinition_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.DescribeModelQualityJobDefinition_2.json
@@ -0,0 +1,56 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+        "JobDefinitionName": "c7n-test",
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 25,
+            "hour": 11,
+            "minute": 50,
+            "second": 30,
+            "microsecond": 782000
+        },
+        "ModelQualityAppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/model-explainability-job:latest",
+            "ProblemType": "Regression"
+        },
+        "ModelQualityJobInput": {
+            "EndpointInput": {
+                "EndpointName": "c7n-test-endpoint",
+                "LocalPath": "/opt/ml/processing/input",
+                "S3InputMode": "File",
+                "S3DataDistributionType": "FullyReplicated",
+                "InferenceAttribute": "test"
+            },
+            "GroundTruthS3Input": {
+                "S3Uri": "s3://c7n-test-s3-bucket/config.json"
+            }
+        },
+        "ModelQualityJobOutputConfig": {
+            "MonitoringOutputs": [
+                {
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/output",
+                        "S3UploadMode": "EndOfJob"
+                    }
+                }
+            ]
+        },
+        "JobResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.t3.medium",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240417T154464",
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 3600
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListModelQualityJobDefinitions_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListModelQualityJobDefinitions_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListModelQualityJobDefinitions_1.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 25,
+                    "hour": 11,
+                    "minute": 50,
+                    "second": 30,
+                    "microsecond": 782000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListModelQualityJobDefinitions_2.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListModelQualityJobDefinitions_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListModelQualityJobDefinitions_2.json
@@ -0,0 +1,23 @@
+{
+    "status_code": 200,
+    "data": {
+        "JobDefinitionSummaries": [
+            {
+                "MonitoringJobDefinitionName": "c7n-test",
+                "MonitoringJobDefinitionArn": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 25,
+                    "hour": 11,
+                    "minute": 50,
+                    "second": 30,
+                    "microsecond": 782000
+                },
+                "EndpointName": "c7n-test-endpoint"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListTags_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListTags_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListTags_1.json
@@ -0,0 +1,12 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [
+            {
+                "Key": "Owner",
+                "Value": "c7n"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListTags_2.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListTags_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/api.sagemaker.ListTags_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.GetResources_2.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.GetResources_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.GetResources_2.json
@@ -0,0 +1,18 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:model-quality-job-definition/c7n-test",
+                "Tags": [
+                    {
+                        "Key": "Owner",
+                        "Value": "c7n"
+                    }
+                ]
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.TagResources_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.TagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.TagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.UntagResources_1.json b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.UntagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_model_quality_job_definition_tag/tagging.UntagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_query/api.sagemaker.DescribeProcessingJob_1.json b/tests/data/placebo/test_sagemaker_processing_job_query/api.sagemaker.DescribeProcessingJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_query/api.sagemaker.DescribeProcessingJob_1.json
@@ -0,0 +1,85 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingInputs": [
+            {
+                "InputName": "input",
+                "AppManaged": false,
+                "S3Input": {
+                    "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "S3DataType": "S3Prefix",
+                    "S3InputMode": "File",
+                    "S3DataDistributionType": "FullyReplicated",
+                    "S3CompressionType": "None"
+                }
+            }
+        ],
+        "ProcessingOutputConfig": {
+            "Outputs": [
+                {
+                    "OutputName": "output",
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "S3UploadMode": "EndOfJob"
+                    },
+                    "AppManaged": false
+                }
+            ]
+        },
+        "ProcessingJobName": "c7n-test",
+        "ProcessingResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.m4.xlarge",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 86400
+        },
+        "AppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/ubuntu18.04"
+        },
+        "NetworkConfig": {
+            "EnableInterContainerTrafficEncryption": false,
+            "EnableNetworkIsolation": false
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+        "ProcessingJobStatus": "Failed",
+        "FailureReason": "ClientError: API error (404): pull access denied for 644160558196.dkr.ecr.us-east-1.amazonaws.com/ubuntu18.04, repository does not exist or may require 'docker login': denied: User: arn:aws:sts::644160558196:assumed-role/Instance_Role_For_Scopedown-pipeline-prod/SageMaker is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:us-east-1:644160558196:repository/ubuntu18.04 because no resource-based policy allows the ecr:BatchGetImage action",
+        "ProcessingEndTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 24,
+            "second": 44,
+            "microsecond": 27000
+        },
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 24,
+            "second": 44,
+            "microsecond": 447000
+        },
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 23,
+            "second": 2,
+            "microsecond": 537000
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_query/api.sagemaker.ListProcessingJobs_1.json b/tests/data/placebo/test_sagemaker_processing_job_query/api.sagemaker.ListProcessingJobs_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_query/api.sagemaker.ListProcessingJobs_1.json
@@ -0,0 +1,44 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingJobSummaries": [
+            {
+                "ProcessingJobName": "c7n-test",
+                "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 23,
+                    "second": 2,
+                    "microsecond": 537000
+                },
+                "ProcessingEndTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 24,
+                    "second": 44,
+                    "microsecond": 27000
+                },
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 24,
+                    "second": 44,
+                    "microsecond": 447000
+                },
+                "ProcessingJobStatus": "Failed",
+                "FailureReason": "ClientError: API error (404): pull access denied for 644160558196.dkr.ecr.us-east-1.amazonaws.com/ubuntu18.04, repository does not exist or may require 'docker login': denied: User: arn:aws:sts::644160558196:assumed-role/Instance_Role_For_Scopedown-pipeline-prod/SageMaker is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:us-east-1:644160558196:repository/ubuntu18.04 because no resource-based policy allows the ecr:BatchGetImage action"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_query/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_processing_job_query/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_query/tagging.GetResources_1.json
@@ -0,0 +1,13 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+                "Tags": []
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.DescribeProcessingJob_1.json b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.DescribeProcessingJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.DescribeProcessingJob_1.json
@@ -0,0 +1,74 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingInputs": [
+            {
+                "InputName": "input",
+                "AppManaged": false,
+                "S3Input": {
+                    "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "S3DataType": "S3Prefix",
+                    "S3InputMode": "File",
+                    "S3DataDistributionType": "FullyReplicated",
+                    "S3CompressionType": "None"
+                }
+            }
+        ],
+        "ProcessingOutputConfig": {
+            "Outputs": [
+                {
+                    "OutputName": "output",
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "S3UploadMode": "EndOfJob"
+                    },
+                    "AppManaged": false
+                }
+            ]
+        },
+        "ProcessingJobName": "c7n-test-1",
+        "ProcessingResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.m4.xlarge",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 86400
+        },
+        "AppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/ubuntu18.04"
+        },
+        "NetworkConfig": {
+            "EnableInterContainerTrafficEncryption": false,
+            "EnableNetworkIsolation": false
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test-1",
+        "ProcessingJobStatus": "InProgress",
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 27,
+            "second": 25,
+            "microsecond": 532000
+        },
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 27,
+            "second": 23,
+            "microsecond": 901000
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.DescribeProcessingJob_2.json b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.DescribeProcessingJob_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.DescribeProcessingJob_2.json
@@ -0,0 +1,74 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingInputs": [
+            {
+                "InputName": "input",
+                "AppManaged": false,
+                "S3Input": {
+                    "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "S3DataType": "S3Prefix",
+                    "S3InputMode": "File",
+                    "S3DataDistributionType": "FullyReplicated",
+                    "S3CompressionType": "None"
+                }
+            }
+        ],
+        "ProcessingOutputConfig": {
+            "Outputs": [
+                {
+                    "OutputName": "output",
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "S3UploadMode": "EndOfJob"
+                    },
+                    "AppManaged": false
+                }
+            ]
+        },
+        "ProcessingJobName": "c7n-test-1",
+        "ProcessingResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.m4.xlarge",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 86400
+        },
+        "AppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/ubuntu18.04"
+        },
+        "NetworkConfig": {
+            "EnableInterContainerTrafficEncryption": false,
+            "EnableNetworkIsolation": false
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test-1",
+        "ProcessingJobStatus": "Stopping",
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 27,
+            "second": 41,
+            "microsecond": 794000
+        },
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 27,
+            "second": 23,
+            "microsecond": 901000
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.ListProcessingJobs_1.json b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.ListProcessingJobs_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.ListProcessingJobs_1.json
@@ -0,0 +1,33 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingJobSummaries": [
+            {
+                "ProcessingJobName": "c7n-test-1",
+                "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test-1",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 27,
+                    "second": 23,
+                    "microsecond": 901000
+                },
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 27,
+                    "second": 25,
+                    "microsecond": 532000
+                },
+                "ProcessingJobStatus": "InProgress"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.StopProcessingJob_1.json b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.StopProcessingJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_stop/api.sagemaker.StopProcessingJob_1.json
@@ -0,0 +1,6 @@
+{
+    "status_code": 200,
+    "data": {
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_stop/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_processing_job_stop/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_stop/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.DescribeProcessingJob_1.json b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.DescribeProcessingJob_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.DescribeProcessingJob_1.json
@@ -0,0 +1,74 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingInputs": [
+            {
+                "InputName": "input",
+                "AppManaged": false,
+                "S3Input": {
+                    "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "S3DataType": "S3Prefix",
+                    "S3InputMode": "File",
+                    "S3DataDistributionType": "FullyReplicated",
+                    "S3CompressionType": "None"
+                }
+            }
+        ],
+        "ProcessingOutputConfig": {
+            "Outputs": [
+                {
+                    "OutputName": "output",
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "S3UploadMode": "EndOfJob"
+                    },
+                    "AppManaged": false
+                }
+            ]
+        },
+        "ProcessingJobName": "c7n-test",
+        "ProcessingResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.m4.xlarge",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 86400
+        },
+        "AppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/ubuntu18.04"
+        },
+        "NetworkConfig": {
+            "EnableInterContainerTrafficEncryption": false,
+            "EnableNetworkIsolation": false
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+        "ProcessingJobStatus": "InProgress",
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 23,
+            "second": 2,
+            "microsecond": 950000
+        },
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 23,
+            "second": 2,
+            "microsecond": 537000
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.DescribeProcessingJob_2.json b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.DescribeProcessingJob_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.DescribeProcessingJob_2.json
@@ -0,0 +1,74 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingInputs": [
+            {
+                "InputName": "input",
+                "AppManaged": false,
+                "S3Input": {
+                    "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/train",
+                    "S3DataType": "S3Prefix",
+                    "S3InputMode": "File",
+                    "S3DataDistributionType": "FullyReplicated",
+                    "S3CompressionType": "None"
+                }
+            }
+        ],
+        "ProcessingOutputConfig": {
+            "Outputs": [
+                {
+                    "OutputName": "output",
+                    "S3Output": {
+                        "S3Uri": "s3://c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "LocalPath": "/opt/ml/processing/c7n-test-s3-bucket/DEMO-automatic-model-tuning-xgboost-dm/output",
+                        "S3UploadMode": "EndOfJob"
+                    },
+                    "AppManaged": false
+                }
+            ]
+        },
+        "ProcessingJobName": "c7n-test",
+        "ProcessingResources": {
+            "ClusterConfig": {
+                "InstanceCount": 1,
+                "InstanceType": "ml.m4.xlarge",
+                "VolumeSizeInGB": 1
+            }
+        },
+        "StoppingCondition": {
+            "MaxRuntimeInSeconds": 86400
+        },
+        "AppSpecification": {
+            "ImageUri": "644160558196.dkr.ecr.us-east-1.amazonaws.com/ubuntu18.04"
+        },
+        "NetworkConfig": {
+            "EnableInterContainerTrafficEncryption": false,
+            "EnableNetworkIsolation": false
+        },
+        "RoleArn": "arn:aws:iam::644160558196:role/service-role/AmazonSageMaker-ExecutionRole-20240319T150889",
+        "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+        "ProcessingJobStatus": "InProgress",
+        "LastModifiedTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 23,
+            "second": 2,
+            "microsecond": 950000
+        },
+        "CreationTime": {
+            "__class__": "datetime",
+            "year": 2024,
+            "month": 4,
+            "day": 17,
+            "hour": 10,
+            "minute": 23,
+            "second": 2,
+            "microsecond": 537000
+        },
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListProcessingJobs_1.json b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListProcessingJobs_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListProcessingJobs_1.json
@@ -0,0 +1,33 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingJobSummaries": [
+            {
+                "ProcessingJobName": "c7n-test",
+                "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 23,
+                    "second": 2,
+                    "microsecond": 537000
+                },
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 23,
+                    "second": 2,
+                    "microsecond": 950000
+                },
+                "ProcessingJobStatus": "InProgress"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListProcessingJobs_2.json b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListProcessingJobs_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListProcessingJobs_2.json
@@ -0,0 +1,33 @@
+{
+    "status_code": 200,
+    "data": {
+        "ProcessingJobSummaries": [
+            {
+                "ProcessingJobName": "c7n-test",
+                "ProcessingJobArn": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+                "CreationTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 23,
+                    "second": 2,
+                    "microsecond": 537000
+                },
+                "LastModifiedTime": {
+                    "__class__": "datetime",
+                    "year": 2024,
+                    "month": 4,
+                    "day": 17,
+                    "hour": 10,
+                    "minute": 23,
+                    "second": 2,
+                    "microsecond": 950000
+                },
+                "ProcessingJobStatus": "InProgress"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListTags_1.json b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListTags_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListTags_1.json
@@ -0,0 +1,12 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [
+            {
+                "Key": "JobTag",
+                "Value": "JobTagValue"
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListTags_2.json b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListTags_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/api.sagemaker.ListTags_2.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "Tags": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.GetResources_1.json b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.GetResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.GetResources_1.json
@@ -0,0 +1,8 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.GetResources_2.json b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.GetResources_2.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.GetResources_2.json
@@ -0,0 +1,18 @@
+{
+    "status_code": 200,
+    "data": {
+        "PaginationToken": "",
+        "ResourceTagMappingList": [
+            {
+                "ResourceARN": "arn:aws:sagemaker:us-east-1:644160558196:processing-job/c7n-test",
+                "Tags": [
+                    {
+                        "Key": "JobTag",
+                        "Value": "JobTagValue"
+                    }
+                ]
+            }
+        ],
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.TagResources_1.json b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.TagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.TagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.UntagResources_1.json b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.UntagResources_1.json
new file mode 100644
--- /dev/null
+++ b/tests/data/placebo/test_sagemaker_processing_job_tag/tagging.UntagResources_1.json
@@ -0,0 +1,7 @@
+{
+    "status_code": 200,
+    "data": {
+        "FailedResourcesMap": {},
+        "ResponseMetadata": {}
+    }
+}
\ No newline at end of file
diff --git a/tests/test_sagemaker.py b/tests/test_sagemaker.py
--- a/tests/test_sagemaker.py
+++ b/tests/test_sagemaker.py
@@ -671,6 +671,152 @@ def test_tag_sagemaker_auto_ml_job(self):
         assert "JobTag" not in [tag["Key"] for tag in tags]
 
 
+class TestSagemakerCompilationJob(BaseTest):
+
+    def test_sagemaker_compilation_job_query(self):
+        session_factory = self.replay_flight_data("test_sagemaker_compilation_job_query")
+        p = self.load_policy(
+            {
+                "name": "query-compilation-jobs",
+                "resource": "sagemaker-compilation-job",
+                "query": [{"StatusEquals": "FAILED"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+
+    def test_tag_sagemaker_compilation_job(self):
+        session_factory = self.replay_flight_data("test_sagemaker_compilation_job_tag")
+        p = self.load_policy(
+            {
+                "name": "tag-compilation-job",
+                "resource": "sagemaker-compilation-job",
+                "filters": [{"tag:JobTag": "absent"}],
+                "actions": [{"type": "tag", "key": "JobTag", "value": "JobTagValue"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        client = session_factory(region="us-east-1").client("sagemaker")
+        tags = client.list_tags(ResourceArn=resources[0]["CompilationJobArn"])["Tags"]
+        self.assertEqual([tags[0]["Key"], tags[0]["Value"]], ["JobTag", "JobTagValue"])
+
+        p = self.load_policy(
+            {
+                "name": "remove-compilation-job-tag",
+                "resource": "sagemaker-compilation-job",
+                "filters": [{"tag:JobTag": "JobTagValue"}],
+                "actions": [{"type": "remove-tag", "tags": ["JobTag"]}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        tags = client.list_tags(ResourceArn=resources[0]["CompilationJobArn"])["Tags"]
+        assert "JobTag" not in [tag["Key"] for tag in tags]
+
+    def test_stop_sagemaker_compilation_job(self):
+        session_factory = self.replay_flight_data("test_sagemaker_compilation_job_stop")
+        client = session_factory(region="us-east-1").client("sagemaker")
+        p = self.load_policy(
+            {
+                "name": "stop-compilation-job",
+                "resource": "sagemaker-compilation-job",
+                "filters": [
+                    {
+                        "type": "value",
+                        "key": "CompilationJobName",
+                        "value": "c7n",
+                        "op": "contains",
+                    }
+                ],
+                "actions": [{"type": "stop"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        job = client.describe_compilation_job(
+            CompilationJobName=resources[0]["CompilationJobName"]
+        )
+        self.assertEqual(job["CompilationJobStatus"], "STOPPING")
+
+
+class TestSagemakerProcessingJob(BaseTest):
+
+    def test_sagemaker_processing_job_query(self):
+        session_factory = self.replay_flight_data("test_sagemaker_processing_job_query")
+        p = self.load_policy(
+            {
+                "name": "query-processing-jobs",
+                "resource": "sagemaker-processing-job",
+                "query": [{"StatusEquals": "Failed"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+
+    def test_tag_sagemaker_processing_job(self):
+        session_factory = self.replay_flight_data("test_sagemaker_processing_job_tag")
+        p = self.load_policy(
+            {
+                "name": "tag-processing-job",
+                "resource": "sagemaker-processing-job",
+                "filters": [{"tag:JobTag": "absent"}],
+                "actions": [{"type": "tag", "key": "JobTag", "value": "JobTagValue"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        client = session_factory(region="us-east-1").client("sagemaker")
+        tags = client.list_tags(ResourceArn=resources[0]["ProcessingJobArn"])["Tags"]
+        self.assertEqual([tags[0]["Key"], tags[0]["Value"]], ["JobTag", "JobTagValue"])
+
+        p = self.load_policy(
+            {
+                "name": "remove-processing-job-tag",
+                "resource": "sagemaker-processing-job",
+                "filters": [{"tag:JobTag": "JobTagValue"}],
+                "actions": [{"type": "remove-tag", "tags": ["JobTag"]}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        tags = client.list_tags(ResourceArn=resources[0]["ProcessingJobArn"])["Tags"]
+        assert "JobTag" not in [tag["Key"] for tag in tags]
+
+    def test_stop_sagemaker_processing_job(self):
+        session_factory = self.replay_flight_data("test_sagemaker_processing_job_stop")
+        client = session_factory(region="us-east-1").client("sagemaker")
+        p = self.load_policy(
+            {
+                "name": "stop-processing-job",
+                "resource": "sagemaker-processing-job",
+                "filters": [
+                    {
+                        "type": "value",
+                        "key": "ProcessingJobName",
+                        "value": "c7n",
+                        "op": "contains",
+                    }
+                ],
+                "actions": [{"type": "stop"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        job = client.describe_processing_job(
+            ProcessingJobName=resources[0]["ProcessingJobName"]
+        )
+        self.assertEqual(job["ProcessingJobStatus"], "Stopping")
+
+
 class TestSagemakerEndpoint(BaseTest):
 
     def test_sagemaker_endpoints(self):
@@ -1089,3 +1235,169 @@ def test_cluster_security_group(self):
         resources = p.run()
         self.assertEqual(len(resources), 1)
         self.assertEqual(resources[0]["ClusterName"], c)
+
+
+class TestDataQualityJobDefinition(BaseTest):
+
+    def test_sagemaker_data_quality_job_definition_delete(self):
+        session_factory = self.replay_flight_data(
+            "test_sagemaker_data_quality_job_definition_delete"
+        )
+        client = session_factory(region="us-east-1").client("sagemaker")
+        p = self.load_policy(
+            {
+                "name": "delete-data-quality-job-definition",
+                "resource": "sagemaker-data-quality-job-definition",
+                "filters": [{"JobDefinitionName": "c7n-test"}],
+                "actions": [{"type": "delete"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        job_defs = client.list_data_quality_job_definitions().get("JobDefinitionSummaries")
+        self.assertEqual(job_defs, [])
+
+    def test_tag_data_quality_job_definition(self):
+        session_factory = self.replay_flight_data("test_sagemaker_data_quality_job_definition_tag")
+        p = self.load_policy(
+            {
+                "name": "tag-data-quality-job-definition",
+                "resource": "sagemaker-data-quality-job-definition",
+                "filters": [{"tag:Owner": "absent"}],
+                "actions": [{"type": "tag", "key": "Owner", "value": "c7n"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        client = session_factory(region="us-east-1").client("sagemaker")
+        tags = client.list_tags(ResourceArn=resources[0]["JobDefinitionArn"])["Tags"]
+        self.assertEqual(tags[0]['Key'], 'Owner')
+        self.assertEqual(tags[0]['Value'], 'c7n')
+
+        p = self.load_policy(
+            {
+                "name": "remove-data-quality-job-definition-tag",
+                "resource": "sagemaker-data-quality-job-definition",
+                "filters": [{"tag:Owner": "c7n"}],
+                "actions": [{"type": "remove-tag", "tags": ["Owner"]}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        tags = client.list_tags(ResourceArn=resources[0]["JobDefinitionArn"])["Tags"]
+        self.assertEqual(len(tags), 0)
+
+
+class TestModelExplainabilityJobDefinition(BaseTest):
+
+    def test_sagemaker_model_explainability_job_definition_delete(self):
+        session_factory = self.replay_flight_data(
+            "test_sagemaker_model_explainability_job_definition_delete"
+        )
+        client = session_factory(region="us-east-1").client("sagemaker")
+        p = self.load_policy(
+            {
+                "name": "delete-model-explainability-job-definition",
+                "resource": "sagemaker-model-explainability-job-definition",
+                "filters": [{"JobDefinitionName": "c7n-test"}],
+                "actions": [{"type": "delete"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        job_defs = client.list_model_explainability_job_definitions().get("JobDefinitionSummaries")
+        self.assertEqual(job_defs, [])
+
+    def test_tag_model_explainability_job_definition(self):
+        session_factory = self.replay_flight_data(
+            "test_sagemaker_model_explainability_job_definition_tag"
+        )
+        p = self.load_policy(
+            {
+                "name": "tag-model-explainability-job-definition",
+                "resource": "sagemaker-model-explainability-job-definition",
+                "filters": [{"tag:Owner": "absent"}],
+                "actions": [{"type": "tag", "key": "Owner", "value": "c7n"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        client = session_factory(region="us-east-1").client("sagemaker")
+        tags = client.list_tags(ResourceArn=resources[0]["JobDefinitionArn"])["Tags"]
+        self.assertEqual(tags[0]['Key'], 'Owner')
+        self.assertEqual(tags[0]['Value'], 'c7n')
+
+        p = self.load_policy(
+            {
+                "name": "remove-model-explainability-job-definition-tag",
+                "resource": "sagemaker-model-explainability-job-definition",
+                "filters": [{"tag:Owner": "c7n"}],
+                "actions": [{"type": "remove-tag", "tags": ["Owner"]}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        tags = client.list_tags(ResourceArn=resources[0]["JobDefinitionArn"])["Tags"]
+        self.assertEqual(len(tags), 0)
+
+
+class TestModelQualityJobDefinition(BaseTest):
+
+    def test_sagemaker_model_quality_job_definition_delete(self):
+        session_factory = self.replay_flight_data(
+            "test_sagemaker_model_quality_job_definition_delete"
+        )
+        client = session_factory(region="us-east-1").client("sagemaker")
+        p = self.load_policy(
+            {
+                "name": "delete-model-quality-job-definition",
+                "resource": "sagemaker-model-quality-job-definition",
+                "filters": [{"JobDefinitionName": "c7n-test"}],
+                "actions": [{"type": "delete"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        job_defs = client.list_model_quality_job_definitions().get("JobDefinitionSummaries")
+        self.assertEqual(job_defs, [])
+
+    def test_tag_model_quality_job_definition(self):
+        session_factory = self.replay_flight_data(
+            "test_sagemaker_model_quality_job_definition_tag"
+        )
+        p = self.load_policy(
+            {
+                "name": "tag-model-quality-job-definition",
+                "resource": "sagemaker-model-quality-job-definition",
+                "filters": [{"tag:Owner": "absent"}],
+                "actions": [{"type": "tag", "key": "Owner", "value": "c7n"}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        client = session_factory(region="us-east-1").client("sagemaker")
+        tags = client.list_tags(ResourceArn=resources[0]["JobDefinitionArn"])["Tags"]
+        self.assertEqual(tags[0]['Key'], 'Owner')
+        self.assertEqual(tags[0]['Value'], 'c7n')
+
+        p = self.load_policy(
+            {
+                "name": "remove-model-quality-job-definition-tag",
+                "resource": "sagemaker-model-quality-job-definition",
+                "filters": [{"tag:Owner": "c7n"}],
+                "actions": [{"type": "remove-tag", "tags": ["Owner"]}],
+            },
+            session_factory=session_factory,
+        )
+        resources = p.run()
+        self.assertEqual(len(resources), 1)
+        tags = client.list_tags(ResourceArn=resources[0]["JobDefinitionArn"])["Tags"]
+        self.assertEqual(len(tags), 0)