diff --git a/lib/types/workload.go b/lib/types/workload.go index dfd6e9d..6171a1e 100644 --- a/lib/types/workload.go +++ b/lib/types/workload.go @@ -52,7 +52,7 @@ type AWSWorkloadConfig struct { ExternalID *uuid.UUID `json:"external_id" yaml:"external_id"` ExtraClusterOidcUrls []string `json:"extra_cluster_oidc_urls" yaml:"extra_cluster_oidc_urls"` ExtraPostgresDbs []string `json:"extra_postgres_dbs" yaml:"extra_postgres_dbs"` - FsxOpenzfsDailyAutomaticBackupStartTime string `json:"fsx_openzfs_daily_automatic_backup_start_time" yaml:"fsx_openzfs_daily_automatic_backup_start_time"` + FsxOpenzfsDailyAutomaticBackupStartTime *string `json:"fsx_openzfs_daily_automatic_backup_start_time" yaml:"fsx_openzfs_daily_automatic_backup_start_time"` FsxOpenzfsMultiAz bool `json:"fsx_openzfs_multi_az" yaml:"fsx_openzfs_multi_az"` FsxOpenzfsOverrideDeploymentType *string `json:"fsx_openzfs_override_deployment_type" yaml:"fsx_openzfs_override_deployment_type"` FsxOpenzfsStorageCapacity int `json:"fsx_openzfs_storage_capacity" yaml:"fsx_openzfs_storage_capacity"` diff --git a/python-pulumi/src/ptd/pulumi_resources/aws_fsx_openzfs_multi.py b/python-pulumi/src/ptd/pulumi_resources/aws_fsx_openzfs_multi.py index cace791..a202e45 100644 --- a/python-pulumi/src/ptd/pulumi_resources/aws_fsx_openzfs_multi.py +++ b/python-pulumi/src/ptd/pulumi_resources/aws_fsx_openzfs_multi.py @@ -11,7 +11,7 @@ class AWSFsxOpenZfsMultiArgs: automatic_backup_retention_days: pulumi.Input[int] copy_tags_to_backups: pulumi.Input[bool] copy_tags_to_volumes: pulumi.Input[bool] - daily_automatic_backup_start_time: pulumi.Input[str] + daily_automatic_backup_start_time: pulumi.Input[str] | None deployment_type: pulumi.Input[str] root_volume_configuration: AWSFsxOpenZfsMultiRootVolumeConfigurationArgs route_table_ids: list[str] | list[pulumi.Output[str]] @@ -85,6 +85,15 @@ def __init__( # Use the first subnet as preferred for MULTI_AZ preferred_subnet_id = props.subnet_ids[0] + # Only pass daily_automatic_backup_start_time if it has a valid value. + # AWS doesn't return this field properly on refresh, causing state corruption + # with empty strings that fail validation. By making it conditional, we avoid + # the validation error and let AWS use its default if the state is corrupted. + daily_backup_time = props.daily_automatic_backup_start_time + if daily_backup_time is not None and len(daily_backup_time) != 5: + # Invalid value (likely empty string from corrupted state), don't pass it + daily_backup_time = None + self.file_system = aws.fsx.OpenZfsFileSystem( f"{name}-filesystem", automatic_backup_retention_days=props.automatic_backup_retention_days, @@ -97,7 +106,7 @@ def __init__( throughput_capacity=props.throughput_capacity, copy_tags_to_backups=props.copy_tags_to_backups, copy_tags_to_volumes=props.copy_tags_to_volumes, - daily_automatic_backup_start_time=props.daily_automatic_backup_start_time, + daily_automatic_backup_start_time=daily_backup_time, route_table_ids=props.route_table_ids, root_volume_configuration=root_volume_configuration, tags=props.tags, diff --git a/python-pulumi/src/ptd/pulumi_resources/aws_workload_persistent.py b/python-pulumi/src/ptd/pulumi_resources/aws_workload_persistent.py index e46635c..16128f2 100644 --- a/python-pulumi/src/ptd/pulumi_resources/aws_workload_persistent.py +++ b/python-pulumi/src/ptd/pulumi_resources/aws_workload_persistent.py @@ -866,10 +866,16 @@ def _define_fsx_openzfs(self) -> None: ) else: + # Sanitize daily_automatic_backup_start_time - AWS doesn't return this field + # properly on refresh, causing state corruption with empty strings. + daily_backup_time = self.workload.cfg.fsx_openzfs_daily_automatic_backup_start_time + if daily_backup_time is not None and len(daily_backup_time) != 5: + daily_backup_time = None + self.fsx_openzfs_fs = aws.fsx.OpenZfsFileSystem( self.workload.compound_name, automatic_backup_retention_days=30, - daily_automatic_backup_start_time=self.workload.cfg.fsx_openzfs_daily_automatic_backup_start_time, + daily_automatic_backup_start_time=daily_backup_time, preferred_subnet_id=(subnet_ids[0] if deployment_type.startswith("MULTI") else None), subnet_ids=subnet_ids, deployment_type=deployment_type,