diff --git a/ovh/resource_cloud_project_volume.go b/ovh/resource_cloud_project_volume.go index 5d1916a49..28286b32d 100644 --- a/ovh/resource_cloud_project_volume.go +++ b/ovh/resource_cloud_project_volume.go @@ -156,12 +156,29 @@ func (r *cloudProjectVolumeResource) Update(ctx context.Context, req resource.Up endpoint := "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/volume/" + url.PathEscape(data.VolumeId.ValueString()) if err := r.config.OVHClient.Put(endpoint, planData.ToUpdate(), nil); err != nil { resp.Diagnostics.AddError( - fmt.Sprintf("Error calling Post %s", endpoint), + fmt.Sprintf("Error calling Put %s", endpoint), err.Error(), ) return } + // Check if size has been modified as updating it requires a specific call + if !planData.Size.Equal(data.Size) { + endpoint = "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/volume/" + url.PathEscape(data.VolumeId.ValueString()) + "/upsize" + if err := r.config.OVHClient.Post(endpoint, map[string]any{ + "size": planData.Size.ValueInt64(), + }, nil); err != nil { + resp.Diagnostics.AddError( + fmt.Sprintf("Error calling Post %s", endpoint), + err.Error(), + ) + return + } + + // Here we need to wait for some time to make sure the size is correctly updated on backend side + time.Sleep(1 * time.Minute) + } + // Read updated resource endpoint = "/cloud/project/" + url.PathEscape(data.ServiceName.ValueString()) + "/region/" + url.PathEscape(data.RegionName.ValueString()) + "/volume/" + url.PathEscape(data.VolumeId.ValueString()) if err := r.config.OVHClient.Get(endpoint, &responseData); err != nil { @@ -173,6 +190,7 @@ func (r *cloudProjectVolumeResource) Update(ctx context.Context, req resource.Up } responseData.MergeWith(&planData) + responseData.MergeWith(&data) // Save updated data into Terraform state resp.Diagnostics.Append(resp.State.Set(ctx, &responseData)...) @@ -183,7 +201,6 @@ func (r *cloudProjectVolumeResource) Delete(ctx context.Context, req resource.De // Read Terraform prior state data into the model resp.Diagnostics.Append(req.State.Get(ctx, &data)...) - if resp.Diagnostics.HasError() { return } diff --git a/ovh/resource_cloud_project_volume_gen.go b/ovh/resource_cloud_project_volume_gen.go index 02c6bbd23..b3a79fd94 100644 --- a/ovh/resource_cloud_project_volume_gen.go +++ b/ovh/resource_cloud_project_volume_gen.go @@ -18,7 +18,6 @@ import ( ovhtypes "github.com/ovh/terraform-provider-ovh/ovh/types" "github.com/hashicorp/terraform-plugin-framework/resource/schema" - "github.com/hashicorp/terraform-plugin-framework/resource/schema/int64planmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" ) @@ -119,9 +118,6 @@ func CloudProjectVolumeResourceSchema(ctx context.Context) schema.Schema { Computed: true, Description: "Volume size", MarkdownDescription: "Volume size", - PlanModifiers: []planmodifier.Int64{ - int64planmodifier.RequiresReplace(), - }, }, "snapshot_id": schema.StringAttribute{ CustomType: ovhtypes.TfStringType{}, @@ -226,7 +222,6 @@ type CloudProjectVolumeModelOp struct { } func (v *CloudProjectVolumeModelOp) MergeWith(other *CloudProjectVolumeModelOp) { - if (v.Action.IsUnknown() || v.Action.IsNull()) && !other.Action.IsUnknown() { v.Action = other.Action } @@ -306,7 +301,6 @@ func (v *CloudProjectVolumeModelOp) MergeWith(other *CloudProjectVolumeModelOp) if (v.VolumeId.IsUnknown() || v.VolumeId.IsNull()) && !other.VolumeId.IsUnknown() { v.VolumeId = other.Id } - } func (v CloudProjectVolumeModelOp) ToCreate() *CloudProjectVolumeModelOp { @@ -350,30 +344,10 @@ func (v CloudProjectVolumeModelOp) ToUpdate() *CloudProjectVolumeModelOp { res.Description = v.Description } - if !v.ImageId.IsUnknown() { - res.ImageId = v.ImageId - } - - if !v.InstanceId.IsUnknown() { - res.InstanceId = v.InstanceId - } - if !v.Name.IsUnknown() { res.Name = v.Name } - if !v.Size.IsUnknown() { - res.Size = v.Size - } - - if !v.SnapshotId.IsUnknown() { - res.SnapshotId = v.SnapshotId - } - - if !v.Type.IsUnknown() { - res.Type = v.Type - } - return res } diff --git a/ovh/resource_cloud_project_volume_test.go b/ovh/resource_cloud_project_volume_test.go index ded9f51cb..8b4182678 100644 --- a/ovh/resource_cloud_project_volume_test.go +++ b/ovh/resource_cloud_project_volume_test.go @@ -34,9 +34,34 @@ func TestAccCloudProjectVolume_basic(t *testing.T) { resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "region_name", regionName), resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "service_name", serviceName), resource.TestCheckResourceAttrSet("ovh_cloud_project_volume.volume", "volume_id"), - resource.TestCheckResourceAttrSet("ovh_cloud_project_volume.volume", "type"), - resource.TestCheckResourceAttrSet("ovh_cloud_project_volume.volume", "description"), - resource.TestCheckResourceAttrSet("ovh_cloud_project_volume.volume", "name"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "type", "classic"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "description", "test"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "name", "test"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "size", "15"), + ), + }, + { + Config: fmt.Sprintf(` + resource "ovh_cloud_project_volume" "volume" { + region_name = "%s" + service_name = "%s" + description = "test_updated" + name = "test_updated" + size = 20 + type = "classic" + } + `, + regionName, + serviceName, + ), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "region_name", regionName), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "service_name", serviceName), + resource.TestCheckResourceAttrSet("ovh_cloud_project_volume.volume", "volume_id"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "type", "classic"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "description", "test_updated"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "name", "test_updated"), + resource.TestCheckResourceAttr("ovh_cloud_project_volume.volume", "size", "20"), ), }, }, diff --git a/website/docs/r/cloud_project_region_volume.markdown b/website/docs/r/cloud_project_region_volume.markdown index 23bc1937e..f1c27cbb6 100644 --- a/website/docs/r/cloud_project_region_volume.markdown +++ b/website/docs/r/cloud_project_region_volume.markdown @@ -1,5 +1,5 @@ --- -subcategory : "Managed update" +subcategory : "Cloud Project" --- # ovh_cloud_project_volume @@ -29,7 +29,7 @@ The following arguments are supported: * `region_name` - Required. A valid OVHcloud public cloud region name in which the volume will be available. Ex.: "GRA11". **Changing this value recreates the resource.** * `description` - A description of the volume * `name` - Name of the volume -* `size` - Size (GB) of the volume **Changing this value recreates the resource.** +* `size` - Size (GB) of the volume * `type` - Type of the volume **Changing this value recreates the resource.** ## Attributes Reference