Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### **Changed**

## v3.2.7

### **Added**

- added optional `custom_tags` parameter to all modules for customer-provided tag support

## v3.2.6

### **Changed**
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.2.6
3.2.7
4 changes: 4 additions & 0 deletions modules/eks/ray-cluster/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@
for tag_key, tag_value in app_settings.parameters.tags.items():
Tags.of(app).add(tag_key, tag_value)

if app_settings.parameters.custom_tags:
for tag_key, tag_value in app_settings.parameters.custom_tags.items():
Tags.of(app).add(tag_key, tag_value)

Tags.of(app).add("SeedFarmerDeploymentName", app_settings.settings.deployment_name)
Tags.of(app).add("SeedFarmerModuleName", app_settings.settings.module_name)
Tags.of(app).add("SeedFarmerProjectName", app_settings.settings.project_name)
Expand Down
1 change: 1 addition & 0 deletions modules/eks/ray-cluster/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class SeedFarmerParameters(CdkBaseSettings):
worker_labels: Dict[str, str] = Field(default={})
permissions_boundary_name: Optional[str] = Field(default=None)
tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)


class SeedFarmerSettings(CdkBaseSettings):
Expand Down
5 changes: 5 additions & 0 deletions modules/eks/ray-cluster/tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,8 @@ def test_eks_cluster_name(stack_defaults):

with pytest.raises(ValidationError):
import app # noqa: F401


def test_app_with_custom_tags(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
4 changes: 4 additions & 0 deletions modules/eks/ray-operator/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@
for tag_key, tag_value in app_settings.parameters.tags.items():
Tags.of(app).add(tag_key, tag_value)

if app_settings.parameters.custom_tags:
for tag_key, tag_value in app_settings.parameters.custom_tags.items():
Tags.of(app).add(tag_key, tag_value)

Tags.of(app).add("SeedFarmerDeploymentName", app_settings.settings.deployment_name)
Tags.of(app).add("SeedFarmerModuleName", app_settings.settings.module_name)
Tags.of(app).add("SeedFarmerProjectName", app_settings.settings.project_name)
Expand Down
1 change: 1 addition & 0 deletions modules/eks/ray-operator/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class SeedFarmerParameters(CdkBaseSettings):
data_bucket_name: Optional[str] = Field(default=None)
permissions_boundary_name: Optional[str] = Field(default=None)
tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)


class SeedFarmerSettings(CdkBaseSettings):
Expand Down
5 changes: 5 additions & 0 deletions modules/eks/ray-operator/tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,8 @@ def test_eks_cluster_name(stack_defaults):

with pytest.raises(ValidationError):
import app # noqa: F401


def test_app_with_custom_tags(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
4 changes: 4 additions & 0 deletions modules/eks/ray-orchestrator/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@
for tag_key, tag_value in app_settings.parameters.tags.items():
Tags.of(app).add(tag_key, tag_value)

if app_settings.parameters.custom_tags:
for tag_key, tag_value in app_settings.parameters.custom_tags.items():
Tags.of(app).add(tag_key, tag_value)

Tags.of(app).add("SeedFarmerDeploymentName", app_settings.settings.deployment_name)
Tags.of(app).add("SeedFarmerModuleName", app_settings.settings.module_name)
Tags.of(app).add("SeedFarmerProjectName", app_settings.settings.project_name)
Expand Down
1 change: 1 addition & 0 deletions modules/eks/ray-orchestrator/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class SeedFarmerParameters(CdkBaseSettings):
dra_export_path: str = Field(default="/ray/export/")
permissions_boundary_name: Optional[str] = Field(default=None)
tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)


class SeedFarmerSettings(CdkBaseSettings):
Expand Down
5 changes: 5 additions & 0 deletions modules/eks/ray-orchestrator/tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,8 @@ def test_eks_cluster_name(stack_defaults):

with pytest.raises(ValidationError):
import app # noqa: F401


def test_app_with_custom_tags(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
8 changes: 8 additions & 0 deletions modules/sagemaker/sagemaker-ground-truth-labeling/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@

aws_cdk.Aspects.of(app).add(cdk_nag.AwsSolutionsChecks(log_ignores=True))

if app_settings.module_settings.tags:
for tag_key, tag_value in app_settings.module_settings.tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

if app_settings.module_settings.custom_tags:
for tag_key, tag_value in app_settings.module_settings.custom_tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

aws_cdk.Tags.of(app).add("SeedFarmerDeploymentName", app_settings.seedfarmer_settings.deployment_name)
aws_cdk.Tags.of(app).add("SeedFarmerModuleName", app_settings.seedfarmer_settings.module_name)
aws_cdk.Tags.of(app).add("SeedFarmerProjectName", app_settings.seedfarmer_settings.project_name)
Expand Down
2 changes: 2 additions & 0 deletions modules/sagemaker/sagemaker-ground-truth-labeling/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ class ModuleSettings(CdkBaseSettings):
verification_task_price: Dict[str, Dict[str, int]] = Field(default={})
labeling_workflow_schedule: str = Field(default="cron(0 12 * * ? *)")
permissions_boundary_name: Optional[str] = Field(default=None)
tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)


class SeedFarmerSettings(CdkBaseSettings):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,8 @@ def test_labeling_task_keywords() -> None:

with pytest.raises(ValidationError):
import app # noqa: F401


def test_app_with_custom_tags() -> None:
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
4 changes: 4 additions & 0 deletions modules/sagemaker/sagemaker-model-monitoring/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
for tag_key, tag_value in app_settings.module_settings.tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

if app_settings.module_settings.custom_tags:
for tag_key, tag_value in app_settings.module_settings.custom_tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

aws_cdk.Tags.of(app).add("SeedFarmerDeploymentName", app_settings.seedfarmer_settings.deployment_name)
aws_cdk.Tags.of(app).add("SeedFarmerModuleName", app_settings.seedfarmer_settings.module_name)
aws_cdk.Tags.of(app).add("SeedFarmerProjectName", app_settings.seedfarmer_settings.project_name)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ class ModuleSettings(CdkBaseSettings):

permissions_boundary_name: Optional[str] = Field(default=None)
tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)


class SeedFarmerSettings(CdkBaseSettings):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, List, Optional
from typing import Any, Dict, List, Optional

import constructs
from aws_cdk import Stack, Tags
Expand Down Expand Up @@ -91,6 +91,7 @@ def __init__(
model_explainability_probability_attribute: Optional[str],
model_explainability_schedule_expression: str,
permissions_boundary_name: Optional[str] = None,
custom_tags: Optional[Dict[str, str]] = None,
**kwargs: Any,
) -> None:
super().__init__(scope, id, **kwargs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,8 @@ def test_all_disabled(stack_defaults):

with pytest.raises(Exception, match="At least one of enable_data_quality_monitor, .+ must be True"):
import app # noqa: F401


def test_app_with_custom_tags(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def stack_model_package_input(
enable_model_explainability_monitor=enable_model_explainability_monitor,
baseline_training_data_s3_uri=baseline_training_data_s3_uri,
baseline_output_data_s3_uri=baseline_output_data_s3_uri,
custom_tags={"CustomerTag": "test-value"},
)

return stack.SageMakerModelMonitoringStack(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class SeedFarmerParameters(CdkBaseSettings):
role_arn: Optional[str] = Field(default=None)
permissions_boundary_name: Optional[str] = Field(default=None)
tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)

@field_validator("notebook_name")
@classmethod
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ def __init__(
additional_code_repositories: Optional[List[str]] = None,
role_arn: Optional[str] = None,
tags: Optional[Dict[str, str]] = None,
custom_tags: Optional[Dict[str, str]] = None,
permissions_boundary_name: Optional[str] = None,
**kwargs: Any,
) -> None:
Expand Down Expand Up @@ -91,6 +92,7 @@ def __init__(
self.kms_key_arn = kms_key_arn
self.role_arn = role_arn
self.additional_tags = tags
self.custom_tags = custom_tags

self.additional_code_repositories = (
["https://github.com/aws/amazon-sagemaker-examples.git"]
Expand Down Expand Up @@ -149,6 +151,8 @@ def setup_tags(self) -> None:
Tags.of(self).add("sagemaker:deployment-stage", Stack.of(self).stack_name)
for k, v in (self.additional_tags or {}).items():
Tags.of(self).add(k, v)
for k, v in (self.custom_tags or {}).items():
Tags.of(self).add(k, v)

def setup_outputs(self) -> None:
"""Setups outputs and metadata."""
Expand Down
5 changes: 5 additions & 0 deletions modules/sagemaker/sagemaker-notebook/tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,8 @@ def stack_defaults():

def test_app(stack_defaults):
import app # noqa: F401


def test_app_with_custom_tags(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
4 changes: 4 additions & 0 deletions modules/sagemaker/sagemaker-studio/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@
for tag_key, tag_value in app_settings.parameters.tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

if app_settings.parameters.custom_tags:
for tag_key, tag_value in app_settings.parameters.custom_tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

aws_cdk.Tags.of(app).add("SeedFarmerDeploymentName", app_settings.settings.deployment_name)
aws_cdk.Tags.of(app).add("SeedFarmerModuleName", app_settings.settings.module_name)
aws_cdk.Tags.of(app).add("SeedFarmerProjectName", app_settings.settings.project_name)
Expand Down
1 change: 1 addition & 0 deletions modules/sagemaker/sagemaker-studio/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class SeedFarmerParameters(CdkBaseSettings):
mlflow_artifact_store_bucket_prefix: str = Field(default="/")

tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)


class SeedFarmerSettings(CdkBaseSettings):
Expand Down
5 changes: 5 additions & 0 deletions modules/sagemaker/sagemaker-studio/tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,8 @@ def test_default_synthesizer(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_LOOKUP_ROLE_ARN"] = "dummy"

import app as my_app # noqa: F401


def test_app_with_custom_tags(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
8 changes: 8 additions & 0 deletions modules/sagemaker/sagemaker-templates/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@
batch_inference_project_settings=app_settings.batch_inference_project_settings,
)

if app_settings.module_settings.tags:
for tag_key, tag_value in app_settings.module_settings.tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

if app_settings.module_settings.custom_tags:
for tag_key, tag_value in app_settings.module_settings.custom_tags.items():
aws_cdk.Tags.of(app).add(tag_key, tag_value)

aws_cdk.Tags.of(app).add("SeedFarmerDeploymentName", app_settings.seedfarmer_settings.deployment_name)
aws_cdk.Tags.of(app).add("SeedFarmerModuleName", app_settings.seedfarmer_settings.module_name)
aws_cdk.Tags.of(app).add("SeedFarmerProjectName", app_settings.seedfarmer_settings.project_name)
Expand Down
1 change: 1 addition & 0 deletions modules/sagemaker/sagemaker-templates/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ class ModuleSettings(CdkBaseSettings):
permissions_boundary_name: Optional[str] = Field(default=None)
s3_access_logs_bucket_arn: Optional[str] = Field(default=None)
tags: Optional[Dict[str, str]] = Field(default=None)
custom_tags: Optional[Dict[str, str]] = Field(default=None)


class XGBoostAbaloneProjectSettings(CdkBaseSettings):
Expand Down
3 changes: 2 additions & 1 deletion modules/sagemaker/sagemaker-templates/stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0

import os
from typing import Any, List, Optional, Tuple, cast
from typing import Any, Dict, List, Optional, Tuple, cast

import cdk_nag
from aws_cdk import BundlingOptions, BundlingOutput, DockerImage, Stack
Expand Down Expand Up @@ -52,6 +52,7 @@ def __init__(
permissions_boundary_name: Optional[str] = None,
s3_access_logs_bucket_arn: Optional[str] = None,
cross_account_external_id: Optional[str] = None,
custom_tags: Optional[Dict[str, str]] = None,
**kwargs: Any,
) -> None:
super().__init__(scope, id, **kwargs)
Expand Down
5 changes: 5 additions & 0 deletions modules/sagemaker/sagemaker-templates/tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,8 @@ def stack_defaults():

def test_app() -> None:
import app # noqa: F401


def test_app_with_custom_tags(stack_defaults):
os.environ["SEEDFARMER_PARAMETER_CUSTOM_TAGS"] = '{"CustomerTag": "test-value"}'
import app # noqa: F401
Loading