Repository: GoogleCloudPlatform/magic-modules
Pull request #13494: Add support for timedPromoteReleaseRule and repairRolloutRule automation rules and new Deploy Policy resource
Author: login: ChrisGe4
Labels: name: service/clouddeploy
Created: 2025-03-31T22:25:25Z | Merged: 2025-04-01T20:46:56Z

 Fixes: https://github.com/hashicorp/terraform-provider-google/issues/22177
<!--
Complete the self-review checklist to help speed up the review process: https://googlecloudplatform.github.io/magic-modules/contribute/review-pr/

If your PR is still work in progress, please create it in draft mode.

Put a description of what this PR is for here, along with any references to issues that this resolves or contributes to.
For example: Fixes https://github.com/hashicorp/terraform-provider-google/issues/ISSUE_ID
-->

**Release Note Template for Downstream PRs (will be copied)**

See [Write release notes](https://googlecloudplatform.github.io/magic-modules/contribute/release-notes/) for guidance.

```release-note:enhancement
cloudedeploy: added `timed_promote_release_rule` and `repair_rollout_rule`  to `google_clouddeploy_automation` resource
```
```release-note:new-resource
`google_clouddeploy_deploy_policy`
```


Diff:
diff --git a/mmv1/products/clouddeploy/Automation.yaml b/mmv1/products/clouddeploy/Automation.yaml
index 4431164c4f3b..103e851bce28 100644
--- a/mmv1/products/clouddeploy/Automation.yaml
+++ b/mmv1/products/clouddeploy/Automation.yaml
@@ -168,3 +168,81 @@ properties:
               description: "Optional. Proceeds only after phase name matched any one in the list. This value must consist of lower-case letters, numbers, and hyphens, start with a letter and end with a letter or a number, and have a max length of 63 characters. In other words, it must match the following regex: `^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$`."
               item_type:
                 type: String
+        - name: 'repairRolloutRule'
+          type: NestedObject
+          description: "Optional. The RepairRolloutRule will automatically repair a failed rollout."
+          properties:
+            - name: 'id'
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `Automation` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: 'phases'
+              type: Array
+              description: "Optional. Phases within which jobs are subject to automatic repair actions on failure. Proceeds only after phase name matched any one in the list, or for all phases if unspecified. This value must consist of lower-case letters, numbers, and hyphens, start with a letter and end with a letter or a number, and have a max length of 63 characters. In other words, it must match the following regex: ^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$."
+              item_type:
+                type: String
+            - name: 'jobs'
+              type: Array
+              description: "Optional. Jobs to repair. Proceeds only after job name matched any one in the list, or for all jobs if unspecified or empty. The phase that includes the job must match the phase ID specified in sourcePhase. This value must consist of lower-case letters, numbers, and hyphens, start with a letter and end with a letter or a number, and have a max length of 63 characters. In other words, it must match the following regex: ^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$."
+              item_type:
+                type: String
+            - name: 'repairPhases'
+              type: Array
+              description: "Optional. Proceeds only after phase name matched any one in the list. This value must consist of lower-case letters, numbers, and hyphens, start with a letter and end with a letter or a number, and have a max length of 63 characters. In other words, it must match the following regex: `^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$`."
+              item_type:
+                type: NestedObject
+                properties:
+                  - name: 'retry'
+                    description: "Optional. Retries a failed job."
+                    type: NestedObject
+                    properties:
+                      - name: 'attempts'
+                        type: String
+                        description: "Required. Total number of retries. Retry is skipped if set to 0; The minimum value is 1, and the maximum value is 10."
+                        required: true
+                      - name: 'wait'
+                        type: String
+                        description: "Optional. How long to wait for the first retry. Default is 0, and the maximum value is 14d. A duration in seconds with up to nine fractional digits, ending with 's'. Example: `3.5s`."
+                      - name: 'backoffMode'
+                        type: Enum
+                        description: "Optional. The pattern of how wait time will be increased. Default is linear. Backoff mode will be ignored if wait is 0."
+                        enum_values:
+                          - 'BACKOFF_MODE_UNSPECIFIED'
+                          - 'BACKOFF_MODE_LINEAR'
+                          - 'BACKOFF_MODE_EXPONENTIAL'
+                  - name: 'rollback'
+                    description: "Optional. Rolls back a Rollout."
+                    type: NestedObject
+                    properties:
+                      - name: 'destinationPhase'
+                        type: String
+                        description: "Optional. The starting phase ID for the Rollout. If unspecified, the Rollout will start in the stable phase."
+                      - name: 'disableRollbackIfRolloutPending'
+                        type: Boolean
+                        send_empty_value: true
+                        description: "Optional. If pending rollout exists on the target, the rollback operation will be aborted."
+        - name: 'timedPromoteReleaseRule'
+          type: NestedObject
+          description: "Optional. The `TimedPromoteReleaseRule` will automatically promote a release from the current target(s) to the specified target(s) on a configured schedule."
+          properties:
+            - name: 'id'
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `Automation` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: 'destinationTargetId'
+              type: String
+              description: |-
+                Optional. The ID of the stage in the pipeline to which this Release is deploying. If unspecified, default it to the next stage in the promotion flow. The value of this field could be one of the following:
+                  - The last segment of a target name
+                  - "@next", the next target in the promotion sequence"
+            - name: 'schedule'
+              type: String
+              description: "Required. Schedule in crontab format. e.g. `0 9 * * 1` for every Monday at 9am."
+              required: true
+            - name: 'timeZone'
+              type: String
+              description: "Required. The time zone in IANA format IANA Time Zone Database (e.g. America/New_York)."
+              required: true
+            - name: 'destinationPhase'
+              type: String
+              description: "Optional. The starting phase of the rollout created by this rule. Default to the first phase."
diff --git a/mmv1/products/clouddeploy/DeployPolicy.yaml b/mmv1/products/clouddeploy/DeployPolicy.yaml
new file mode 100644
index 000000000000..5668011e78d3
--- /dev/null
+++ b/mmv1/products/clouddeploy/DeployPolicy.yaml
@@ -0,0 +1,293 @@
+# Copyright 2025 Google Inc.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+name: "DeployPolicy"
+description: |
+  A `DeployPolicy` inhibits manual or DeployPolicy-driven actions within a Delivery Pipeline or Target.
+references:
+  guides:
+    "Restrict deploy behavior using policies": "https://cloud.google.com/deploy/docs/deploy-policy"
+  api: "https://cloud.google.com/deploy/docs/api/reference/rest/v1/projects.locations.deployPolicies"
+docs:
+id_format: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+base_url: "projects/{{project}}/locations/{{location}}/deployPolicies"
+self_link: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+create_url: "projects/{{project}}/locations/{{location}}/deployPolicies?deployPolicyId={{name}}"
+update_verb: "PATCH"
+update_mask: true
+import_format:
+  - "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+timeouts:
+  insert_minutes: 20
+  update_minutes: 20
+  delete_minutes: 20
+autogen_async: true
+async:
+  actions: ["create", "delete", "update"]
+  type: "OpAsync"
+  operation:
+    base_url: "{{op_id}}"
+  result:
+    resource_inside_response: false
+custom_code:
+examples:
+  - name: "clouddeploy_deploy_policy_basic"
+    primary_resource_id: "b-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+  - name: "clouddeploy_deploy_policy_full"
+    primary_resource_id: "f-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+parameters:
+  - name: "location"
+    type: String
+    description: "The location for the resource"
+    url_param_only: true
+    required: true
+    immutable: true
+properties:
+  - name: "name"
+    type: String
+    description: "Name of the `DeployPolicy`."
+    url_param_only: true
+    required: true
+    immutable: true
+  - name: "uid"
+    type: String
+    description: "Output only. Unique identifier of the `DeployPolicy`."
+    output: true
+  - name: "description"
+    type: String
+    description: "Optional. Description of the `DeployPolicy`. Max length is 255 characters."
+  - name: "createTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was created."
+    output: true
+  - name: "updateTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was updated."
+    output: true
+  - name: "annotations"
+    type: KeyValueAnnotations
+    description: "Optional. User annotations. These attributes can only be set and used by the user, and not by Cloud Deploy. Annotations must meet the following constraints: * Annotations are key/value pairs. * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (`/`). * The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. * The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots(`.`), not longer than 253 characters in total, followed by a slash (`/`). See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set for more details."
+  - name: "labels"
+    type: KeyValueLabels
+    description: "Optional. Labels are attributes that can be set and used by both the user and by Cloud Deploy. Labels must meet the following constraints: * Keys and values can contain only lowercase letters, numeric characters, underscores, and dashes. * All characters must use UTF-8 encoding, and international characters are allowed. * Keys must start with a lowercase letter or international character. * Each resource is limited to a maximum of 64 labels. Both keys and values are additionally constrained to be <= 63 characters."
+  - name: "etag"
+    type: String
+    description: "Optional. The weak etag of the `DeployPolicy` resource. This checksum is computed by the server based on the value of other fields, and may be sent on update and delete requests to ensure the client has an up-to-date value before proceeding."
+    output: true
+  - name: "suspended"
+    type: Boolean
+    description: "Optional. When suspended, the policy will not prevent actions from occurring, even if the action violates the policy."
+    send_empty_value: true
+  - name: "selectors"
+    type: Array
+    description: "Required. Selected resources to which the policy will be applied. At least one selector is required. If one selector matches the resource the policy applies. For example, if there are two selectors and the action being attempted matches one of them, the policy will apply to that action."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "target"
+          type: NestedObject
+          description: "Contains attributes about a target."
+          properties:
+            - name: "id"
+              type: String
+              description: 'ID of the `Target`. The value of this field could be one of the following: * The last segment of a target name. It only needs the ID to determine which target is being referred to * "*", all targets in a location.'
+            - name: "labels"
+              type: KeyValuePairs
+              description: "Target labels."
+              default_from_api: true
+        - name: "deliveryPipeline"
+          type: NestedObject
+          description: "Contains attributes about a delivery pipeline."
+          properties:
+            - name: "id"
+              type: String
+              description: |-
+                Optional. ID of the DeliveryPipeline. The value of this field could be one of the following:
+                - The last segment of a pipeline name
+                - "*", all delivery pipelines in a location
+            - name: "labels"
+              type: KeyValuePairs
+              description: "DeliveryPipeline labels."
+              default_from_api: true
+  - name: "rules"
+    type: Array
+    description: "Required. Rules to apply. At least one rule must be present."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "rolloutRestriction"
+          type: NestedObject
+          description: "Optional. Rollout restrictions."
+          properties:
+            - name: "id"
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `DeployPolicy` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: "invokers"
+              type: Array
+              description: "Optional. What invoked the action. If left empty, all invoker types will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "USER"
+                  - "DEPLOY_AUTOMATION"
+            - name: "actions"
+              type: Array
+              description: "Optional. Rollout actions to be restricted as part of the policy. If left empty, all actions will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "ADVANCE"
+                  - "APPROVE"
+                  - "CANCEL"
+                  - "CREATE"
+                  - "IGNORE_JOB"
+                  - "RETRY_JOB"
+                  - "ROLLBACK"
+                  - "TERMINATE_JOBRUN"
+            - name: "timeWindows"
+              type: NestedObject
+              description: "Required. Time window within which actions are restricted."
+              properties:
+                - name: "timeZone"
+                  type: String
+                  description: "Required. The time zone in IANA format IANA Time Zone Database (e.g. America/New_York)."
+                  required: true
+                - name: oneTimeWindows
+                  type: Array
+                  description: "Optional. One-time windows within which actions are restricted."
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "startDate"
+                        type: NestedObject
+                        description: "Required. Start date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
+                      - name: "endDate"
+                        type: NestedObject
+                        description: "Required. End date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999."
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12."
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month."
+                      - name: "startTime"
+                        type: NestedObject
+                        description: "Required. Start time (inclusive). Use 00:00 for the beginning of the day."
+                        required: true
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
+                      - name: "endTime"
+                        type: NestedObject
+                        description: "Required. End time (exclusive). You may use 24:00 for the end of the day."
+                        required: true
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
+                - name: weeklyWindows
+                  type: Array
+                  description: "Optional. Recurring weekly windows within which actions are restricted."
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "daysOfWeek"
+                        type: Array
+                        description: "Optional. Days of week. If left empty, all days of the week will be included."
+                        item_type:
+                          type: Enum
+                          enum_values:
+                            - "MONDAY"
+                            - "TUESDAY"
+                            - "WEDNESDAY"
+                            - "THURSDAY"
+                            - "FRIDAY"
+                            - "SATURDAY"
+                            - "SUNDAY"
+                      - name: "startTime"
+                        type: NestedObject
+                        description: "Optional. Start time (inclusive). Use 00:00 for the beginning of the day. If you specify startTime you must also specify endTime. If left empty, this will block for the entire day for the days specified in daysOfWeek."
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
+                      - name: "endTime"
+                        type: NestedObject
+                        description: "Optional. End time (exclusive). Use 24:00 to indicate midnight. If you specify endTime you must also specify startTime. If left empty, this will block for the entire day for the days specified in daysOfWeek."
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
diff --git a/mmv1/templates/terraform/examples/clouddeploy_automation_full.tf.tmpl b/mmv1/templates/terraform/examples/clouddeploy_automation_full.tf.tmpl
index 40810de2343b..002cb897ee8a 100644
--- a/mmv1/templates/terraform/examples/clouddeploy_automation_full.tf.tmpl
+++ b/mmv1/templates/terraform/examples/clouddeploy_automation_full.tf.tmpl
@@ -32,10 +32,39 @@ resource "google_clouddeploy_automation" "{{$.PrimaryResourceId}}" {
   rules {
     advance_rollout_rule {
       id                    = "advance-rollout"
-      source_phases         = ["deploy"]
+      source_phases         = ["canary"]
       wait                  = "200s"
     }
   }
+  rules {
+    repair_rollout_rule {
+      id                    = "repair-rollout"
+      phases                = ["stable"]
+      jobs                  = ["deploy"]
+      repair_phases {
+          retry  {
+                      attempts = "1"
+                      wait     = "200s"
+                      backoff_mode = "BACKOFF_MODE_LINEAR"
+                  }
+       }
+      repair_phases {
+             rollback {
+                         destination_phase = "stable"
+                         disable_rollback_if_rollout_pending = true
+                      }
+          }
+    }
+  }
+  rules {
+    timed_promote_release_rule {
+      id                    = "timed-promote-release"
+      destination_target_id   = "@next"
+      schedule              = "0 9 * * 1"
+      time_zone              = "America/New_York"
+      destination_phase      = "stable"
+    }
+  }
 }
 
 resource "google_clouddeploy_delivery_pipeline" "pipeline" {
diff --git a/mmv1/templates/terraform/examples/clouddeploy_deploy_policy_basic.tf.tmpl b/mmv1/templates/terraform/examples/clouddeploy_deploy_policy_basic.tf.tmpl
new file mode 100644
index 000000000000..513878b68ffe
--- /dev/null
+++ b/mmv1/templates/terraform/examples/clouddeploy_deploy_policy_basic.tf.tmpl
@@ -0,0 +1,27 @@
+resource "google_clouddeploy_deploy_policy" "{{$.PrimaryResourceId}}" {
+  name     = "{{index $.Vars "policy"}}"
+  location = "us-central1"
+  selectors {
+    delivery_pipeline {
+      id = "{{index $.Vars "delivery_pipeline"}}"
+    }
+  }
+  rules {
+    rollout_restriction {
+      id = "rule"
+      time_windows {
+        time_zone = "America/Los_Angeles"
+        weekly_windows {
+            start_time {
+                hours = "12"
+                minutes = "00"
+            }
+            end_time {
+                hours = "13"
+                minutes = "00"
+            }
+        }
+      }
+    }
+  }
+}
diff --git a/mmv1/templates/terraform/examples/clouddeploy_deploy_policy_full.tf.tmpl b/mmv1/templates/terraform/examples/clouddeploy_deploy_policy_full.tf.tmpl
new file mode 100644
index 000000000000..61e5590c0902
--- /dev/null
+++ b/mmv1/templates/terraform/examples/clouddeploy_deploy_policy_full.tf.tmpl
@@ -0,0 +1,102 @@
+resource "google_clouddeploy_deploy_policy" "{{$.PrimaryResourceId}}" {
+  name     = "{{index $.Vars "policy"}}"
+  location = "us-central1"
+  annotations = {
+    my_first_annotation = "example-annotation-1"
+    my_second_annotation = "example-annotation-2"
+  }
+  labels = {
+    my_first_label = "example-label-1"
+    my_second_label = "example-label-2"
+  }
+  description = "policy resource"
+  selectors {
+    delivery_pipeline {
+      id = "{{index $.Vars "delivery_pipeline"}}"
+      labels = {
+      	foo = "bar"
+      }
+    }
+   }
+  selectors {
+    target {
+      id = "dev"
+      labels = {
+      	foo = "bar"
+      }
+    }
+  }
+  suspended = true
+  rules {
+    rollout_restriction {
+      id = "rule"
+      time_windows {
+        time_zone = "America/Los_Angeles"
+        weekly_windows {
+            start_time {
+                hours = "12"
+                minutes = "00"
+                seconds = "00"
+                nanos = "00"
+            }
+            end_time {
+                hours = "13"
+                minutes = "00"
+                seconds = "00"
+                nanos = "00"
+            }
+        }
+      }
+    }
+  }
+  rules {
+    rollout_restriction {
+        id = "rule2"
+        invokers = ["USER"] 
+        actions = ["CREATE"]
+        time_windows {
+        time_zone = "America/Los_Angeles"
+        weekly_windows {
+            start_time {
+                hours = "13"
+                minutes = "00"
+                seconds = "00"
+                nanos = "00"
+            }
+            end_time {
+                hours = "14"
+                minutes = "00"
+                seconds = "00"
+                nanos = "00"
+            }
+            days_of_week = ["MONDAY"]
+          }
+
+        one_time_windows {
+        start_time {
+            hours = "15"
+            minutes = "00"
+            seconds = "00"
+            nanos = "00"
+        }
+        end_time {
+            hours = "16"
+            minutes = "00"
+            seconds = "00"
+            nanos = "00"
+        }
+        start_date {
+            year = "2019"
+            month = "01"
+            day = "01"
+        }
+        end_date {
+            year = "2019"
+            month = "12"
+            day = "31"
+        }
+      }
+     }
+    }
+  }
+}
diff --git a/mmv1/third_party/terraform/services/clouddeploy/resource_clouddeploy_automation_test.go b/mmv1/third_party/terraform/services/clouddeploy/resource_clouddeploy_automation_test.go
index f6dc66c1fe38..c891f7505686 100644
--- a/mmv1/third_party/terraform/services/clouddeploy/resource_clouddeploy_automation_test.go
+++ b/mmv1/third_party/terraform/services/clouddeploy/resource_clouddeploy_automation_test.go
@@ -120,6 +120,34 @@ resource "google_clouddeploy_automation" "automation" {
       destination_phase = "stable"
     }
   }
+  rules {
+    repair_rollout_rule {
+      id                    = "repair-rollout"
+      phases                = ["stable"]
+      jobs                  = ["deploy"]
+      repair_phases {
+          retry  {
+                      attempts = "1"
+                      wait     = "200s"
+                      backoff_mode = "BACKOFF_MODE_LINEAR"
+                  }
+       }
+      repair_phases {
+             rollback {
+                         destination_phase = "stable"
+                      }
+          }
+    }
+  }
+  rules {
+    timed_promote_release_rule {
+      id                    = "timed-promote-release"
+      destination_target_id   = "@next"
+      schedule              = "0 9 * * 1"
+      time_zone              = "America/New_York"
+      destination_phase      = "stable"
+    }
+  }
 }
 
 resource "google_clouddeploy_delivery_pipeline" "pipeline" {
diff --git a/mmv1/third_party/terraform/services/clouddeploy/resource_clouddeploy_deploy_policy_test.go b/mmv1/third_party/terraform/services/clouddeploy/resource_clouddeploy_deploy_policy_test.go
new file mode 100644
index 000000000000..3e37ca066579
--- /dev/null
+++ b/mmv1/third_party/terraform/services/clouddeploy/resource_clouddeploy_deploy_policy_test.go
@@ -0,0 +1,150 @@
+package clouddeploy_test
+
+import (
+	"testing"
+
+	"github.com/hashicorp/terraform-plugin-testing/helper/resource"
+
+	"github.com/hashicorp/terraform-provider-google/google/acctest"
+)
+
+func TestAccClouddeployDeployPolicy_update(t *testing.T) {
+	t.Parallel()
+
+	context := map[string]interface{}{
+		"random_suffix": acctest.RandString(t, 10),
+	}
+
+	acctest.VcrTest(t, resource.TestCase{
+		PreCheck:                 func() { acctest.AccTestPreCheck(t) },
+		ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
+		CheckDestroy:             testAccCheckClouddeployDeployPolicyDestroyProducer(t),
+		Steps: []resource.TestStep{
+			{
+				Config: testAccClouddeployDeployPolicy_basic(context),
+			},
+			{
+				ResourceName:            "google_clouddeploy_deploy_policy.deploy_policy",
+				ImportState:             true,
+				ImportStateVerify:       true,
+				ImportStateVerifyIgnore: []string{"location", "annotations", "labels", "terraform_labels"},
+			},
+			{
+				Config: testAccClouddeployDeployPolicy_update(context),
+			},
+			{
+				ResourceName:            "google_clouddeploy_deploy_policy.deploy_policy",
+				ImportState:             true,
+				ImportStateVerify:       true,
+				ImportStateVerifyIgnore: []string{"location", "annotations", "labels", "terraform_labels"},
+			},
+		},
+	})
+}
+
+func testAccClouddeployDeployPolicy_basic(context map[string]interface{}) string {
+	return acctest.Nprintf(`
+resource "google_clouddeploy_deploy_policy" "deploy_policy" {
+  name     = "tf-test-cd-policy%{random_suffix}"
+  location = "us-central1"
+  selectors {
+    delivery_pipeline {
+      id = "tf-test-cd-pipeline%{random_suffix}"
+
+    }
+  }
+  rules {
+    rollout_restriction {
+      id = "rule"
+      time_windows {
+        time_zone = "America/Los_Angeles"
+        weekly_windows {
+            start_time {
+                hours = "12"
+                minutes = "00"
+            }
+            end_time {
+                hours = "13"
+                minutes = "00"
+            }
+        }
+      }
+    }
+  }
+}
+`, context)
+}
+
+func testAccClouddeployDeployPolicy_update(context map[string]interface{}) string {
+	return acctest.Nprintf(`
+resource "google_clouddeploy_deploy_policy" "deploy_policy" {
+  name     = "tf-test-cd-policy%{random_suffix}"
+  location = "us-central1"
+  selectors {
+    delivery_pipeline {
+      id = "tf-test-cd-pipeline%{random_suffix}"
+    }
+  }
+  rules {
+    rollout_restriction {
+      id = "rule"
+      time_windows {
+        time_zone = "America/Los_Angeles"
+        weekly_windows {
+            start_time {
+                hours = "12"
+                minutes = "00"
+            }
+            end_time {
+                hours = "13"
+                minutes = "00"
+            }
+        }
+      }
+    }
+  }
+  rules {
+    rollout_restriction {
+        id = "rule2"
+        invokers = ["USER"] 
+        actions = ["CREATE"]
+        time_windows {
+        time_zone = "America/Los_Angeles"
+        weekly_windows {
+            start_time {
+                hours = "13"
+                minutes = "00"
+            }
+            end_time {
+                hours = "14"
+                minutes = "00"
+            }
+            days_of_week = ["MONDAY"]
+          }
+
+        one_time_windows {
+        start_time {
+            hours = "15"
+            minutes = "00"
+        }
+        end_time {
+            hours = "16"
+            minutes = "00"
+        }
+        start_date {
+            year = "2019"
+            month = "01"
+            day = "01"
+        }
+        end_date {
+            year = "2019"
+            month = "12"
+            day = "31"
+        }
+      }
+     }
+    }
+  }
+}
+`, context)
+}


Reviews:
user: login: slevenick
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T16:35:24Z
user: login: ChrisGe4
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-01T19:06:18Z
user: login: ChrisGe4
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-01T19:06:23Z
user: login: ChrisGe4
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-01T19:06:57Z
user: login: ChrisGe4
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-01T19:10:08Z
user: login: slevenick
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T20:30:59Z

Review comments:
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: slevenick
body: ```suggestion
# Copyright 2025 Google Inc.
```
created_at: 2025-04-01T16:32:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+name: "DeployPolicy"
+description: |
+  A `DeployPolicy` inhibits manual or DeployPolicy-driven actions within a Delivery Pipeline or Target.
+references:
+  guides:
+    "Restrict deploy behavior using policies": "https://cloud.google.com/deploy/docs/deploy-policy"
+  api: "https://cloud.google.com/deploy/docs/api/reference/rest/v1/projects.locations.deployPolicies"
+docs:
+id_format: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+base_url: "projects/{{project}}/locations/{{location}}/deployPolicies"
+self_link: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+create_url: "projects/{{project}}/locations/{{location}}/deployPolicies?deployPolicyId={{name}}"
+update_verb: "PATCH"
+update_mask: true
+import_format:
+  - "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+timeouts:
+  insert_minutes: 20
+  update_minutes: 20
+  delete_minutes: 20
+autogen_async: true
+async:
+  actions: ["create", "delete", "update"]
+  type: "OpAsync"
+  operation:
+    base_url: "{{op_id}}"
+  result:
+    resource_inside_response: false
+custom_code:
+examples:
+  - name: "clouddeploy_deploy_policy_basic"
+    primary_resource_id: "b-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+  - name: "clouddeploy_deploy_policy_full"
+    primary_resource_id: "f-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+parameters:
+  - name: "location"
+    type: String
+    description: "The location for the resource"
+    url_param_only: true
+    required: true
+    immutable: true
+properties:
+  - name: "name"
+    type: String
+    description: "Name of the `DeployPolicy`."
+    url_param_only: true
+    required: true
+    immutable: true
+  - name: "uid"
+    type: String
+    description: "Output only. Unique identifier of the `DeployPolicy`."
+    output: true
+  - name: "description"
+    type: String
+    description: "Optional. Description of the `DeployPolicy`. Max length is 255 characters."
+  - name: "createTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was created."
+    output: true
+  - name: "updateTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was updated."
+    output: true
+  - name: "annotations"
+    type: KeyValueAnnotations
+    description: "Optional. User annotations. These attributes can only be set and used by the user, and not by Cloud Deploy. Annotations must meet the following constraints: * Annotations are key/value pairs. * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (`/`). * The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. * The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots(`.`), not longer than 253 characters in total, followed by a slash (`/`). See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set for more details."
+  - name: "labels"
+    type: KeyValueLabels
+    description: "Optional. Labels are attributes that can be set and used by both the user and by Cloud Deploy. Labels must meet the following constraints: * Keys and values can contain only lowercase letters, numeric characters, underscores, and dashes. * All characters must use UTF-8 encoding, and international characters are allowed. * Keys must start with a lowercase letter or international character. * Each resource is limited to a maximum of 64 labels. Both keys and values are additionally constrained to be <= 63 characters."
+  - name: "etag"
+    type: String
+    description: "Optional. The weak etag of the `DeployPolicy` resource. This checksum is computed by the server based on the value of other fields, and may be sent on update and delete requests to ensure the client has an up-to-date value before proceeding."
+    output: true
+  - name: "suspended"
+    type: Boolean
+    description: "Optional. When suspended, the policy will not prevent actions from occurring, even if the action violates the policy."
+    send_empty_value: true
+  - name: "selectors"
+    type: Array
+    description: "Required. Selected resources to which the policy will be applied. At least one selector is required. If one selector matches the resource the policy applies. For example, if there are two selectors and the action being attempted matches one of them, the policy will apply to that action."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "target"
+          type: NestedObject
+          description: "Contains attributes about a target."
+          properties:
+            - name: "id"
+              type: String
+              description: 'ID of the `Target`. The value of this field could be one of the following: * The last segment of a target name. It only needs the ID to determine which target is being referred to * "*", all targets in a location.'
+            - name: "labels"
+              type: KeyValuePairs
+              description: "Target labels."
+              default_from_api: true
+        - name: "deliveryPipeline"
+          type: NestedObject
+          description: "Contains attributes about a delivery pipeline."
+          properties:
+            - name: "id"
+              type: String
+              description: |-
+                Optional. ID of the DeliveryPipeline. The value of this field could be one of the following:
+                - The last segment of a pipeline name
+                - "*", all delivery pipelines in a location
+            - name: "labels"
+              type: KeyValuePairs
+              description: "DeliveryPipeline labels."
+              default_from_api: true
+  - name: "rules"
+    type: Array
+    description: "Required. Rules to apply. At least one rule must be present."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "rolloutRestriction"
+          type: NestedObject
+          description: "Optional. Rollout restrictions."
+          properties:
+            - name: "id"
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `DeployPolicy` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: "invokers"
+              type: Array
+              description: "Optional. What invoked the action. If left empty, all invoker types will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "INVOKER_UNSPECIFIED"
+                  - "USER"
+                  - "DEPLOY_AUTOMATION"
+            - name: "actions"
+              type: Array
+              description: "Optional. Rollout actions to be restricted as part of the policy. If left empty, all actions will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "ROLLOUT_ACTIONS_UNSPECIFIED"
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: slevenick
body: _UNSPECIFIED is probably an invalid option to specify. I would remove this
created_at: 2025-04-01T16:33:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+name: "DeployPolicy"
+description: |
+  A `DeployPolicy` inhibits manual or DeployPolicy-driven actions within a Delivery Pipeline or Target.
+references:
+  guides:
+    "Restrict deploy behavior using policies": "https://cloud.google.com/deploy/docs/deploy-policy"
+  api: "https://cloud.google.com/deploy/docs/api/reference/rest/v1/projects.locations.deployPolicies"
+docs:
+id_format: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+base_url: "projects/{{project}}/locations/{{location}}/deployPolicies"
+self_link: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+create_url: "projects/{{project}}/locations/{{location}}/deployPolicies?deployPolicyId={{name}}"
+update_verb: "PATCH"
+update_mask: true
+import_format:
+  - "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+timeouts:
+  insert_minutes: 20
+  update_minutes: 20
+  delete_minutes: 20
+autogen_async: true
+async:
+  actions: ["create", "delete", "update"]
+  type: "OpAsync"
+  operation:
+    base_url: "{{op_id}}"
+  result:
+    resource_inside_response: false
+custom_code:
+examples:
+  - name: "clouddeploy_deploy_policy_basic"
+    primary_resource_id: "b-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+  - name: "clouddeploy_deploy_policy_full"
+    primary_resource_id: "f-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+parameters:
+  - name: "location"
+    type: String
+    description: "The location for the resource"
+    url_param_only: true
+    required: true
+    immutable: true
+properties:
+  - name: "name"
+    type: String
+    description: "Name of the `DeployPolicy`."
+    url_param_only: true
+    required: true
+    immutable: true
+  - name: "uid"
+    type: String
+    description: "Output only. Unique identifier of the `DeployPolicy`."
+    output: true
+  - name: "description"
+    type: String
+    description: "Optional. Description of the `DeployPolicy`. Max length is 255 characters."
+  - name: "createTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was created."
+    output: true
+  - name: "updateTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was updated."
+    output: true
+  - name: "annotations"
+    type: KeyValueAnnotations
+    description: "Optional. User annotations. These attributes can only be set and used by the user, and not by Cloud Deploy. Annotations must meet the following constraints: * Annotations are key/value pairs. * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (`/`). * The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. * The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots(`.`), not longer than 253 characters in total, followed by a slash (`/`). See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set for more details."
+  - name: "labels"
+    type: KeyValueLabels
+    description: "Optional. Labels are attributes that can be set and used by both the user and by Cloud Deploy. Labels must meet the following constraints: * Keys and values can contain only lowercase letters, numeric characters, underscores, and dashes. * All characters must use UTF-8 encoding, and international characters are allowed. * Keys must start with a lowercase letter or international character. * Each resource is limited to a maximum of 64 labels. Both keys and values are additionally constrained to be <= 63 characters."
+  - name: "etag"
+    type: String
+    description: "Optional. The weak etag of the `DeployPolicy` resource. This checksum is computed by the server based on the value of other fields, and may be sent on update and delete requests to ensure the client has an up-to-date value before proceeding."
+    output: true
+  - name: "suspended"
+    type: Boolean
+    description: "Optional. When suspended, the policy will not prevent actions from occurring, even if the action violates the policy."
+    send_empty_value: true
+  - name: "selectors"
+    type: Array
+    description: "Required. Selected resources to which the policy will be applied. At least one selector is required. If one selector matches the resource the policy applies. For example, if there are two selectors and the action being attempted matches one of them, the policy will apply to that action."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "target"
+          type: NestedObject
+          description: "Contains attributes about a target."
+          properties:
+            - name: "id"
+              type: String
+              description: 'ID of the `Target`. The value of this field could be one of the following: * The last segment of a target name. It only needs the ID to determine which target is being referred to * "*", all targets in a location.'
+            - name: "labels"
+              type: KeyValuePairs
+              description: "Target labels."
+              default_from_api: true
+        - name: "deliveryPipeline"
+          type: NestedObject
+          description: "Contains attributes about a delivery pipeline."
+          properties:
+            - name: "id"
+              type: String
+              description: |-
+                Optional. ID of the DeliveryPipeline. The value of this field could be one of the following:
+                - The last segment of a pipeline name
+                - "*", all delivery pipelines in a location
+            - name: "labels"
+              type: KeyValuePairs
+              description: "DeliveryPipeline labels."
+              default_from_api: true
+  - name: "rules"
+    type: Array
+    description: "Required. Rules to apply. At least one rule must be present."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "rolloutRestriction"
+          type: NestedObject
+          description: "Optional. Rollout restrictions."
+          properties:
+            - name: "id"
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `DeployPolicy` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: "invokers"
+              type: Array
+              description: "Optional. What invoked the action. If left empty, all invoker types will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "INVOKER_UNSPECIFIED"
+                  - "USER"
+                  - "DEPLOY_AUTOMATION"
+            - name: "actions"
+              type: Array
+              description: "Optional. Rollout actions to be restricted as part of the policy. If left empty, all actions will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "ROLLOUT_ACTIONS_UNSPECIFIED"
+                  - "ADVANCE"
+                  - "APPROVE"
+                  - "CANCEL"
+                  - "CREATE"
+                  - "IGNORE_JOB"
+                  - "RETRY_JOB"
+                  - "ROLLBACK"
+                  - "TERMINATE_JOBRUN"
+            - name: "timeWindows"
+              type: NestedObject
+              description: "Required. Time window within which actions are restricted."
+              properties:
+                - name: "timeZone"
+                  type: String
+                  description: "Required. The time zone in IANA format IANA Time Zone Database (e.g. America/New_York)."
+                  required: true
+                - name: oneTimeWindows
+                  type: Array
+                  description: "Optional. One-time windows within which actions are restricted."
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "startDate"
+                        type: NestedObject
+                        description: "Required. Start date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
+
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
+
+                      - name: "endDate"
+                        type: NestedObject
+                        description: "Required. End date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: slevenick
body: Can you write a test that specifies 0 for this? 0 values tend to cause problems, so I'd like to make sure it's working correctly. Especially this case:
end_date set with month = 1
end_date updated to month = 0
created_at: 2025-04-01T16:34:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+name: "DeployPolicy"
+description: |
+  A `DeployPolicy` inhibits manual or DeployPolicy-driven actions within a Delivery Pipeline or Target.
+references:
+  guides:
+    "Restrict deploy behavior using policies": "https://cloud.google.com/deploy/docs/deploy-policy"
+  api: "https://cloud.google.com/deploy/docs/api/reference/rest/v1/projects.locations.deployPolicies"
+docs:
+id_format: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+base_url: "projects/{{project}}/locations/{{location}}/deployPolicies"
+self_link: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+create_url: "projects/{{project}}/locations/{{location}}/deployPolicies?deployPolicyId={{name}}"
+update_verb: "PATCH"
+update_mask: true
+import_format:
+  - "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+timeouts:
+  insert_minutes: 20
+  update_minutes: 20
+  delete_minutes: 20
+autogen_async: true
+async:
+  actions: ["create", "delete", "update"]
+  type: "OpAsync"
+  operation:
+    base_url: "{{op_id}}"
+  result:
+    resource_inside_response: false
+custom_code:
+examples:
+  - name: "clouddeploy_deploy_policy_basic"
+    primary_resource_id: "b-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+  - name: "clouddeploy_deploy_policy_full"
+    primary_resource_id: "f-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+parameters:
+  - name: "location"
+    type: String
+    description: "The location for the resource"
+    url_param_only: true
+    required: true
+    immutable: true
+properties:
+  - name: "name"
+    type: String
+    description: "Name of the `DeployPolicy`."
+    url_param_only: true
+    required: true
+    immutable: true
+  - name: "uid"
+    type: String
+    description: "Output only. Unique identifier of the `DeployPolicy`."
+    output: true
+  - name: "description"
+    type: String
+    description: "Optional. Description of the `DeployPolicy`. Max length is 255 characters."
+  - name: "createTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was created."
+    output: true
+  - name: "updateTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was updated."
+    output: true
+  - name: "annotations"
+    type: KeyValueAnnotations
+    description: "Optional. User annotations. These attributes can only be set and used by the user, and not by Cloud Deploy. Annotations must meet the following constraints: * Annotations are key/value pairs. * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (`/`). * The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. * The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots(`.`), not longer than 253 characters in total, followed by a slash (`/`). See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set for more details."
+  - name: "labels"
+    type: KeyValueLabels
+    description: "Optional. Labels are attributes that can be set and used by both the user and by Cloud Deploy. Labels must meet the following constraints: * Keys and values can contain only lowercase letters, numeric characters, underscores, and dashes. * All characters must use UTF-8 encoding, and international characters are allowed. * Keys must start with a lowercase letter or international character. * Each resource is limited to a maximum of 64 labels. Both keys and values are additionally constrained to be <= 63 characters."
+  - name: "etag"
+    type: String
+    description: "Optional. The weak etag of the `DeployPolicy` resource. This checksum is computed by the server based on the value of other fields, and may be sent on update and delete requests to ensure the client has an up-to-date value before proceeding."
+    output: true
+  - name: "suspended"
+    type: Boolean
+    description: "Optional. When suspended, the policy will not prevent actions from occurring, even if the action violates the policy."
+    send_empty_value: true
+  - name: "selectors"
+    type: Array
+    description: "Required. Selected resources to which the policy will be applied. At least one selector is required. If one selector matches the resource the policy applies. For example, if there are two selectors and the action being attempted matches one of them, the policy will apply to that action."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "target"
+          type: NestedObject
+          description: "Contains attributes about a target."
+          properties:
+            - name: "id"
+              type: String
+              description: 'ID of the `Target`. The value of this field could be one of the following: * The last segment of a target name. It only needs the ID to determine which target is being referred to * "*", all targets in a location.'
+            - name: "labels"
+              type: KeyValuePairs
+              description: "Target labels."
+              default_from_api: true
+        - name: "deliveryPipeline"
+          type: NestedObject
+          description: "Contains attributes about a delivery pipeline."
+          properties:
+            - name: "id"
+              type: String
+              description: |-
+                Optional. ID of the DeliveryPipeline. The value of this field could be one of the following:
+                - The last segment of a pipeline name
+                - "*", all delivery pipelines in a location
+            - name: "labels"
+              type: KeyValuePairs
+              description: "DeliveryPipeline labels."
+              default_from_api: true
+  - name: "rules"
+    type: Array
+    description: "Required. Rules to apply. At least one rule must be present."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "rolloutRestriction"
+          type: NestedObject
+          description: "Optional. Rollout restrictions."
+          properties:
+            - name: "id"
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `DeployPolicy` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: "invokers"
+              type: Array
+              description: "Optional. What invoked the action. If left empty, all invoker types will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "INVOKER_UNSPECIFIED"
+                  - "USER"
+                  - "DEPLOY_AUTOMATION"
+            - name: "actions"
+              type: Array
+              description: "Optional. Rollout actions to be restricted as part of the policy. If left empty, all actions will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "ROLLOUT_ACTIONS_UNSPECIFIED"
+                  - "ADVANCE"
+                  - "APPROVE"
+                  - "CANCEL"
+                  - "CREATE"
+                  - "IGNORE_JOB"
+                  - "RETRY_JOB"
+                  - "ROLLBACK"
+                  - "TERMINATE_JOBRUN"
+            - name: "timeWindows"
+              type: NestedObject
+              description: "Required. Time window within which actions are restricted."
+              properties:
+                - name: "timeZone"
+                  type: String
+                  description: "Required. The time zone in IANA format IANA Time Zone Database (e.g. America/New_York)."
+                  required: true
+                - name: oneTimeWindows
+                  type: Array
+                  description: "Optional. One-time windows within which actions are restricted."
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "startDate"
+                        type: NestedObject
+                        description: "Required. Start date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
+
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
+
+                      - name: "endDate"
+                        type: NestedObject
+                        description: "Required. End date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
+
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
+
+                      - name: "startTime"
+                        type: NestedObject
+                        description: "Required. Start time (inclusive). Use 00:00 for the beginning of the day."
+                        required: true
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
+
+                      - name: "endTime"
+                        type: NestedObject
+                        description: "Required. End time (exclusive). You may use 24:00 for the end of the day."
+                        required: true
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
+                - name: weeklyWindows
+                  type: Array
+                  description: "Optional. Recurring weekly windows within which actions are restricted."
+
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "daysOfWeek"
+                        type: Array
+                        description: "Optional. Days of week. If left empty, all days of the week will be included."
+                        item_type:
+                          type: Enum
+                          enum_values:
+                            - "DAY_OF_WEEK_UNSPECIFIED"
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: slevenick
body: UNSPECIFIED probably invalid
created_at: 2025-04-01T16:34:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+name: "DeployPolicy"
+description: |
+  A `DeployPolicy` inhibits manual or DeployPolicy-driven actions within a Delivery Pipeline or Target.
+references:
+  guides:
+    "Restrict deploy behavior using policies": "https://cloud.google.com/deploy/docs/deploy-policy"
+  api: "https://cloud.google.com/deploy/docs/api/reference/rest/v1/projects.locations.deployPolicies"
+docs:
+id_format: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+base_url: "projects/{{project}}/locations/{{location}}/deployPolicies"
+self_link: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+create_url: "projects/{{project}}/locations/{{location}}/deployPolicies?deployPolicyId={{name}}"
+update_verb: "PATCH"
+update_mask: true
+import_format:
+  - "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+timeouts:
+  insert_minutes: 20
+  update_minutes: 20
+  delete_minutes: 20
+autogen_async: true
+async:
+  actions: ["create", "delete", "update"]
+  type: "OpAsync"
+  operation:
+    base_url: "{{op_id}}"
+  result:
+    resource_inside_response: false
+custom_code:
+examples:
+  - name: "clouddeploy_deploy_policy_basic"
+    primary_resource_id: "b-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+  - name: "clouddeploy_deploy_policy_full"
+    primary_resource_id: "f-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+parameters:
+  - name: "location"
+    type: String
+    description: "The location for the resource"
+    url_param_only: true
+    required: true
+    immutable: true
+properties:
+  - name: "name"
+    type: String
+    description: "Name of the `DeployPolicy`."
+    url_param_only: true
+    required: true
+    immutable: true
+  - name: "uid"
+    type: String
+    description: "Output only. Unique identifier of the `DeployPolicy`."
+    output: true
+  - name: "description"
+    type: String
+    description: "Optional. Description of the `DeployPolicy`. Max length is 255 characters."
+  - name: "createTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was created."
+    output: true
+  - name: "updateTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was updated."
+    output: true
+  - name: "annotations"
+    type: KeyValueAnnotations
+    description: "Optional. User annotations. These attributes can only be set and used by the user, and not by Cloud Deploy. Annotations must meet the following constraints: * Annotations are key/value pairs. * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (`/`). * The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. * The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots(`.`), not longer than 253 characters in total, followed by a slash (`/`). See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set for more details."
+  - name: "labels"
+    type: KeyValueLabels
+    description: "Optional. Labels are attributes that can be set and used by both the user and by Cloud Deploy. Labels must meet the following constraints: * Keys and values can contain only lowercase letters, numeric characters, underscores, and dashes. * All characters must use UTF-8 encoding, and international characters are allowed. * Keys must start with a lowercase letter or international character. * Each resource is limited to a maximum of 64 labels. Both keys and values are additionally constrained to be <= 63 characters."
+  - name: "etag"
+    type: String
+    description: "Optional. The weak etag of the `DeployPolicy` resource. This checksum is computed by the server based on the value of other fields, and may be sent on update and delete requests to ensure the client has an up-to-date value before proceeding."
+    output: true
+  - name: "suspended"
+    type: Boolean
+    description: "Optional. When suspended, the policy will not prevent actions from occurring, even if the action violates the policy."
+    send_empty_value: true
+  - name: "selectors"
+    type: Array
+    description: "Required. Selected resources to which the policy will be applied. At least one selector is required. If one selector matches the resource the policy applies. For example, if there are two selectors and the action being attempted matches one of them, the policy will apply to that action."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "target"
+          type: NestedObject
+          description: "Contains attributes about a target."
+          properties:
+            - name: "id"
+              type: String
+              description: 'ID of the `Target`. The value of this field could be one of the following: * The last segment of a target name. It only needs the ID to determine which target is being referred to * "*", all targets in a location.'
+            - name: "labels"
+              type: KeyValuePairs
+              description: "Target labels."
+              default_from_api: true
+        - name: "deliveryPipeline"
+          type: NestedObject
+          description: "Contains attributes about a delivery pipeline."
+          properties:
+            - name: "id"
+              type: String
+              description: |-
+                Optional. ID of the DeliveryPipeline. The value of this field could be one of the following:
+                - The last segment of a pipeline name
+                - "*", all delivery pipelines in a location
+            - name: "labels"
+              type: KeyValuePairs
+              description: "DeliveryPipeline labels."
+              default_from_api: true
+  - name: "rules"
+    type: Array
+    description: "Required. Rules to apply. At least one rule must be present."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "rolloutRestriction"
+          type: NestedObject
+          description: "Optional. Rollout restrictions."
+          properties:
+            - name: "id"
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `DeployPolicy` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: "invokers"
+              type: Array
+              description: "Optional. What invoked the action. If left empty, all invoker types will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "INVOKER_UNSPECIFIED"
+                  - "USER"
+                  - "DEPLOY_AUTOMATION"
+            - name: "actions"
+              type: Array
+              description: "Optional. Rollout actions to be restricted as part of the policy. If left empty, all actions will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "ROLLOUT_ACTIONS_UNSPECIFIED"
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: ChrisGe4
body: Done
created_at: 2025-04-01T19:06:18Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: ChrisGe4
body: Done
created_at: 2025-04-01T19:06:23Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+name: "DeployPolicy"
+description: |
+  A `DeployPolicy` inhibits manual or DeployPolicy-driven actions within a Delivery Pipeline or Target.
+references:
+  guides:
+    "Restrict deploy behavior using policies": "https://cloud.google.com/deploy/docs/deploy-policy"
+  api: "https://cloud.google.com/deploy/docs/api/reference/rest/v1/projects.locations.deployPolicies"
+docs:
+id_format: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+base_url: "projects/{{project}}/locations/{{location}}/deployPolicies"
+self_link: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+create_url: "projects/{{project}}/locations/{{location}}/deployPolicies?deployPolicyId={{name}}"
+update_verb: "PATCH"
+update_mask: true
+import_format:
+  - "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+timeouts:
+  insert_minutes: 20
+  update_minutes: 20
+  delete_minutes: 20
+autogen_async: true
+async:
+  actions: ["create", "delete", "update"]
+  type: "OpAsync"
+  operation:
+    base_url: "{{op_id}}"
+  result:
+    resource_inside_response: false
+custom_code:
+examples:
+  - name: "clouddeploy_deploy_policy_basic"
+    primary_resource_id: "b-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+  - name: "clouddeploy_deploy_policy_full"
+    primary_resource_id: "f-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+parameters:
+  - name: "location"
+    type: String
+    description: "The location for the resource"
+    url_param_only: true
+    required: true
+    immutable: true
+properties:
+  - name: "name"
+    type: String
+    description: "Name of the `DeployPolicy`."
+    url_param_only: true
+    required: true
+    immutable: true
+  - name: "uid"
+    type: String
+    description: "Output only. Unique identifier of the `DeployPolicy`."
+    output: true
+  - name: "description"
+    type: String
+    description: "Optional. Description of the `DeployPolicy`. Max length is 255 characters."
+  - name: "createTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was created."
+    output: true
+  - name: "updateTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was updated."
+    output: true
+  - name: "annotations"
+    type: KeyValueAnnotations
+    description: "Optional. User annotations. These attributes can only be set and used by the user, and not by Cloud Deploy. Annotations must meet the following constraints: * Annotations are key/value pairs. * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (`/`). * The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. * The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots(`.`), not longer than 253 characters in total, followed by a slash (`/`). See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set for more details."
+  - name: "labels"
+    type: KeyValueLabels
+    description: "Optional. Labels are attributes that can be set and used by both the user and by Cloud Deploy. Labels must meet the following constraints: * Keys and values can contain only lowercase letters, numeric characters, underscores, and dashes. * All characters must use UTF-8 encoding, and international characters are allowed. * Keys must start with a lowercase letter or international character. * Each resource is limited to a maximum of 64 labels. Both keys and values are additionally constrained to be <= 63 characters."
+  - name: "etag"
+    type: String
+    description: "Optional. The weak etag of the `DeployPolicy` resource. This checksum is computed by the server based on the value of other fields, and may be sent on update and delete requests to ensure the client has an up-to-date value before proceeding."
+    output: true
+  - name: "suspended"
+    type: Boolean
+    description: "Optional. When suspended, the policy will not prevent actions from occurring, even if the action violates the policy."
+    send_empty_value: true
+  - name: "selectors"
+    type: Array
+    description: "Required. Selected resources to which the policy will be applied. At least one selector is required. If one selector matches the resource the policy applies. For example, if there are two selectors and the action being attempted matches one of them, the policy will apply to that action."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "target"
+          type: NestedObject
+          description: "Contains attributes about a target."
+          properties:
+            - name: "id"
+              type: String
+              description: 'ID of the `Target`. The value of this field could be one of the following: * The last segment of a target name. It only needs the ID to determine which target is being referred to * "*", all targets in a location.'
+            - name: "labels"
+              type: KeyValuePairs
+              description: "Target labels."
+              default_from_api: true
+        - name: "deliveryPipeline"
+          type: NestedObject
+          description: "Contains attributes about a delivery pipeline."
+          properties:
+            - name: "id"
+              type: String
+              description: |-
+                Optional. ID of the DeliveryPipeline. The value of this field could be one of the following:
+                - The last segment of a pipeline name
+                - "*", all delivery pipelines in a location
+            - name: "labels"
+              type: KeyValuePairs
+              description: "DeliveryPipeline labels."
+              default_from_api: true
+  - name: "rules"
+    type: Array
+    description: "Required. Rules to apply. At least one rule must be present."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "rolloutRestriction"
+          type: NestedObject
+          description: "Optional. Rollout restrictions."
+          properties:
+            - name: "id"
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `DeployPolicy` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: "invokers"
+              type: Array
+              description: "Optional. What invoked the action. If left empty, all invoker types will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "INVOKER_UNSPECIFIED"
+                  - "USER"
+                  - "DEPLOY_AUTOMATION"
+            - name: "actions"
+              type: Array
+              description: "Optional. Rollout actions to be restricted as part of the policy. If left empty, all actions will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "ROLLOUT_ACTIONS_UNSPECIFIED"
+                  - "ADVANCE"
+                  - "APPROVE"
+                  - "CANCEL"
+                  - "CREATE"
+                  - "IGNORE_JOB"
+                  - "RETRY_JOB"
+                  - "ROLLBACK"
+                  - "TERMINATE_JOBRUN"
+            - name: "timeWindows"
+              type: NestedObject
+              description: "Required. Time window within which actions are restricted."
+              properties:
+                - name: "timeZone"
+                  type: String
+                  description: "Required. The time zone in IANA format IANA Time Zone Database (e.g. America/New_York)."
+                  required: true
+                - name: oneTimeWindows
+                  type: Array
+                  description: "Optional. One-time windows within which actions are restricted."
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "startDate"
+                        type: NestedObject
+                        description: "Required. Start date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
+
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
+
+                      - name: "endDate"
+                        type: NestedObject
+                        description: "Required. End date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
+
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
+
+                      - name: "startTime"
+                        type: NestedObject
+                        description: "Required. Start time (inclusive). Use 00:00 for the beginning of the day."
+                        required: true
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
+
+                      - name: "endTime"
+                        type: NestedObject
+                        description: "Required. End time (exclusive). You may use 24:00 for the end of the day."
+                        required: true
+                        properties:
+                          - name: "hours"
+                            type: Integer
+                            description: 'Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value "24:00:00" for scenarios like business closing time.'
+
+                          - name: minutes
+                            type: Integer
+                            description: "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59."
+
+                          - name: seconds
+                            type: Integer
+                            description: "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
+
+                          - name: nanos
+                            type: Integer
+                            description: "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999."
+                - name: weeklyWindows
+                  type: Array
+                  description: "Optional. Recurring weekly windows within which actions are restricted."
+
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "daysOfWeek"
+                        type: Array
+                        description: "Optional. Days of week. If left empty, all days of the week will be included."
+                        item_type:
+                          type: Enum
+                          enum_values:
+                            - "DAY_OF_WEEK_UNSPECIFIED"
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: ChrisGe4
body: Done
created_at: 2025-04-01T19:06:57Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,319 @@
+# Copyright 2024 Google Inc.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+name: "DeployPolicy"
+description: |
+  A `DeployPolicy` inhibits manual or DeployPolicy-driven actions within a Delivery Pipeline or Target.
+references:
+  guides:
+    "Restrict deploy behavior using policies": "https://cloud.google.com/deploy/docs/deploy-policy"
+  api: "https://cloud.google.com/deploy/docs/api/reference/rest/v1/projects.locations.deployPolicies"
+docs:
+id_format: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+base_url: "projects/{{project}}/locations/{{location}}/deployPolicies"
+self_link: "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+create_url: "projects/{{project}}/locations/{{location}}/deployPolicies?deployPolicyId={{name}}"
+update_verb: "PATCH"
+update_mask: true
+import_format:
+  - "projects/{{project}}/locations/{{location}}/deployPolicies/{{name}}"
+timeouts:
+  insert_minutes: 20
+  update_minutes: 20
+  delete_minutes: 20
+autogen_async: true
+async:
+  actions: ["create", "delete", "update"]
+  type: "OpAsync"
+  operation:
+    base_url: "{{op_id}}"
+  result:
+    resource_inside_response: false
+custom_code:
+examples:
+  - name: "clouddeploy_deploy_policy_basic"
+    primary_resource_id: "b-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+  - name: "clouddeploy_deploy_policy_full"
+    primary_resource_id: "f-deploy-policy"
+    vars:
+      policy: "cd-policy"
+      delivery_pipeline: "cd-pipeline"
+parameters:
+  - name: "location"
+    type: String
+    description: "The location for the resource"
+    url_param_only: true
+    required: true
+    immutable: true
+properties:
+  - name: "name"
+    type: String
+    description: "Name of the `DeployPolicy`."
+    url_param_only: true
+    required: true
+    immutable: true
+  - name: "uid"
+    type: String
+    description: "Output only. Unique identifier of the `DeployPolicy`."
+    output: true
+  - name: "description"
+    type: String
+    description: "Optional. Description of the `DeployPolicy`. Max length is 255 characters."
+  - name: "createTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was created."
+    output: true
+  - name: "updateTime"
+    type: String
+    description: "Output only. Time at which the DeployPolicy was updated."
+    output: true
+  - name: "annotations"
+    type: KeyValueAnnotations
+    description: "Optional. User annotations. These attributes can only be set and used by the user, and not by Cloud Deploy. Annotations must meet the following constraints: * Annotations are key/value pairs. * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (`/`). * The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character (`[a-z0-9A-Z]`) with dashes (`-`), underscores (`_`), dots (`.`), and alphanumerics between. * The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots(`.`), not longer than 253 characters in total, followed by a slash (`/`). See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set for more details."
+  - name: "labels"
+    type: KeyValueLabels
+    description: "Optional. Labels are attributes that can be set and used by both the user and by Cloud Deploy. Labels must meet the following constraints: * Keys and values can contain only lowercase letters, numeric characters, underscores, and dashes. * All characters must use UTF-8 encoding, and international characters are allowed. * Keys must start with a lowercase letter or international character. * Each resource is limited to a maximum of 64 labels. Both keys and values are additionally constrained to be <= 63 characters."
+  - name: "etag"
+    type: String
+    description: "Optional. The weak etag of the `DeployPolicy` resource. This checksum is computed by the server based on the value of other fields, and may be sent on update and delete requests to ensure the client has an up-to-date value before proceeding."
+    output: true
+  - name: "suspended"
+    type: Boolean
+    description: "Optional. When suspended, the policy will not prevent actions from occurring, even if the action violates the policy."
+    send_empty_value: true
+  - name: "selectors"
+    type: Array
+    description: "Required. Selected resources to which the policy will be applied. At least one selector is required. If one selector matches the resource the policy applies. For example, if there are two selectors and the action being attempted matches one of them, the policy will apply to that action."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "target"
+          type: NestedObject
+          description: "Contains attributes about a target."
+          properties:
+            - name: "id"
+              type: String
+              description: 'ID of the `Target`. The value of this field could be one of the following: * The last segment of a target name. It only needs the ID to determine which target is being referred to * "*", all targets in a location.'
+            - name: "labels"
+              type: KeyValuePairs
+              description: "Target labels."
+              default_from_api: true
+        - name: "deliveryPipeline"
+          type: NestedObject
+          description: "Contains attributes about a delivery pipeline."
+          properties:
+            - name: "id"
+              type: String
+              description: |-
+                Optional. ID of the DeliveryPipeline. The value of this field could be one of the following:
+                - The last segment of a pipeline name
+                - "*", all delivery pipelines in a location
+            - name: "labels"
+              type: KeyValuePairs
+              description: "DeliveryPipeline labels."
+              default_from_api: true
+  - name: "rules"
+    type: Array
+    description: "Required. Rules to apply. At least one rule must be present."
+    required: true
+    item_type:
+      type: NestedObject
+      properties:
+        - name: "rolloutRestriction"
+          type: NestedObject
+          description: "Optional. Rollout restrictions."
+          properties:
+            - name: "id"
+              type: String
+              description: "Required. ID of the rule. This id must be unique in the `DeployPolicy` resource to which this rule belongs. The format is `a-z{0,62}`."
+              required: true
+            - name: "invokers"
+              type: Array
+              description: "Optional. What invoked the action. If left empty, all invoker types will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "INVOKER_UNSPECIFIED"
+                  - "USER"
+                  - "DEPLOY_AUTOMATION"
+            - name: "actions"
+              type: Array
+              description: "Optional. Rollout actions to be restricted as part of the policy. If left empty, all actions will be restricted."
+              item_type:
+                type: Enum
+                enum_values:
+                  - "ROLLOUT_ACTIONS_UNSPECIFIED"
+                  - "ADVANCE"
+                  - "APPROVE"
+                  - "CANCEL"
+                  - "CREATE"
+                  - "IGNORE_JOB"
+                  - "RETRY_JOB"
+                  - "ROLLBACK"
+                  - "TERMINATE_JOBRUN"
+            - name: "timeWindows"
+              type: NestedObject
+              description: "Required. Time window within which actions are restricted."
+              properties:
+                - name: "timeZone"
+                  type: String
+                  description: "Required. The time zone in IANA format IANA Time Zone Database (e.g. America/New_York)."
+                  required: true
+                - name: oneTimeWindows
+                  type: Array
+                  description: "Optional. One-time windows within which actions are restricted."
+                  item_type:
+                    type: NestedObject
+                    properties:
+                      - name: "startDate"
+                        type: NestedObject
+                        description: "Required. Start date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
+
+                          - name: day
+                            type: Integer
+                            description: "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
+
+                      - name: "endDate"
+                        type: NestedObject
+                        description: "Required. End date."
+                        required: true
+                        properties:
+                          - name: "year"
+                            type: Integer
+                            description: "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
+
+                          - name: month
+                            type: Integer
+                            description: "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
path: mmv1/products/clouddeploy/DeployPolicy.yaml
user: login: ChrisGe4
body: The description is generated from the shared Date message. In Deploy Policy, 0 is not allowed, so I adjusted the description.
created_at: 2025-04-01T19:10:08Z
author_association: MEMBER

PR comments:
user: login: github-actions[bot]
created_at: 2025-03-31T22:26:23Z
body: Hello! I am a robot. Tests will require approval from a repository maintainer to run. Googlers: see go/terraform-auto-test-runs to set up automatic test runs.

@slevenick, a repository maintainer, has been assigned to [review your changes](https://googlecloudplatform.github.io/magic-modules/contribute/review-pr/). If you have not received review feedback within 2 business days, please leave a comment on this PR asking them to take a look.

You can help make sure that review is quick by [doing a self-review](https://googlecloudplatform.github.io/magic-modules/contribute/review-pr/) and by [running impacted tests locally](https://googlecloudplatform.github.io/magic-modules/get-started/run-provider-tests/).

author_association: NONE
user: login: modular-magician
created_at: 2025-03-31T22:38:13Z
body: Hi there, I'm the Modular magician. I've detected the following information about your changes:

## Diff report

Your PR generated some diffs in downstreams - here they are.

`google` provider: [Diff](https://github.com/modular-magician/terraform-provider-google/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4093 insertions(+), 6 deletions(-))
`google-beta` provider: [Diff](https://github.com/modular-magician/terraform-provider-google-beta/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4093 insertions(+), 6 deletions(-))
`terraform-google-conversion`: [Diff](https://github.com/modular-magician/terraform-google-conversion/compare/auto-pr-13494-old..auto-pr-13494) ( 2 files changed, 987 insertions(+))
Open in Cloud Shell: [Diff](https://github.com/modular-magician/docs-examples/compare/auto-pr-13494-old..auto-pr-13494) ( 8 files changed, 298 insertions(+))



## Missing test report
Your PR includes resource fields which are not covered by any test.

Resource: `google_clouddeploy_automation` (4 total tests)
Please add an acceptance test which includes these fields. The test should include the following:

```hcl
resource "google_clouddeploy_automation" "primary" {
  rules {
    repair_rollout_rule {
      repair_phases {
        rollback {
          disable_rollback_if_rollout_pending = # value needed
        }
      }
    }
  }
}


```
Resource: `google_clouddeploy_deploy_policy` (4 total tests)
Please add an acceptance test which includes these fields. The test should include the following:

```hcl
resource "google_clouddeploy_deploy_policy" "primary" {
  annotations = # value needed
  description = # value needed
  labels      = # value needed
  rules {
    rollout_restriction {
      time_windows {
        one_time_windows {
          end_time {
            nanos   = # value needed
            seconds = # value needed
          }
          start_time {
            nanos   = # value needed
            seconds = # value needed
          }
        }
        weekly_windows {
          end_time {
            nanos   = # value needed
            seconds = # value needed
          }
          start_time {
            nanos   = # value needed
            seconds = # value needed
          }
        }
      }
    }
  }
  selectors {
    delivery_pipeline {
      labels = # value needed
    }
    target {
      id     = # value needed
      labels = # value needed
    }
  }
  suspended = # value needed
}


```



author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-03-31T22:41:27Z
body: #### Tests analytics
Total tests: 32
Passed tests: 25
Skipped tests: 2
Affected tests: 5

<details>
<summary>Click here to see the affected service packages</summary>
<blockquote>

<ul>
<li>clouddeploy</li>

</ul>

</blockquote>
</details>

#### Action taken
<details>
<summary>Found 5 affected test(s) by replaying old test recordings. Starting RECORDING based on the most recent commit. Click here to see the affected tests
</summary>
<blockquote>
<ul>
<li>TestAccClouddeployAutomation_clouddeployAutomationFullExample</li>
<li>TestAccClouddeployAutomation_update</li>
<li>TestAccClouddeployDeployPolicy_clouddeployDeployPolicyBasicExample</li>
<li>TestAccClouddeployDeployPolicy_clouddeployDeployPolicyFullExample</li>
<li>TestAccClouddeployDeployPolicy_update</li>

</ul>
</blockquote>
</details>

[Get to know how VCR tests work](https://googlecloudplatform.github.io/magic-modules/develop/test/test/)
author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-03-31T22:42:50Z
body: 🟢 Tests passed during RECORDING mode:
`TestAccClouddeployAutomation_clouddeployAutomationFullExample` [[Debug log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/7797c446-168a-4df4-8922-82cf9f97275b/recording/TestAccClouddeployAutomation_clouddeployAutomationFullExample.log)]
`TestAccClouddeployAutomation_update` [[Debug log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/7797c446-168a-4df4-8922-82cf9f97275b/recording/TestAccClouddeployAutomation_update.log)]
`TestAccClouddeployDeployPolicy_clouddeployDeployPolicyBasicExample` [[Debug log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/7797c446-168a-4df4-8922-82cf9f97275b/recording/TestAccClouddeployDeployPolicy_clouddeployDeployPolicyBasicExample.log)]
`TestAccClouddeployDeployPolicy_clouddeployDeployPolicyFullExample` [[Debug log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/7797c446-168a-4df4-8922-82cf9f97275b/recording/TestAccClouddeployDeployPolicy_clouddeployDeployPolicyFullExample.log)]
`TestAccClouddeployDeployPolicy_update` [[Debug log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/7797c446-168a-4df4-8922-82cf9f97275b/recording/TestAccClouddeployDeployPolicy_update.log)]

🟢 No issues found for passed tests after REPLAYING rerun.

---






🟢 All tests passed!

View the [build log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/7797c446-168a-4df4-8922-82cf9f97275b/build-log/recording_test.log) or the [debug log](https://console.cloud.google.com/storage/browser/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/7797c446-168a-4df4-8922-82cf9f97275b/recording) for each test
author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T19:15:50Z
body: Hi there, I'm the Modular magician. I've detected the following information about your changes:

## Diff report

Your PR generated some diffs in downstreams - here they are.

`google` provider: [Diff](https://github.com/modular-magician/terraform-provider-google/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4093 insertions(+), 6 deletions(-))
`google-beta` provider: [Diff](https://github.com/modular-magician/terraform-provider-google-beta/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4093 insertions(+), 6 deletions(-))
`terraform-google-conversion`: [Diff](https://github.com/modular-magician/terraform-google-conversion/compare/auto-pr-13494-old..auto-pr-13494) ( 2 files changed, 987 insertions(+))
Open in Cloud Shell: [Diff](https://github.com/modular-magician/docs-examples/compare/auto-pr-13494-old..auto-pr-13494) ( 8 files changed, 298 insertions(+))



## Missing test report
Your PR includes resource fields which are not covered by any test.

Resource: `google_clouddeploy_automation` (4 total tests)
Please add an acceptance test which includes these fields. The test should include the following:

```hcl
resource "google_clouddeploy_automation" "primary" {
  rules {
    repair_rollout_rule {
      repair_phases {
        rollback {
          disable_rollback_if_rollout_pending = # value needed
        }
      }
    }
  }
}


```
Resource: `google_clouddeploy_deploy_policy` (4 total tests)
Please add an acceptance test which includes these fields. The test should include the following:

```hcl
resource "google_clouddeploy_deploy_policy" "primary" {
  annotations = # value needed
  description = # value needed
  labels      = # value needed
  rules {
    rollout_restriction {
      time_windows {
        one_time_windows {
          end_time {
            nanos   = # value needed
            seconds = # value needed
          }
          start_time {
            nanos   = # value needed
            seconds = # value needed
          }
        }
        weekly_windows {
          end_time {
            nanos   = # value needed
            seconds = # value needed
          }
          start_time {
            nanos   = # value needed
            seconds = # value needed
          }
        }
      }
    }
  }
  selectors {
    delivery_pipeline {
      labels = # value needed
    }
    target {
      id     = # value needed
      labels = # value needed
    }
  }
  suspended = # value needed
}


```



author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T19:19:58Z
body: #### Tests analytics
Total tests: 32
Passed tests: 30
Skipped tests: 2
Affected tests: 0

<details>
<summary>Click here to see the affected service packages</summary>
<blockquote>

<ul>
<li>clouddeploy</li>

</ul>

</blockquote>
</details>

🟢 All tests passed!

View the [build log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/f086471a-e947-4bdd-b0af-334f530d3f2d/build-log/replaying_test.log)
author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T19:43:43Z
body: Hi there, I'm the Modular magician. I've detected the following information about your changes:

## Diff report

Your PR generated some diffs in downstreams - here they are.

`google` provider: [Diff](https://github.com/modular-magician/terraform-provider-google/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4151 insertions(+), 6 deletions(-))
`google-beta` provider: [Diff](https://github.com/modular-magician/terraform-provider-google-beta/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4151 insertions(+), 6 deletions(-))
`terraform-google-conversion`: [Diff](https://github.com/modular-magician/terraform-google-conversion/compare/auto-pr-13494-old..auto-pr-13494) ( 2 files changed, 987 insertions(+))
Open in Cloud Shell: [Diff](https://github.com/modular-magician/docs-examples/compare/auto-pr-13494-old..auto-pr-13494) ( 8 files changed, 327 insertions(+))



## Missing test report
Your PR includes resource fields which are not covered by any test.

Resource: `google_clouddeploy_automation` (4 total tests)
Please add an acceptance test which includes these fields. The test should include the following:

```hcl
resource "google_clouddeploy_automation" "primary" {
  rules {
    repair_rollout_rule {
      repair_phases {
        rollback {
          disable_rollback_if_rollout_pending = # value needed
        }
      }
    }
  }
}


```
Resource: `google_clouddeploy_deploy_policy` (4 total tests)
Please add an acceptance test which includes these fields. The test should include the following:

```hcl
resource "google_clouddeploy_deploy_policy" "primary" {
  rules {
    rollout_restriction {
      time_windows {
        one_time_windows {
          end_time {
            nanos   = # value needed
            seconds = # value needed
          }
          start_time {
            nanos   = # value needed
            seconds = # value needed
          }
        }
      }
    }
  }
}


```



author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T19:46:50Z
body: #### Tests analytics
Total tests: 32
Passed tests: 29
Skipped tests: 2
Affected tests: 1

<details>
<summary>Click here to see the affected service packages</summary>
<blockquote>

<ul>
<li>clouddeploy</li>

</ul>

</blockquote>
</details>

#### Action taken
<details>
<summary>Found 1 affected test(s) by replaying old test recordings. Starting RECORDING based on the most recent commit. Click here to see the affected tests
</summary>
<blockquote>
<ul>
<li>TestAccClouddeployDeployPolicy_clouddeployDeployPolicyFullExample</li>

</ul>
</blockquote>
</details>

[Get to know how VCR tests work](https://googlecloudplatform.github.io/magic-modules/develop/test/test/)
author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T19:47:38Z
body: 🟢 Tests passed during RECORDING mode:
`TestAccClouddeployDeployPolicy_clouddeployDeployPolicyFullExample` [[Debug log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/dd577da1-3f54-48a0-8b15-258365358fd1/recording/TestAccClouddeployDeployPolicy_clouddeployDeployPolicyFullExample.log)]

🟢 No issues found for passed tests after REPLAYING rerun.

---






🟢 All tests passed!

View the [build log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/dd577da1-3f54-48a0-8b15-258365358fd1/build-log/recording_test.log) or the [debug log](https://console.cloud.google.com/storage/browser/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/dd577da1-3f54-48a0-8b15-258365358fd1/recording) for each test
author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T20:00:50Z
body: Hi there, I'm the Modular magician. I've detected the following information about your changes:

## Diff report

Your PR generated some diffs in downstreams - here they are.

`google` provider: [Diff](https://github.com/modular-magician/terraform-provider-google/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4161 insertions(+), 6 deletions(-))
`google-beta` provider: [Diff](https://github.com/modular-magician/terraform-provider-google-beta/compare/auto-pr-13494-old..auto-pr-13494) ( 12 files changed, 4161 insertions(+), 6 deletions(-))
`terraform-google-conversion`: [Diff](https://github.com/modular-magician/terraform-google-conversion/compare/auto-pr-13494-old..auto-pr-13494) ( 2 files changed, 987 insertions(+))
Open in Cloud Shell: [Diff](https://github.com/modular-magician/docs-examples/compare/auto-pr-13494-old..auto-pr-13494) ( 8 files changed, 331 insertions(+))





author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T20:04:21Z
body: #### Tests analytics
Total tests: 32
Passed tests: 29
Skipped tests: 2
Affected tests: 1

<details>
<summary>Click here to see the affected service packages</summary>
<blockquote>

<ul>
<li>clouddeploy</li>

</ul>

</blockquote>
</details>

#### Action taken
<details>
<summary>Found 1 affected test(s) by replaying old test recordings. Starting RECORDING based on the most recent commit. Click here to see the affected tests
</summary>
<blockquote>
<ul>
<li>TestAccClouddeployAutomation_clouddeployAutomationFullExample</li>

</ul>
</blockquote>
</details>

[Get to know how VCR tests work](https://googlecloudplatform.github.io/magic-modules/develop/test/test/)
author_association: COLLABORATOR
user: login: modular-magician
created_at: 2025-04-01T20:05:22Z
body: 🟢 Tests passed during RECORDING mode:
`TestAccClouddeployAutomation_clouddeployAutomationFullExample` [[Debug log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/89583034-6d38-4777-b0ae-5865a84a188c/recording/TestAccClouddeployAutomation_clouddeployAutomationFullExample.log)]

🟢 No issues found for passed tests after REPLAYING rerun.

---






🟢 All tests passed!

View the [build log](https://storage.cloud.google.com/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/89583034-6d38-4777-b0ae-5865a84a188c/build-log/recording_test.log) or the [debug log](https://console.cloud.google.com/storage/browser/ci-vcr-logs/beta/refs/heads/auto-pr-13494/artifacts/89583034-6d38-4777-b0ae-5865a84a188c/recording) for each test
author_association: COLLABORATOR