diff --git a/.changelog/12578.txt b/.changelog/12578.txt new file mode 100644 index 00000000000..b6691edf0e5 --- /dev/null +++ b/.changelog/12578.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +compute: fix errors details for zonal resize request & align with mixer errors details +``` \ No newline at end of file diff --git a/google/services/compute/resource_compute_resize_request.go b/google/services/compute/resource_compute_resize_request.go index c7a2cd232d3..f7ddf80d758 100644 --- a/google/services/compute/resource_compute_resize_request.go +++ b/google/services/compute/resource_compute_resize_request.go @@ -56,9 +56,7 @@ func ResourceComputeResizeRequest() *schema.Resource { Required: true, ForceNew: true, DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName, - Description: `The name of the managed instance group. The name should conform to RFC1035 or be a resource ID. -Authorization requires the following IAM permission on the specified resource instanceGroupManager: -*compute.instanceGroupManagers.update`, + Description: `The reference of the instance group manager this ResizeRequest is a part of.`, }, "name": { Type: schema.TypeString, @@ -77,7 +75,7 @@ Authorization requires the following IAM permission on the specified resource in Required: true, ForceNew: true, DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName, - Description: `Name of the compute zone scoping this request. Name should conform to RFC1035.`, + Description: `The reference of the compute zone scoping this request.`, }, "description": { Type: schema.TypeString, @@ -97,7 +95,7 @@ Authorization requires the following IAM permission on the specified resource in Type: schema.TypeString, Required: true, ForceNew: true, - Description: `Span of time at a resolution of a second. Must be from 0 to 315,576,000,000 inclusive. Note: these bounds are computed from: 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years`, + Description: `Span of time at a resolution of a second. Must be from 600 to 604800 inclusive. Note: minimum and maximum allowed range for requestedRunDuration is 10 minutes (600 seconds) and 7 days(604800 seconds) correspondingly.`, }, "nanos": { Type: schema.TypeInt, @@ -116,59 +114,58 @@ Authorization requires the following IAM permission on the specified resource in "state": { Type: schema.TypeString, Computed: true, - Description: `[Output only] Current state of the request.`, + Description: `Current state of the request.`, }, "status": { Type: schema.TypeList, Computed: true, - Description: `[Output only] Status of the request.`, + Description: `Status of the request.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "error": { Type: schema.TypeList, Computed: true, - Description: `[Output only] Fatal errors encountered during the queueing or provisioning phases of the ResizeRequest that caused the transition to the FAILED state. Contrary to the lastAttempt errors, this field is final and errors are never removed from here, as the ResizeRequest is not going to retry.`, + Description: `Fatal errors encountered during the queueing or provisioning phases of the ResizeRequest that caused the transition to the FAILED state. Contrary to the lastAttempt errors, this field is final and errors are never removed from here, as the ResizeRequest is not going to retry.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "errors": { Type: schema.TypeList, Computed: true, - Description: `[Output Only] The array of errors encountered while processing this operation.`, + Description: `The array of errors encountered while processing this operation.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "code": { Type: schema.TypeString, Computed: true, - Description: `[Output Only] The error type identifier for this error.`, + Description: `The error type identifier for this error.`, }, "error_details": { Type: schema.TypeList, Computed: true, - Description: `[Output Only] An optional list of messages that contain the error details. There is a set of defined message types to use for providing details.The syntax depends on the error code. For example, QuotaExceededInfo will have details when the error code is QUOTA_EXCEEDED.`, + Description: `An array of messages that contain the error details. There is a set of defined message types to use for providing details.The syntax depends on the error code. For example, QuotaExceededInfo will have details when the error code is QUOTA_EXCEEDED.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "error_info": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "domain": { Type: schema.TypeString, Computed: true, - Description: `The logical grouping to which the "reason" belongs. The error domain is typically the registered service name of the tool or product that generates the error. Example: "pubsub.googleapis.com". If the error is generated by some common infrastructure, the error domain must be a globally unique value that identifies the infrastructure. For Google API infrastructure, the error domain is "googleapis.com".`, + Description: `The logical grouping to which the "reason" belongs. The error domain is typically the registered service name of the tool or product that generates the error. Example: "pubsub.googleapis.com".`, }, "metadatas": { - Type: schema.TypeMap, - Computed: true, - Description: `Additional structured details about this error. -Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also they must be limited to 64 characters in length. When identifying the current value of an exceeded limit, the units should be contained in the key, not the value. For example, rather than {"instanceLimit": "100/request"}, should be returned as, {"instanceLimitPerRequest": "100"}, if the client exceeds the number of instances that can be created in a single (batch) request.`, - Elem: &schema.Schema{Type: schema.TypeString}, + Type: schema.TypeMap, + Computed: true, + Description: `Additional structured details about this error.`, + Elem: &schema.Schema{Type: schema.TypeString}, }, "reason": { Type: schema.TypeString, Computed: true, - Description: `The reason of the error. This is a constant value that identifies the proximate cause of the error. Error reasons are unique within a particular domain of errors. This should be at most 63 characters and match a regular expression of [A-Z][A-Z0-9_]+[A-Z0-9], which represents UPPER_SNAKE_CASE.`, + Description: `The reason of the error. This is a constant value that identifies the proximate cause of the error. Error reasons are unique within a particular domain of errors.`, }, }, }, @@ -176,13 +173,13 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "help": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "links": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "description": { @@ -204,7 +201,7 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "localized_message": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "locale": { @@ -223,7 +220,7 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "quota_info": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "dimensions": { @@ -266,12 +263,12 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "location": { Type: schema.TypeString, Computed: true, - Description: `Output Only] Indicates the field in the request that caused the error. This property is optional.`, + Description: `Indicates the field in the request that caused the error. This property is optional.`, }, "message": { Type: schema.TypeString, Computed: true, - Description: `[Output Only] An optional, human-readable error message.`, + Description: `An optional, human-readable error message.`, }, }, }, @@ -282,54 +279,53 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "last_attempt": { Type: schema.TypeList, Computed: true, - Description: `[Output only] Information about the last attempt to fulfill the request. The value is temporary since the ResizeRequest can retry, as long as it's still active and the last attempt value can either be cleared or replaced with a different error. Since ResizeRequest retries infrequently, the value may be stale and no longer show an active problem. The value is cleared when ResizeRequest transitions to the final state (becomes inactive). If the final state is FAILED the error describing it will be storred in the "error" field only.`, + Description: `Information about the last attempt to fulfill the request. The value is temporary since the ResizeRequest can retry, as long as it's still active and the last attempt value can either be cleared or replaced with a different error. Since ResizeRequest retries infrequently, the value may be stale and no longer show an active problem. The value is cleared when ResizeRequest transitions to the final state (becomes inactive). If the final state is FAILED the error describing it will be storred in the "error" field only.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "error": { Type: schema.TypeList, Computed: true, - Description: `[Output only] Fatal errors encountered during the queueing or provisioning phases of the ResizeRequest that caused the transition to the FAILED state. Contrary to the lastAttempt errors, this field is final and errors are never removed from here, as the ResizeRequest is not going to retry.`, + Description: `Fatal errors encountered during the queueing or provisioning phases of the ResizeRequest that caused the transition to the FAILED state. Contrary to the lastAttempt errors, this field is final and errors are never removed from here, as the ResizeRequest is not going to retry.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "errors": { Type: schema.TypeList, Computed: true, - Description: `[Output Only] The array of errors encountered while processing this operation.`, + Description: `The array of errors encountered while processing this operation.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "code": { Type: schema.TypeString, Computed: true, - Description: `[Output Only] The error type identifier for this error.`, + Description: `The error type identifier for this error.`, }, "error_details": { Type: schema.TypeList, Computed: true, - Description: `[Output Only] An optional list of messages that contain the error details. There is a set of defined message types to use for providing details.The syntax depends on the error code. For example, QuotaExceededInfo will have details when the error code is QUOTA_EXCEEDED.`, + Description: `An array of messages that contain the error details. There is a set of defined message types to use for providing details.The syntax depends on the error code. For example, QuotaExceededInfo will have details when the error code is QUOTA_EXCEEDED.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "error_info": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "domain": { Type: schema.TypeString, Computed: true, - Description: `The logical grouping to which the "reason" belongs. The error domain is typically the registered service name of the tool or product that generates the error. Example: "pubsub.googleapis.com". If the error is generated by some common infrastructure, the error domain must be a globally unique value that identifies the infrastructure. For Google API infrastructure, the error domain is "googleapis.com".`, + Description: `The logical grouping to which the "reason" belongs. The error domain is typically the registered service name of the tool or product that generates the error. Example: "pubsub.googleapis.com".`, }, "metadatas": { - Type: schema.TypeMap, - Computed: true, - Description: `Additional structured details about this error. -Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also they must be limited to 64 characters in length. When identifying the current value of an exceeded limit, the units should be contained in the key, not the value. For example, rather than {"instanceLimit": "100/request"}, should be returned as, {"instanceLimitPerRequest": "100"}, if the client exceeds the number of instances that can be created in a single (batch) request.`, - Elem: &schema.Schema{Type: schema.TypeString}, + Type: schema.TypeMap, + Computed: true, + Description: `Additional structured details about this error.`, + Elem: &schema.Schema{Type: schema.TypeString}, }, "reason": { Type: schema.TypeString, Computed: true, - Description: `The reason of the error. This is a constant value that identifies the proximate cause of the error. Error reasons are unique within a particular domain of errors. This should be at most 63 characters and match a regular expression of [A-Z][A-Z0-9_]+[A-Z0-9], which represents UPPER_SNAKE_CASE.`, + Description: `The reason of the error. This is a constant value that identifies the proximate cause of the error. Error reasons are unique within a particular domain of errors.`, }, }, }, @@ -337,13 +333,13 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "help": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "links": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "description": { @@ -365,7 +361,7 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "localized_message": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "locale": { @@ -384,7 +380,7 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "quota_info": { Type: schema.TypeList, Computed: true, - Description: `[Output Only]`, + Description: `A nested object resource.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "dimensions": { @@ -427,12 +423,12 @@ Keys must match /[a-z][a-zA-Z0-9-_]+/ but should ideally be lowerCamelCase. Also "location": { Type: schema.TypeString, Computed: true, - Description: `Output Only] Indicates the field in the request that caused the error. This property is optional.`, + Description: `Indicates the field in the request that caused the error. This property is optional.`, }, "message": { Type: schema.TypeString, Computed: true, - Description: `[Output Only] An optional, human-readable error message.`, + Description: `An optional, human-readable error message.`, }, }, }, @@ -641,8 +637,9 @@ func resourceComputeResizeRequestDelete(d *schema.ResourceData, meta interface{} return err } - // Get current state (accepted or not) and delete - if d.Get("state") == "ACCEPTED" { + // If a resize request is in the CREATING or ACCEPTED state, it must be canceled before it can be + // deleted. If a resize request is NOT in any of the mentioned state, it can be directly deleted. + if d.Get("state") == "CREATING" || d.Get("state") == "ACCEPTED" { // cancel resize request res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{ Config: config, @@ -677,7 +674,7 @@ func resourceComputeResizeRequestDelete(d *schema.ResourceData, meta interface{} }) err = ComputeOperationWaitTime( - config, res, project, "Cancelling the resize request", userAgent, + config, res, project, "Deleting the resize request", userAgent, d.Timeout(schema.TimeoutDelete)) if err != nil { @@ -807,22 +804,24 @@ func flattenComputeResizeRequestStatusError(v interface{}, d *schema.ResourceDat } func flattenComputeResizeRequestStatusErrorErrors(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { - return nil + return v } - original := v.(map[string]interface{}) - if len(original) == 0 { - return nil + l := v.([]interface{}) + transformed := make([]interface{}, 0, len(l)) + for _, raw := range l { + original := raw.(map[string]interface{}) + if len(original) < 1 { + // Do not include empty json objects coming back from the api + continue + } + transformed = append(transformed, map[string]interface{}{ + "code": flattenComputeResizeRequestStatusErrorErrorsCode(original["code"], d, config), + "location": flattenComputeResizeRequestStatusErrorErrorsLocation(original["location"], d, config), + "message": flattenComputeResizeRequestStatusErrorErrorsMessage(original["message"], d, config), + "error_details": flattenComputeResizeRequestStatusErrorErrorsErrorDetails(original["errorDetails"], d, config), + }) } - transformed := make(map[string]interface{}) - transformed["code"] = - flattenComputeResizeRequestStatusErrorErrorsCode(original["code"], d, config) - transformed["location"] = - flattenComputeResizeRequestStatusErrorErrorsLocation(original["location"], d, config) - transformed["message"] = - flattenComputeResizeRequestStatusErrorErrorsMessage(original["message"], d, config) - transformed["error_details"] = - flattenComputeResizeRequestStatusErrorErrorsErrorDetails(original["errorDetails"], d, config) - return []interface{}{transformed} + return transformed } func flattenComputeResizeRequestStatusErrorErrorsCode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v @@ -838,22 +837,24 @@ func flattenComputeResizeRequestStatusErrorErrorsMessage(v interface{}, d *schem func flattenComputeResizeRequestStatusErrorErrorsErrorDetails(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { - return nil + return v } - original := v.(map[string]interface{}) - if len(original) == 0 { - return nil + l := v.([]interface{}) + transformed := make([]interface{}, 0, len(l)) + for _, raw := range l { + original := raw.(map[string]interface{}) + if len(original) < 1 { + // Do not include empty json objects coming back from the api + continue + } + transformed = append(transformed, map[string]interface{}{ + "error_info": flattenComputeResizeRequestStatusErrorErrorsErrorDetailsErrorInfo(original["errorInfo"], d, config), + "quota_info": flattenComputeResizeRequestStatusErrorErrorsErrorDetailsQuotaInfo(original["quotaInfo"], d, config), + "help": flattenComputeResizeRequestStatusErrorErrorsErrorDetailsHelp(original["help"], d, config), + "localized_message": flattenComputeResizeRequestStatusErrorErrorsErrorDetailsLocalizedMessage(original["localizedMessage"], d, config), + }) } - transformed := make(map[string]interface{}) - transformed["error_info"] = - flattenComputeResizeRequestStatusErrorErrorsErrorDetailsErrorInfo(original["errorInfo"], d, config) - transformed["quota_info"] = - flattenComputeResizeRequestStatusErrorErrorsErrorDetailsQuotaInfo(original["quotaInfo"], d, config) - transformed["help"] = - flattenComputeResizeRequestStatusErrorErrorsErrorDetailsHelp(original["help"], d, config) - transformed["localized_message"] = - flattenComputeResizeRequestStatusErrorErrorsErrorDetailsLocalizedMessage(original["localizedMessage"], d, config) - return []interface{}{transformed} + return transformed } func flattenComputeResizeRequestStatusErrorErrorsErrorDetailsErrorInfo(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { @@ -1044,22 +1045,24 @@ func flattenComputeResizeRequestStatusLastAttemptError(v interface{}, d *schema. } func flattenComputeResizeRequestStatusLastAttemptErrorErrors(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { - return nil + return v } - original := v.(map[string]interface{}) - if len(original) == 0 { - return nil + l := v.([]interface{}) + transformed := make([]interface{}, 0, len(l)) + for _, raw := range l { + original := raw.(map[string]interface{}) + if len(original) < 1 { + // Do not include empty json objects coming back from the api + continue + } + transformed = append(transformed, map[string]interface{}{ + "code": flattenComputeResizeRequestStatusLastAttemptErrorErrorsCode(original["code"], d, config), + "location": flattenComputeResizeRequestStatusLastAttemptErrorErrorsLocation(original["location"], d, config), + "message": flattenComputeResizeRequestStatusLastAttemptErrorErrorsMessage(original["message"], d, config), + "error_details": flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetails(original["errorDetails"], d, config), + }) } - transformed := make(map[string]interface{}) - transformed["code"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsCode(original["code"], d, config) - transformed["location"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsLocation(original["location"], d, config) - transformed["message"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsMessage(original["message"], d, config) - transformed["error_details"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetails(original["errorDetails"], d, config) - return []interface{}{transformed} + return transformed } func flattenComputeResizeRequestStatusLastAttemptErrorErrorsCode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v @@ -1075,22 +1078,24 @@ func flattenComputeResizeRequestStatusLastAttemptErrorErrorsMessage(v interface{ func flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetails(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { - return nil + return v } - original := v.(map[string]interface{}) - if len(original) == 0 { - return nil + l := v.([]interface{}) + transformed := make([]interface{}, 0, len(l)) + for _, raw := range l { + original := raw.(map[string]interface{}) + if len(original) < 1 { + // Do not include empty json objects coming back from the api + continue + } + transformed = append(transformed, map[string]interface{}{ + "error_info": flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsErrorInfo(original["errorInfo"], d, config), + "quota_info": flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsQuotaInfo(original["quotaInfo"], d, config), + "help": flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsHelp(original["help"], d, config), + "localized_message": flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsLocalizedMessage(original["localizedMessage"], d, config), + }) } - transformed := make(map[string]interface{}) - transformed["error_info"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsErrorInfo(original["errorInfo"], d, config) - transformed["quota_info"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsQuotaInfo(original["quotaInfo"], d, config) - transformed["help"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsHelp(original["help"], d, config) - transformed["localized_message"] = - flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsLocalizedMessage(original["localizedMessage"], d, config) - return []interface{}{transformed} + return transformed } func flattenComputeResizeRequestStatusLastAttemptErrorErrorsErrorDetailsErrorInfo(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { diff --git a/google/services/compute/resource_compute_resize_request_generated_test.go b/google/services/compute/resource_compute_resize_request_generated_test.go index 9e0e6d64d7f..5bea7ebb90d 100644 --- a/google/services/compute/resource_compute_resize_request_generated_test.go +++ b/google/services/compute/resource_compute_resize_request_generated_test.go @@ -58,7 +58,7 @@ func TestAccComputeResizeRequest_computeMigResizeRequestExample(t *testing.T) { func testAccComputeResizeRequest_computeMigResizeRequestExample(context map[string]interface{}) string { return acctest.Nprintf(` resource "google_compute_region_instance_template" "a3_dws" { - name = "a3-dws" + name = "tf-test-a3-dws%{random_suffix}" region = "us-central1" description = "This template is used to create a mig instance that is compatible with DWS resize requests." instance_description = "A3 GPU" @@ -99,7 +99,7 @@ resource "google_compute_region_instance_template" "a3_dws" { } resource "google_compute_instance_group_manager" "a3_dws" { - name = "a3-dws" + name = "tf-test-a3-dws%{random_suffix}" base_instance_name = "a3-dws" zone = "us-central1-a" diff --git a/website/docs/r/compute_resize_request.html.markdown b/website/docs/r/compute_resize_request.html.markdown index 370ef7486d8..6af3025a186 100644 --- a/website/docs/r/compute_resize_request.html.markdown +++ b/website/docs/r/compute_resize_request.html.markdown @@ -24,14 +24,14 @@ Represents a Managed Instance Group Resize Request Resize Requests are the Managed Instance Group implementation of Dynamic Workload Scheduler Flex Start. -With Dynamic Workload Scheduler in Flex Start mode, you submit a GPU capacity request for your AI/ML jobs by indicating how many you need, a duration, and your preferred region. Dynamic Workload Scheduler intelligently persists the request; once the capacity becomes available, it automatically provisions your VMs enabling your workloads to run continuously for the entire duration of the capacity allocation. +With Dynamic Workload Scheduler in Flex Start mode, you submit a GPU capacity request for your AI/ML jobs by indicating how many you need, a duration, and your preferred zone. Dynamic Workload Scheduler intelligently persists the request; once the capacity becomes available, it automatically provisions your VMs enabling your workloads to run continuously for the entire duration of the capacity allocation. To get more information about ResizeRequest, see: * [API documentation](https://cloud.google.com/compute/docs/reference/rest/v1/instanceGroupManagerResizeRequests) * How-to Guides - * [QUICKSTART_TITLE](https://cloud.google.com/compute/docs/instance-groups/create-resize-requests-mig) + * [About resize requests in a MIG](https://cloud.google.com/compute/docs/instance-groups/about-resize-requests-mig)