diff --git a/src/dataprotection/HISTORY.rst b/src/dataprotection/HISTORY.rst index 241900bff22..5ddc27e0e00 100644 --- a/src/dataprotection/HISTORY.rst +++ b/src/dataprotection/HISTORY.rst @@ -2,6 +2,11 @@ Release History =============== +1.10.0 +++++++ +* Bumped API version to 2026-03-01 for backup-instance create, update, validate-for-backup, and validate-for-update commands. +* `az dataprotection backup-instance initialize-backupconfig`: New parameters `--auto-protection` and `--exclusion-prefixes` to enable automatic protection of new blob containers for AzureBlob and AzureDataLakeStorage datasource types, with optional exclusion rules by container name prefix. + 1.9.0 +++++ * `az dataprotection enable-backup trigger`: New command to enable backup for AKS clusters with a single command. Supports preset backup strategies (Week, Month, DisasterRecovery) and Custom strategy with user-provided configuration. diff --git a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_create.py b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_create.py index cb58a7bdd2d..feec1b2a769 100644 --- a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_create.py +++ b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_create.py @@ -17,14 +17,14 @@ class Create(AAZCommand): """Configure backup for a resource in a backup vault - :example: create a backup instance in a backup vault + :example: creates a backup instance in a backup vault az dataprotection backup-instance create -g MyResourceGroup --vault-name MyVault --backup-instance backupinstance.json """ _aaz_info = { - "version": "2025-07-01", + "version": "2026-03-01", "resources": [ - ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/backupinstances/{}", "2025-07-01"], + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/backupinstances/{}", "2026-03-01"], ] } @@ -87,6 +87,58 @@ def _build_args_base_resource_properties_create(cls, _schema): _schema.default_resource_properties = cls._args_base_resource_properties_create.default_resource_properties + _args_blob_backup_rule_based_auto_protection_settings_create = None + + @classmethod + def _build_args_blob_backup_rule_based_auto_protection_settings_create(cls, _schema): + if cls._args_blob_backup_rule_based_auto_protection_settings_create is not None: + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_create.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + return + + cls._args_blob_backup_rule_based_auto_protection_settings_create = AAZObjectArg() + + blob_backup_rule_based_auto_protection_settings_create = cls._args_blob_backup_rule_based_auto_protection_settings_create + blob_backup_rule_based_auto_protection_settings_create.enabled = AAZBoolArg( + options=["enabled"], + help="Flag to enable whether auto protection.", + required=True, + ) + blob_backup_rule_based_auto_protection_settings_create.rules = AAZListArg( + options=["rules"], + help="Rules are evaluated in the order provided. Inclusion adds candidates; exclusion removes candidates. If no rules are present, all containers are considered eligible when enabled = true.", + ) + + rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + rules.Element = AAZObjectArg() + + _element = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules.Element + _element.mode = AAZStrArg( + options=["mode"], + help="Exclude removes candidates (after inclusion)", + required=True, + enum={"Exclude": "Exclude"}, + ) + _element.object_type = AAZStrArg( + options=["object-type"], + help="Type of the specific object - used for deserializing", + required=True, + ) + _element.pattern = AAZStrArg( + options=["pattern"], + help="The string pattern to evaluate against container names. For now this accepts literal strings only (no wildcards or regex).", + required=True, + ) + _element.type = AAZStrArg( + options=["type"], + help="Pattern type: Prefix, only pattern type supported for now.", + required=True, + enum={"Prefix": "Prefix"}, + ) + + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_create.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + def _execute_operations(self): self.pre_operations() yield self.BackupInstancesCreateOrUpdate(ctx=self.ctx)() @@ -172,7 +224,7 @@ def url_parameters(self): def query_parameters(self): parameters = { **self.serialize_query_param( - "api-version", "2025-07-01", + "api-version", "2026-03-01", required=True, ), } @@ -406,6 +458,13 @@ def _build_schema_on_200_201(cls): containers_list = cls._schema_on_200_201.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "AdlsBlobBackupDatasourceParameters").containers_list containers_list.Element = AAZStrType() + disc_adls_blob_backup_datasource_parameters_for_auto_protection = cls._schema_on_200_201.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "AdlsBlobBackupDatasourceParametersForAutoProtection") + disc_adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectType( + serialized_name="autoProtectionSettings", + flags={"required": True}, + ) + _CreateHelper._build_schema_blob_backup_rule_based_auto_protection_settings_read(disc_adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + disc_blob_backup_datasource_parameters = cls._schema_on_200_201.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "BlobBackupDatasourceParameters") disc_blob_backup_datasource_parameters.containers_list = AAZListType( serialized_name="containersList", @@ -415,6 +474,13 @@ def _build_schema_on_200_201(cls): containers_list = cls._schema_on_200_201.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "BlobBackupDatasourceParameters").containers_list containers_list.Element = AAZStrType() + disc_blob_backup_datasource_parameters_for_auto_protection = cls._schema_on_200_201.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "BlobBackupDatasourceParametersForAutoProtection") + disc_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectType( + serialized_name="autoProtectionSettings", + flags={"required": True}, + ) + _CreateHelper._build_schema_blob_backup_rule_based_auto_protection_settings_read(disc_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + disc_kubernetes_cluster_backup_datasource_parameters = cls._schema_on_200_201.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "KubernetesClusterBackupDatasourceParameters") disc_kubernetes_cluster_backup_datasource_parameters.backup_hook_references = AAZListType( serialized_name="backupHookReferences", @@ -535,6 +601,25 @@ def _build_schema_base_resource_properties_create(cls, _builder): _builder.set_const("objectType", "DefaultResourceProperties", AAZStrType, ".default_resource_properties", typ_kwargs={"flags": {"required": True}}) _builder.discriminate_by("objectType", "DefaultResourceProperties") + @classmethod + def _build_schema_blob_backup_rule_based_auto_protection_settings_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("enabled", AAZBoolType, ".enabled", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("objectType", "BlobBackupRuleBasedAutoProtectionSettings", AAZStrType, ".", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("rules", AAZListType, ".rules") + + rules = _builder.get(".rules") + if rules is not None: + rules.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".rules[]") + if _elements is not None: + _elements.set_prop("mode", AAZStrType, ".mode", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("objectType", AAZStrType, ".object_type", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("pattern", AAZStrType, ".pattern", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + _schema_base_resource_properties_read = None @classmethod @@ -569,6 +654,50 @@ def _build_schema_base_resource_properties_read(cls, _schema): ) ) + _schema_blob_backup_rule_based_auto_protection_settings_read = None + + @classmethod + def _build_schema_blob_backup_rule_based_auto_protection_settings_read(cls, _schema): + if cls._schema_blob_backup_rule_based_auto_protection_settings_read is not None: + _schema.enabled = cls._schema_blob_backup_rule_based_auto_protection_settings_read.enabled + _schema.object_type = cls._schema_blob_backup_rule_based_auto_protection_settings_read.object_type + _schema.rules = cls._schema_blob_backup_rule_based_auto_protection_settings_read.rules + return + + cls._schema_blob_backup_rule_based_auto_protection_settings_read = _schema_blob_backup_rule_based_auto_protection_settings_read = AAZObjectType() + + blob_backup_rule_based_auto_protection_settings_read = _schema_blob_backup_rule_based_auto_protection_settings_read + blob_backup_rule_based_auto_protection_settings_read.enabled = AAZBoolType( + flags={"required": True}, + ) + blob_backup_rule_based_auto_protection_settings_read.object_type = AAZStrType( + serialized_name="objectType", + flags={"required": True}, + ) + blob_backup_rule_based_auto_protection_settings_read.rules = AAZListType() + + rules = _schema_blob_backup_rule_based_auto_protection_settings_read.rules + rules.Element = AAZObjectType() + + _element = _schema_blob_backup_rule_based_auto_protection_settings_read.rules.Element + _element.mode = AAZStrType( + flags={"required": True}, + ) + _element.object_type = AAZStrType( + serialized_name="objectType", + flags={"required": True}, + ) + _element.pattern = AAZStrType( + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + _schema.enabled = cls._schema_blob_backup_rule_based_auto_protection_settings_read.enabled + _schema.object_type = cls._schema_blob_backup_rule_based_auto_protection_settings_read.object_type + _schema.rules = cls._schema_blob_backup_rule_based_auto_protection_settings_read.rules + _schema_inner_error_read = None @classmethod diff --git a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_update.py b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_update.py index a5e017fa011..bfaa310772a 100644 --- a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_update.py +++ b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_update.py @@ -16,9 +16,9 @@ class Update(AAZCommand): """ _aaz_info = { - "version": "2025-07-01", + "version": "2026-03-01", "resources": [ - ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/backupinstances/{}", "2025-07-01"], + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/backupinstances/{}", "2026-03-01"], ] } @@ -289,9 +289,15 @@ def _build_arguments_schema(cls, *args, **kwargs): _element.adls_blob_backup_datasource_parameters = AAZObjectArg( options=["adls-blob-backup-datasource-parameters"], ) + _element.adls_blob_backup_datasource_parameters_for_auto_protection = AAZObjectArg( + options=["adls-blob-backup-datasource-parameters-for-auto-protection"], + ) _element.blob_backup_datasource_parameters = AAZObjectArg( options=["blob-backup-datasource-parameters"], ) + _element.blob_backup_datasource_parameters_for_auto_protection = AAZObjectArg( + options=["blob-backup-datasource-parameters-for-auto-protection"], + ) _element.kubernetes_cluster_backup_datasource_parameters = AAZObjectArg( options=["kubernetes-cluster-backup-datasource-parameters"], ) @@ -307,6 +313,13 @@ def _build_arguments_schema(cls, *args, **kwargs): nullable=True, ) + adls_blob_backup_datasource_parameters_for_auto_protection = cls._args_schema.policy_info.policy_parameters.backup_datasource_parameters_list.Element.adls_blob_backup_datasource_parameters_for_auto_protection + adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectArg( + options=["auto-protection-settings"], + help="AutoProtection settings", + ) + cls._build_args_blob_backup_rule_based_auto_protection_settings_update(adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + blob_backup_datasource_parameters = cls._args_schema.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters blob_backup_datasource_parameters.containers_list = AAZListArg( options=["containers-list"], @@ -318,6 +331,13 @@ def _build_arguments_schema(cls, *args, **kwargs): nullable=True, ) + blob_backup_datasource_parameters_for_auto_protection = cls._args_schema.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters_for_auto_protection + blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectArg( + options=["auto-protection-settings"], + help="AutoProtection settings", + ) + cls._build_args_blob_backup_rule_based_auto_protection_settings_update(blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + kubernetes_cluster_backup_datasource_parameters = cls._args_schema.policy_info.policy_parameters.backup_datasource_parameters_list.Element.kubernetes_cluster_backup_datasource_parameters kubernetes_cluster_backup_datasource_parameters.backup_hook_references = AAZListArg( options=["backup-hook-references"], @@ -459,6 +479,56 @@ def _build_args_base_resource_properties_update(cls, _schema): _schema.default_resource_properties = cls._args_base_resource_properties_update.default_resource_properties + _args_blob_backup_rule_based_auto_protection_settings_update = None + + @classmethod + def _build_args_blob_backup_rule_based_auto_protection_settings_update(cls, _schema): + if cls._args_blob_backup_rule_based_auto_protection_settings_update is not None: + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_update.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_update.rules + return + + cls._args_blob_backup_rule_based_auto_protection_settings_update = AAZObjectArg() + + blob_backup_rule_based_auto_protection_settings_update = cls._args_blob_backup_rule_based_auto_protection_settings_update + blob_backup_rule_based_auto_protection_settings_update.enabled = AAZBoolArg( + options=["enabled"], + help="Flag to enable whether auto protection.", + ) + blob_backup_rule_based_auto_protection_settings_update.rules = AAZListArg( + options=["rules"], + help="Rules are evaluated in the order provided. Inclusion adds candidates; exclusion removes candidates. If no rules are present, all containers are considered eligible when enabled = true.", + nullable=True, + ) + + rules = cls._args_blob_backup_rule_based_auto_protection_settings_update.rules + rules.Element = AAZObjectArg( + nullable=True, + ) + + _element = cls._args_blob_backup_rule_based_auto_protection_settings_update.rules.Element + _element.mode = AAZStrArg( + options=["mode"], + help="Exclude removes candidates (after inclusion)", + enum={"Exclude": "Exclude"}, + ) + _element.object_type = AAZStrArg( + options=["object-type"], + help="Type of the specific object - used for deserializing", + ) + _element.pattern = AAZStrArg( + options=["pattern"], + help="The string pattern to evaluate against container names. For now this accepts literal strings only (no wildcards or regex).", + ) + _element.type = AAZStrArg( + options=["type"], + help="Pattern type: Prefix, only pattern type supported for now.", + enum={"Prefix": "Prefix"}, + ) + + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_update.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_update.rules + def _execute_operations(self): self.pre_operations() self.BackupInstancesGet(ctx=self.ctx)() @@ -541,7 +611,7 @@ def url_parameters(self): def query_parameters(self): parameters = { **self.serialize_query_param( - "api-version", "2025-07-01", + "api-version", "2026-03-01", required=True, ), } @@ -644,7 +714,7 @@ def url_parameters(self): def query_parameters(self): parameters = { **self.serialize_query_param( - "api-version", "2025-07-01", + "api-version", "2026-03-01", required=True, ), } @@ -776,10 +846,14 @@ def _update_instance(self, instance): _elements = _builder.get(".properties.policyInfo.policyParameters.backupDatasourceParametersList[]") if _elements is not None: _elements.set_const("objectType", "AdlsBlobBackupDatasourceParameters", AAZStrType, ".adls_blob_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) + _elements.set_const("objectType", "AdlsBlobBackupDatasourceParametersForAutoProtection", AAZStrType, ".adls_blob_backup_datasource_parameters_for_auto_protection", typ_kwargs={"flags": {"required": True}}) _elements.set_const("objectType", "BlobBackupDatasourceParameters", AAZStrType, ".blob_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) + _elements.set_const("objectType", "BlobBackupDatasourceParametersForAutoProtection", AAZStrType, ".blob_backup_datasource_parameters_for_auto_protection", typ_kwargs={"flags": {"required": True}}) _elements.set_const("objectType", "KubernetesClusterBackupDatasourceParameters", AAZStrType, ".kubernetes_cluster_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) _elements.discriminate_by("objectType", "AdlsBlobBackupDatasourceParameters") + _elements.discriminate_by("objectType", "AdlsBlobBackupDatasourceParametersForAutoProtection") _elements.discriminate_by("objectType", "BlobBackupDatasourceParameters") + _elements.discriminate_by("objectType", "BlobBackupDatasourceParametersForAutoProtection") _elements.discriminate_by("objectType", "KubernetesClusterBackupDatasourceParameters") disc_adls_blob_backup_datasource_parameters = _builder.get(".properties.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:AdlsBlobBackupDatasourceParameters}") @@ -790,6 +864,10 @@ def _update_instance(self, instance): if containers_list is not None: containers_list.set_elements(AAZStrType, ".") + disc_adls_blob_backup_datasource_parameters_for_auto_protection = _builder.get(".properties.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:AdlsBlobBackupDatasourceParametersForAutoProtection}") + if disc_adls_blob_backup_datasource_parameters_for_auto_protection is not None: + _UpdateHelper._build_schema_blob_backup_rule_based_auto_protection_settings_update(disc_adls_blob_backup_datasource_parameters_for_auto_protection.set_prop("autoProtectionSettings", AAZObjectType, ".adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings", typ_kwargs={"flags": {"required": True}})) + disc_blob_backup_datasource_parameters = _builder.get(".properties.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:BlobBackupDatasourceParameters}") if disc_blob_backup_datasource_parameters is not None: disc_blob_backup_datasource_parameters.set_prop("containersList", AAZListType, ".blob_backup_datasource_parameters.containers_list", typ_kwargs={"flags": {"required": True}}) @@ -798,6 +876,10 @@ def _update_instance(self, instance): if containers_list is not None: containers_list.set_elements(AAZStrType, ".") + disc_blob_backup_datasource_parameters_for_auto_protection = _builder.get(".properties.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:BlobBackupDatasourceParametersForAutoProtection}") + if disc_blob_backup_datasource_parameters_for_auto_protection is not None: + _UpdateHelper._build_schema_blob_backup_rule_based_auto_protection_settings_update(disc_blob_backup_datasource_parameters_for_auto_protection.set_prop("autoProtectionSettings", AAZObjectType, ".blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings", typ_kwargs={"flags": {"required": True}})) + disc_kubernetes_cluster_backup_datasource_parameters = _builder.get(".properties.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:KubernetesClusterBackupDatasourceParameters}") if disc_kubernetes_cluster_backup_datasource_parameters is not None: disc_kubernetes_cluster_backup_datasource_parameters.set_prop("backupHookReferences", AAZListType, ".kubernetes_cluster_backup_datasource_parameters.backup_hook_references") @@ -886,6 +968,25 @@ def _build_schema_base_resource_properties_update(cls, _builder): _builder.set_const("objectType", "DefaultResourceProperties", AAZStrType, ".default_resource_properties", typ_kwargs={"flags": {"required": True}}) _builder.discriminate_by("objectType", "DefaultResourceProperties") + @classmethod + def _build_schema_blob_backup_rule_based_auto_protection_settings_update(cls, _builder): + if _builder is None: + return + _builder.set_prop("enabled", AAZBoolType, ".enabled", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("objectType", "BlobBackupRuleBasedAutoProtectionSettings", AAZStrType, ".", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("rules", AAZListType, ".rules") + + rules = _builder.get(".rules") + if rules is not None: + rules.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".rules[]") + if _elements is not None: + _elements.set_prop("mode", AAZStrType, ".mode", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("objectType", AAZStrType, ".object_type", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("pattern", AAZStrType, ".pattern", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + _schema_backup_instance_resource_read = None @classmethod @@ -1089,6 +1190,13 @@ def _build_schema_backup_instance_resource_read(cls, _schema): containers_list = _schema_backup_instance_resource_read.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "AdlsBlobBackupDatasourceParameters").containers_list containers_list.Element = AAZStrType() + disc_adls_blob_backup_datasource_parameters_for_auto_protection = _schema_backup_instance_resource_read.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "AdlsBlobBackupDatasourceParametersForAutoProtection") + disc_adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectType( + serialized_name="autoProtectionSettings", + flags={"required": True}, + ) + cls._build_schema_blob_backup_rule_based_auto_protection_settings_read(disc_adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + disc_blob_backup_datasource_parameters = _schema_backup_instance_resource_read.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "BlobBackupDatasourceParameters") disc_blob_backup_datasource_parameters.containers_list = AAZListType( serialized_name="containersList", @@ -1098,6 +1206,13 @@ def _build_schema_backup_instance_resource_read(cls, _schema): containers_list = _schema_backup_instance_resource_read.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "BlobBackupDatasourceParameters").containers_list containers_list.Element = AAZStrType() + disc_blob_backup_datasource_parameters_for_auto_protection = _schema_backup_instance_resource_read.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "BlobBackupDatasourceParametersForAutoProtection") + disc_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectType( + serialized_name="autoProtectionSettings", + flags={"required": True}, + ) + cls._build_schema_blob_backup_rule_based_auto_protection_settings_read(disc_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + disc_kubernetes_cluster_backup_datasource_parameters = _schema_backup_instance_resource_read.properties.policy_info.policy_parameters.backup_datasource_parameters_list.Element.discriminate_by("object_type", "KubernetesClusterBackupDatasourceParameters") disc_kubernetes_cluster_backup_datasource_parameters.backup_hook_references = AAZListType( serialized_name="backupHookReferences", @@ -1246,6 +1361,50 @@ def _build_schema_base_resource_properties_read(cls, _schema): ) ) + _schema_blob_backup_rule_based_auto_protection_settings_read = None + + @classmethod + def _build_schema_blob_backup_rule_based_auto_protection_settings_read(cls, _schema): + if cls._schema_blob_backup_rule_based_auto_protection_settings_read is not None: + _schema.enabled = cls._schema_blob_backup_rule_based_auto_protection_settings_read.enabled + _schema.object_type = cls._schema_blob_backup_rule_based_auto_protection_settings_read.object_type + _schema.rules = cls._schema_blob_backup_rule_based_auto_protection_settings_read.rules + return + + cls._schema_blob_backup_rule_based_auto_protection_settings_read = _schema_blob_backup_rule_based_auto_protection_settings_read = AAZObjectType() + + blob_backup_rule_based_auto_protection_settings_read = _schema_blob_backup_rule_based_auto_protection_settings_read + blob_backup_rule_based_auto_protection_settings_read.enabled = AAZBoolType( + flags={"required": True}, + ) + blob_backup_rule_based_auto_protection_settings_read.object_type = AAZStrType( + serialized_name="objectType", + flags={"required": True}, + ) + blob_backup_rule_based_auto_protection_settings_read.rules = AAZListType() + + rules = _schema_blob_backup_rule_based_auto_protection_settings_read.rules + rules.Element = AAZObjectType() + + _element = _schema_blob_backup_rule_based_auto_protection_settings_read.rules.Element + _element.mode = AAZStrType( + flags={"required": True}, + ) + _element.object_type = AAZStrType( + serialized_name="objectType", + flags={"required": True}, + ) + _element.pattern = AAZStrType( + flags={"required": True}, + ) + _element.type = AAZStrType( + flags={"required": True}, + ) + + _schema.enabled = cls._schema_blob_backup_rule_based_auto_protection_settings_read.enabled + _schema.object_type = cls._schema_blob_backup_rule_based_auto_protection_settings_read.object_type + _schema.rules = cls._schema_blob_backup_rule_based_auto_protection_settings_read.rules + _schema_inner_error_read = None @classmethod diff --git a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_backup.py b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_backup.py index 2fe734302de..2f82f6e5633 100644 --- a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_backup.py +++ b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_backup.py @@ -22,9 +22,9 @@ class ValidateForBackup(AAZCommand): """ _aaz_info = { - "version": "2025-07-01", + "version": "2026-03-01", "resources": [ - ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/validateforbackup", "2025-07-01"], + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/validateforbackup", "2026-03-01"], ] } @@ -242,9 +242,15 @@ def _build_arguments_schema(cls, *args, **kwargs): _element.adls_blob_backup_datasource_parameters = AAZObjectArg( options=["adls-blob-backup-datasource-parameters"], ) + _element.adls_blob_backup_datasource_parameters_for_auto_protection = AAZObjectArg( + options=["adls-blob-backup-datasource-parameters-for-auto-protection"], + ) _element.blob_backup_datasource_parameters = AAZObjectArg( options=["blob-backup-datasource-parameters"], ) + _element.blob_backup_datasource_parameters_for_auto_protection = AAZObjectArg( + options=["blob-backup-datasource-parameters-for-auto-protection"], + ) _element.kubernetes_cluster_backup_datasource_parameters = AAZObjectArg( options=["kubernetes-cluster-backup-datasource-parameters"], ) @@ -259,6 +265,14 @@ def _build_arguments_schema(cls, *args, **kwargs): containers_list = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.adls_blob_backup_datasource_parameters.containers_list containers_list.Element = AAZStrArg() + adls_blob_backup_datasource_parameters_for_auto_protection = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.adls_blob_backup_datasource_parameters_for_auto_protection + adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectArg( + options=["auto-protection-settings"], + help="AutoProtection settings", + required=True, + ) + cls._build_args_blob_backup_rule_based_auto_protection_settings_create(adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + blob_backup_datasource_parameters = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters blob_backup_datasource_parameters.containers_list = AAZListArg( options=["containers-list"], @@ -269,6 +283,14 @@ def _build_arguments_schema(cls, *args, **kwargs): containers_list = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters.containers_list containers_list.Element = AAZStrArg() + blob_backup_datasource_parameters_for_auto_protection = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters_for_auto_protection + blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectArg( + options=["auto-protection-settings"], + help="AutoProtection settings", + required=True, + ) + cls._build_args_blob_backup_rule_based_auto_protection_settings_create(blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + kubernetes_cluster_backup_datasource_parameters = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.kubernetes_cluster_backup_datasource_parameters kubernetes_cluster_backup_datasource_parameters.backup_hook_references = AAZListArg( options=["backup-hook-references"], @@ -384,6 +406,58 @@ def _build_args_base_resource_properties_create(cls, _schema): _schema.default_resource_properties = cls._args_base_resource_properties_create.default_resource_properties + _args_blob_backup_rule_based_auto_protection_settings_create = None + + @classmethod + def _build_args_blob_backup_rule_based_auto_protection_settings_create(cls, _schema): + if cls._args_blob_backup_rule_based_auto_protection_settings_create is not None: + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_create.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + return + + cls._args_blob_backup_rule_based_auto_protection_settings_create = AAZObjectArg() + + blob_backup_rule_based_auto_protection_settings_create = cls._args_blob_backup_rule_based_auto_protection_settings_create + blob_backup_rule_based_auto_protection_settings_create.enabled = AAZBoolArg( + options=["enabled"], + help="Flag to enable whether auto protection.", + required=True, + ) + blob_backup_rule_based_auto_protection_settings_create.rules = AAZListArg( + options=["rules"], + help="Rules are evaluated in the order provided. Inclusion adds candidates; exclusion removes candidates. If no rules are present, all containers are considered eligible when enabled = true.", + ) + + rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + rules.Element = AAZObjectArg() + + _element = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules.Element + _element.mode = AAZStrArg( + options=["mode"], + help="Exclude removes candidates (after inclusion)", + required=True, + enum={"Exclude": "Exclude"}, + ) + _element.object_type = AAZStrArg( + options=["object-type"], + help="Type of the specific object - used for deserializing", + required=True, + ) + _element.pattern = AAZStrArg( + options=["pattern"], + help="The string pattern to evaluate against container names. For now this accepts literal strings only (no wildcards or regex).", + required=True, + ) + _element.type = AAZStrArg( + options=["type"], + help="Pattern type: Prefix, only pattern type supported for now.", + required=True, + enum={"Prefix": "Prefix"}, + ) + + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_create.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + def _execute_operations(self): self.pre_operations() yield self.BackupInstancesValidateForBackup(ctx=self.ctx)() @@ -465,7 +539,7 @@ def url_parameters(self): def query_parameters(self): parameters = { **self.serialize_query_param( - "api-version", "2025-07-01", + "api-version", "2026-03-01", required=True, ), } @@ -563,10 +637,14 @@ def content(self): _elements = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]") if _elements is not None: _elements.set_const("objectType", "AdlsBlobBackupDatasourceParameters", AAZStrType, ".adls_blob_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) + _elements.set_const("objectType", "AdlsBlobBackupDatasourceParametersForAutoProtection", AAZStrType, ".adls_blob_backup_datasource_parameters_for_auto_protection", typ_kwargs={"flags": {"required": True}}) _elements.set_const("objectType", "BlobBackupDatasourceParameters", AAZStrType, ".blob_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) + _elements.set_const("objectType", "BlobBackupDatasourceParametersForAutoProtection", AAZStrType, ".blob_backup_datasource_parameters_for_auto_protection", typ_kwargs={"flags": {"required": True}}) _elements.set_const("objectType", "KubernetesClusterBackupDatasourceParameters", AAZStrType, ".kubernetes_cluster_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) _elements.discriminate_by("objectType", "AdlsBlobBackupDatasourceParameters") + _elements.discriminate_by("objectType", "AdlsBlobBackupDatasourceParametersForAutoProtection") _elements.discriminate_by("objectType", "BlobBackupDatasourceParameters") + _elements.discriminate_by("objectType", "BlobBackupDatasourceParametersForAutoProtection") _elements.discriminate_by("objectType", "KubernetesClusterBackupDatasourceParameters") disc_adls_blob_backup_datasource_parameters = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:AdlsBlobBackupDatasourceParameters}") @@ -577,6 +655,10 @@ def content(self): if containers_list is not None: containers_list.set_elements(AAZStrType, ".") + disc_adls_blob_backup_datasource_parameters_for_auto_protection = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:AdlsBlobBackupDatasourceParametersForAutoProtection}") + if disc_adls_blob_backup_datasource_parameters_for_auto_protection is not None: + _ValidateForBackupHelper._build_schema_blob_backup_rule_based_auto_protection_settings_create(disc_adls_blob_backup_datasource_parameters_for_auto_protection.set_prop("autoProtectionSettings", AAZObjectType, ".adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings", typ_kwargs={"flags": {"required": True}})) + disc_blob_backup_datasource_parameters = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:BlobBackupDatasourceParameters}") if disc_blob_backup_datasource_parameters is not None: disc_blob_backup_datasource_parameters.set_prop("containersList", AAZListType, ".blob_backup_datasource_parameters.containers_list", typ_kwargs={"flags": {"required": True}}) @@ -585,6 +667,10 @@ def content(self): if containers_list is not None: containers_list.set_elements(AAZStrType, ".") + disc_blob_backup_datasource_parameters_for_auto_protection = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:BlobBackupDatasourceParametersForAutoProtection}") + if disc_blob_backup_datasource_parameters_for_auto_protection is not None: + _ValidateForBackupHelper._build_schema_blob_backup_rule_based_auto_protection_settings_create(disc_blob_backup_datasource_parameters_for_auto_protection.set_prop("autoProtectionSettings", AAZObjectType, ".blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings", typ_kwargs={"flags": {"required": True}})) + disc_kubernetes_cluster_backup_datasource_parameters = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:KubernetesClusterBackupDatasourceParameters}") if disc_kubernetes_cluster_backup_datasource_parameters is not None: disc_kubernetes_cluster_backup_datasource_parameters.set_prop("backupHookReferences", AAZListType, ".kubernetes_cluster_backup_datasource_parameters.backup_hook_references") @@ -689,5 +775,24 @@ def _build_schema_base_resource_properties_create(cls, _builder): _builder.set_const("objectType", "DefaultResourceProperties", AAZStrType, ".default_resource_properties", typ_kwargs={"flags": {"required": True}}) _builder.discriminate_by("objectType", "DefaultResourceProperties") + @classmethod + def _build_schema_blob_backup_rule_based_auto_protection_settings_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("enabled", AAZBoolType, ".enabled", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("objectType", "BlobBackupRuleBasedAutoProtectionSettings", AAZStrType, ".", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("rules", AAZListType, ".rules") + + rules = _builder.get(".rules") + if rules is not None: + rules.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".rules[]") + if _elements is not None: + _elements.set_prop("mode", AAZStrType, ".mode", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("objectType", AAZStrType, ".object_type", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("pattern", AAZStrType, ".pattern", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + __all__ = ["ValidateForBackup"] diff --git a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_update.py b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_update.py index 082c92a7795..6cd7a8aae4c 100644 --- a/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_update.py +++ b/src/dataprotection/azext_dataprotection/aaz/latest/dataprotection/backup_instance/_validate_for_update.py @@ -19,9 +19,9 @@ class ValidateForUpdate(AAZCommand): """ _aaz_info = { - "version": "2025-07-01", + "version": "2026-03-01", "resources": [ - ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/backupinstances/{}/validateformodifybackup", "2025-07-01"], + ["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.dataprotection/backupvaults/{}/backupinstances/{}/validateformodifybackup", "2026-03-01"], ] } @@ -250,9 +250,15 @@ def _build_arguments_schema(cls, *args, **kwargs): _element.adls_blob_backup_datasource_parameters = AAZObjectArg( options=["adls-blob-backup-datasource-parameters"], ) + _element.adls_blob_backup_datasource_parameters_for_auto_protection = AAZObjectArg( + options=["adls-blob-backup-datasource-parameters-for-auto-protection"], + ) _element.blob_backup_datasource_parameters = AAZObjectArg( options=["blob-backup-datasource-parameters"], ) + _element.blob_backup_datasource_parameters_for_auto_protection = AAZObjectArg( + options=["blob-backup-datasource-parameters-for-auto-protection"], + ) _element.kubernetes_cluster_backup_datasource_parameters = AAZObjectArg( options=["kubernetes-cluster-backup-datasource-parameters"], ) @@ -267,6 +273,14 @@ def _build_arguments_schema(cls, *args, **kwargs): containers_list = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.adls_blob_backup_datasource_parameters.containers_list containers_list.Element = AAZStrArg() + adls_blob_backup_datasource_parameters_for_auto_protection = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.adls_blob_backup_datasource_parameters_for_auto_protection + adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectArg( + options=["auto-protection-settings"], + help="AutoProtection settings", + required=True, + ) + cls._build_args_blob_backup_rule_based_auto_protection_settings_create(adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + blob_backup_datasource_parameters = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters blob_backup_datasource_parameters.containers_list = AAZListArg( options=["containers-list"], @@ -277,6 +291,14 @@ def _build_arguments_schema(cls, *args, **kwargs): containers_list = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters.containers_list containers_list.Element = AAZStrArg() + blob_backup_datasource_parameters_for_auto_protection = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.blob_backup_datasource_parameters_for_auto_protection + blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings = AAZObjectArg( + options=["auto-protection-settings"], + help="AutoProtection settings", + required=True, + ) + cls._build_args_blob_backup_rule_based_auto_protection_settings_create(blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings) + kubernetes_cluster_backup_datasource_parameters = cls._args_schema.backup_instance.policy_info.policy_parameters.backup_datasource_parameters_list.Element.kubernetes_cluster_backup_datasource_parameters kubernetes_cluster_backup_datasource_parameters.backup_hook_references = AAZListArg( options=["backup-hook-references"], @@ -392,6 +414,58 @@ def _build_args_base_resource_properties_create(cls, _schema): _schema.default_resource_properties = cls._args_base_resource_properties_create.default_resource_properties + _args_blob_backup_rule_based_auto_protection_settings_create = None + + @classmethod + def _build_args_blob_backup_rule_based_auto_protection_settings_create(cls, _schema): + if cls._args_blob_backup_rule_based_auto_protection_settings_create is not None: + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_create.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + return + + cls._args_blob_backup_rule_based_auto_protection_settings_create = AAZObjectArg() + + blob_backup_rule_based_auto_protection_settings_create = cls._args_blob_backup_rule_based_auto_protection_settings_create + blob_backup_rule_based_auto_protection_settings_create.enabled = AAZBoolArg( + options=["enabled"], + help="Flag to enable whether auto protection.", + required=True, + ) + blob_backup_rule_based_auto_protection_settings_create.rules = AAZListArg( + options=["rules"], + help="Rules are evaluated in the order provided. Inclusion adds candidates; exclusion removes candidates. If no rules are present, all containers are considered eligible when enabled = true.", + ) + + rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + rules.Element = AAZObjectArg() + + _element = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules.Element + _element.mode = AAZStrArg( + options=["mode"], + help="Exclude removes candidates (after inclusion)", + required=True, + enum={"Exclude": "Exclude"}, + ) + _element.object_type = AAZStrArg( + options=["object-type"], + help="Type of the specific object - used for deserializing", + required=True, + ) + _element.pattern = AAZStrArg( + options=["pattern"], + help="The string pattern to evaluate against container names. For now this accepts literal strings only (no wildcards or regex).", + required=True, + ) + _element.type = AAZStrArg( + options=["type"], + help="Pattern type: Prefix, only pattern type supported for now.", + required=True, + enum={"Prefix": "Prefix"}, + ) + + _schema.enabled = cls._args_blob_backup_rule_based_auto_protection_settings_create.enabled + _schema.rules = cls._args_blob_backup_rule_based_auto_protection_settings_create.rules + def _execute_operations(self): self.pre_operations() yield self.BackupInstancesValidateForModifyBackup(ctx=self.ctx)() @@ -464,7 +538,7 @@ def url_parameters(self): def query_parameters(self): parameters = { **self.serialize_query_param( - "api-version", "2025-07-01", + "api-version", "2026-03-01", required=True, ), } @@ -559,10 +633,14 @@ def content(self): _elements = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]") if _elements is not None: _elements.set_const("objectType", "AdlsBlobBackupDatasourceParameters", AAZStrType, ".adls_blob_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) + _elements.set_const("objectType", "AdlsBlobBackupDatasourceParametersForAutoProtection", AAZStrType, ".adls_blob_backup_datasource_parameters_for_auto_protection", typ_kwargs={"flags": {"required": True}}) _elements.set_const("objectType", "BlobBackupDatasourceParameters", AAZStrType, ".blob_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) + _elements.set_const("objectType", "BlobBackupDatasourceParametersForAutoProtection", AAZStrType, ".blob_backup_datasource_parameters_for_auto_protection", typ_kwargs={"flags": {"required": True}}) _elements.set_const("objectType", "KubernetesClusterBackupDatasourceParameters", AAZStrType, ".kubernetes_cluster_backup_datasource_parameters", typ_kwargs={"flags": {"required": True}}) _elements.discriminate_by("objectType", "AdlsBlobBackupDatasourceParameters") + _elements.discriminate_by("objectType", "AdlsBlobBackupDatasourceParametersForAutoProtection") _elements.discriminate_by("objectType", "BlobBackupDatasourceParameters") + _elements.discriminate_by("objectType", "BlobBackupDatasourceParametersForAutoProtection") _elements.discriminate_by("objectType", "KubernetesClusterBackupDatasourceParameters") disc_adls_blob_backup_datasource_parameters = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:AdlsBlobBackupDatasourceParameters}") @@ -573,6 +651,10 @@ def content(self): if containers_list is not None: containers_list.set_elements(AAZStrType, ".") + disc_adls_blob_backup_datasource_parameters_for_auto_protection = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:AdlsBlobBackupDatasourceParametersForAutoProtection}") + if disc_adls_blob_backup_datasource_parameters_for_auto_protection is not None: + _ValidateForUpdateHelper._build_schema_blob_backup_rule_based_auto_protection_settings_create(disc_adls_blob_backup_datasource_parameters_for_auto_protection.set_prop("autoProtectionSettings", AAZObjectType, ".adls_blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings", typ_kwargs={"flags": {"required": True}})) + disc_blob_backup_datasource_parameters = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:BlobBackupDatasourceParameters}") if disc_blob_backup_datasource_parameters is not None: disc_blob_backup_datasource_parameters.set_prop("containersList", AAZListType, ".blob_backup_datasource_parameters.containers_list", typ_kwargs={"flags": {"required": True}}) @@ -581,6 +663,10 @@ def content(self): if containers_list is not None: containers_list.set_elements(AAZStrType, ".") + disc_blob_backup_datasource_parameters_for_auto_protection = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:BlobBackupDatasourceParametersForAutoProtection}") + if disc_blob_backup_datasource_parameters_for_auto_protection is not None: + _ValidateForUpdateHelper._build_schema_blob_backup_rule_based_auto_protection_settings_create(disc_blob_backup_datasource_parameters_for_auto_protection.set_prop("autoProtectionSettings", AAZObjectType, ".blob_backup_datasource_parameters_for_auto_protection.auto_protection_settings", typ_kwargs={"flags": {"required": True}})) + disc_kubernetes_cluster_backup_datasource_parameters = _builder.get(".backupInstance.policyInfo.policyParameters.backupDatasourceParametersList[]{objectType:KubernetesClusterBackupDatasourceParameters}") if disc_kubernetes_cluster_backup_datasource_parameters is not None: disc_kubernetes_cluster_backup_datasource_parameters.set_prop("backupHookReferences", AAZListType, ".kubernetes_cluster_backup_datasource_parameters.backup_hook_references") @@ -657,5 +743,24 @@ def _build_schema_base_resource_properties_create(cls, _builder): _builder.set_const("objectType", "DefaultResourceProperties", AAZStrType, ".default_resource_properties", typ_kwargs={"flags": {"required": True}}) _builder.discriminate_by("objectType", "DefaultResourceProperties") + @classmethod + def _build_schema_blob_backup_rule_based_auto_protection_settings_create(cls, _builder): + if _builder is None: + return + _builder.set_prop("enabled", AAZBoolType, ".enabled", typ_kwargs={"flags": {"required": True}}) + _builder.set_const("objectType", "BlobBackupRuleBasedAutoProtectionSettings", AAZStrType, ".", typ_kwargs={"flags": {"required": True}}) + _builder.set_prop("rules", AAZListType, ".rules") + + rules = _builder.get(".rules") + if rules is not None: + rules.set_elements(AAZObjectType, ".") + + _elements = _builder.get(".rules[]") + if _elements is not None: + _elements.set_prop("mode", AAZStrType, ".mode", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("objectType", AAZStrType, ".object_type", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("pattern", AAZStrType, ".pattern", typ_kwargs={"flags": {"required": True}}) + _elements.set_prop("type", AAZStrType, ".type", typ_kwargs={"flags": {"required": True}}) + __all__ = ["ValidateForUpdate"] diff --git a/src/dataprotection/azext_dataprotection/manual/_help.py b/src/dataprotection/azext_dataprotection/manual/_help.py index 45acd0f92b4..017edab6380 100644 --- a/src/dataprotection/azext_dataprotection/manual/_help.py +++ b/src/dataprotection/azext_dataprotection/manual/_help.py @@ -213,6 +213,10 @@ text: az dataprotection backup-instance initialize-backupconfig --datasource-type "AzureBlob" --include-all-containers --storage-account-rg "sampleRG" --storage-account-name "samplestorage" - name: Initialize backup configuration for AzureDataLakeStorage text: az dataprotection backup-instance initialize-backupconfig --datasource-type "AzureDataLakeStorage" --container-list container1 container2 --storage-account-rg "sampleRG" --storage-account-name "samplestorage" + - name: Initialize backup configuration for AzureBlob with auto-protection + text: az dataprotection backup-instance initialize-backupconfig --datasource-type AzureBlob --auto-protection true + - name: Initialize backup configuration for AzureDataLakeStorage with auto-protection and exclusion prefixes + text: az dataprotection backup-instance initialize-backupconfig --datasource-type AzureDataLakeStorage --auto-protection true --exclusion-prefixes "logs-" "temp-" """ diff --git a/src/dataprotection/azext_dataprotection/manual/_params.py b/src/dataprotection/azext_dataprotection/manual/_params.py index 2056e387f48..c8e1bab7e35 100644 --- a/src/dataprotection/azext_dataprotection/manual/_params.py +++ b/src/dataprotection/azext_dataprotection/manual/_params.py @@ -103,6 +103,12 @@ def load_arguments(self, _): type=namespaced_name_resource_type, options_list=['--backup-hook-references', '--backup-hook-refs'], help='Property sets the hook reference to be executed during backup.') + c.argument('auto_protection', arg_type=get_three_state_flag(), + help='Enable auto-protection for new containers. When enabled, new containers will be automatically protected. ' + 'Use this parameter for DatasourceType AzureBlob or AzureDataLakeStorage.') + c.argument('auto_protection_exclusion_prefixes', type=str, nargs='+', + options_list=['--auto-protection-exclusion-prefixes', '--exclusion-prefixes'], + help='List of container name prefixes to exclude from auto-protection. Requires --auto-protection to be enabled.') with self.argument_context('dataprotection backup-instance initialize') as c: c.argument('datasource_type', arg_type=get_enum_type(get_datasource_types()), help="Specify the datasource type of the resource to be backed up") diff --git a/src/dataprotection/azext_dataprotection/manual/custom.py b/src/dataprotection/azext_dataprotection/manual/custom.py index d7afe014b1f..c80c89b4f28 100644 --- a/src/dataprotection/azext_dataprotection/manual/custom.py +++ b/src/dataprotection/azext_dataprotection/manual/custom.py @@ -92,11 +92,15 @@ def dataprotection_backup_instance_initialize_backupconfig(cmd, client, datasour vaulted_backup_containers=None, include_all_containers=None, storage_account_name=None, storage_account_resource_group=None, - backup_hook_references=None): + backup_hook_references=None, + auto_protection=None, + auto_protection_exclusion_prefixes=None): if datasource_type == "AzureKubernetesService": - if any([vaulted_backup_containers, include_all_containers, storage_account_name, storage_account_resource_group]): + if any([vaulted_backup_containers, include_all_containers, storage_account_name, storage_account_resource_group, + auto_protection, auto_protection_exclusion_prefixes]): raise InvalidArgumentValueError('Invalid argument --vaulted-backup-containers, --include-all-containers, ' - '--storage-account-name, --storage-account-resource-group for given datasource type.') + '--storage-account-name, --storage-account-resource-group, ' + '--auto-protection, --exclusion-prefixes for given datasource type.') if snapshot_volumes is None: snapshot_volumes = True if include_cluster_scope_resources is None: @@ -118,10 +122,18 @@ def dataprotection_backup_instance_initialize_backupconfig(cmd, client, datasour raise InvalidArgumentValueError('Invalid arguments --excluded-resource-type, --included-resource-type, --excluded-namespaces, ' ' --included-namespaces, --label-selectors, --snapshot-volumes, --include-cluster-scope-resources, ' ' --backup-hook-references for given datasource type.') + if auto_protection_exclusion_prefixes and not auto_protection: + raise InvalidArgumentValueError('--exclusion-prefixes requires --auto-protection to be enabled.') + if auto_protection: + if any([vaulted_backup_containers, include_all_containers]): + raise InvalidArgumentValueError('--auto-protection cannot be used with --container-list or --include-all-containers.') + if any([storage_account_name, storage_account_resource_group]): + raise InvalidArgumentValueError('--storage-account-name and --storage-account-resource-group are not applicable with --auto-protection.') + return helper.get_blob_autoprotection_config(datasource_type, auto_protection_exclusion_prefixes) return helper.get_blob_backupconfig(cmd, client, vaulted_backup_containers, include_all_containers, storage_account_name, storage_account_resource_group, datasource_type) raise InvalidArgumentValueError('Given datasource type is not supported currently. ' - 'This command only supports "AzureBlob" or "AzureKubernetesService" datasource types.') + 'This command only supports "AzureBlob", "AzureDataLakeStorage" or "AzureKubernetesService" datasource types.') def dataprotection_backup_instance_initialize(datasource_type, datasource_id, datasource_location, policy_id, diff --git a/src/dataprotection/azext_dataprotection/manual/helpers.py b/src/dataprotection/azext_dataprotection/manual/helpers.py index 543cc9a3592..cd89395b9f7 100644 --- a/src/dataprotection/azext_dataprotection/manual/helpers.py +++ b/src/dataprotection/azext_dataprotection/manual/helpers.py @@ -326,6 +326,34 @@ def get_blob_backupconfig(cmd, client, vaulted_backup_containers, include_all_co 'for given workload type.') +def get_blob_autoprotection_config(datasource_type, exclusion_prefixes=None): + if datasource_type == "AzureDataLakeStorage": + object_type = "AdlsBlobBackupDatasourceParametersForAutoProtection" + else: + object_type = "BlobBackupDatasourceParametersForAutoProtection" + + auto_protection_settings = { + "object_type": "BlobBackupRuleBasedAutoProtectionSettings", + "enabled": True + } + + if exclusion_prefixes: + auto_protection_settings["rules"] = [ + { + "object_type": "BlobBackupAutoProtectionRule", + "mode": "Exclude", + "type": "Prefix", + "pattern": prefix + } + for prefix in exclusion_prefixes + ] + + return { + "object_type": object_type, + "auto_protection_settings": auto_protection_settings + } + + def get_datasource_auth_credentials_info(secret_store_type, secret_store_uri): datasource_auth_credentials_info = None diff --git a/src/dataprotection/azext_dataprotection/tests/latest/test_dataprotection_configs.py b/src/dataprotection/azext_dataprotection/tests/latest/test_dataprotection_configs.py index 272e37d4a2a..6caf60b6a46 100644 --- a/src/dataprotection/azext_dataprotection/tests/latest/test_dataprotection_configs.py +++ b/src/dataprotection/azext_dataprotection/tests/latest/test_dataprotection_configs.py @@ -50,3 +50,79 @@ def test_dataprotection_aks_backup_and_restore_initialize_configs(test): checks=[ test.check("resource_modifier_reference.CustomerResourceName", 'targetNamespace') ]) + + def test_dataprotection_blob_autoprotection_backupconfig(self): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureBlob --auto-protection true', + checks=[ + self.check('object_type', 'BlobBackupDatasourceParametersForAutoProtection'), + self.check('auto_protection_settings.object_type', 'BlobBackupRuleBasedAutoProtectionSettings'), + self.check('auto_protection_settings.enabled', True), + ]) + + def test_dataprotection_adls_autoprotection_backupconfig(self): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureDataLakeStorage --auto-protection true', + checks=[ + self.check('object_type', 'AdlsBlobBackupDatasourceParametersForAutoProtection'), + self.check('auto_protection_settings.object_type', 'BlobBackupRuleBasedAutoProtectionSettings'), + self.check('auto_protection_settings.enabled', True), + ]) + + def test_dataprotection_blob_autoprotection_with_exclusion_prefixes(self): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureBlob --auto-protection true ' + '--exclusion-prefixes logs- temp-', + checks=[ + self.check('object_type', 'BlobBackupDatasourceParametersForAutoProtection'), + self.check('auto_protection_settings.enabled', True), + self.check('length(auto_protection_settings.rules)', 2), + self.check('auto_protection_settings.rules[0].object_type', 'BlobBackupAutoProtectionRule'), + self.check('auto_protection_settings.rules[0].mode', 'Exclude'), + self.check('auto_protection_settings.rules[0].type', 'Prefix'), + self.check('auto_protection_settings.rules[0].pattern', 'logs-'), + self.check('auto_protection_settings.rules[1].pattern', 'temp-'), + ]) + + def test_dataprotection_adls_autoprotection_with_exclusion_prefixes(self): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureDataLakeStorage --auto-protection true ' + '--exclusion-prefixes staging-', + checks=[ + self.check('object_type', 'AdlsBlobBackupDatasourceParametersForAutoProtection'), + self.check('auto_protection_settings.enabled', True), + self.check('length(auto_protection_settings.rules)', 1), + self.check('auto_protection_settings.rules[0].pattern', 'staging-'), + ]) + + def test_dataprotection_autoprotection_no_exclusion_prefixes(self): + result = self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureBlob --auto-protection true').get_output_in_json() + self.assertNotIn('rules', result.get('auto_protection_settings', {})) + + def test_dataprotection_autoprotection_invalid_with_container_list(self): + from azure.cli.core.azclierror import InvalidArgumentValueError + with self.assertRaises(InvalidArgumentValueError): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureBlob --auto-protection true ' + '--container-list container1 container2') + + def test_dataprotection_autoprotection_invalid_with_include_all_containers(self): + from azure.cli.core.azclierror import InvalidArgumentValueError + with self.assertRaises(InvalidArgumentValueError): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureBlob --auto-protection true ' + '--include-all-containers true') + + def test_dataprotection_exclusion_prefixes_without_autoprotection(self): + from azure.cli.core.azclierror import InvalidArgumentValueError + with self.assertRaises(InvalidArgumentValueError): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureBlob ' + '--exclusion-prefixes logs-') + + def test_dataprotection_autoprotection_invalid_for_aks(self): + from azure.cli.core.azclierror import InvalidArgumentValueError + with self.assertRaises(InvalidArgumentValueError): + self.cmd('az dataprotection backup-instance initialize-backupconfig ' + '--datasource-type AzureKubernetesService --auto-protection true') diff --git a/src/dataprotection/setup.py b/src/dataprotection/setup.py index b42d0a2c53f..888f57a9f12 100644 --- a/src/dataprotection/setup.py +++ b/src/dataprotection/setup.py @@ -10,7 +10,7 @@ from setuptools import setup, find_packages # HISTORY.rst entry. -VERSION = '1.9.0' +VERSION = '1.10.0' # The full list of classifiers is available at # https://pypi.python.org/pypi?%3Aaction=list_classifiers