diff --git a/docs/guides/dedicated_server_migration.md b/docs/guides/dedicated_server_migration.md index 9553834a3..085f45f4f 100644 --- a/docs/guides/dedicated_server_migration.md +++ b/docs/guides/dedicated_server_migration.md @@ -37,7 +37,7 @@ terraform apply ## Second step: backport your previous task details into the imported resource -This step is manual and requires you to convert the previous installation details from resource `ovh_dedicated_server_install_task` to the new fields of resource `ovh_dedicated_server`: `os`, `customizations`, `properties` and `storage`. +This step is manual and requires you to convert the previous installation details from resource `ovh_dedicated_server_install_task` to the new fields of resource `ovh_dedicated_server`: `os`, `customizations` and `storage`. Let's take an example: if you previously used the following configuration: @@ -74,7 +74,6 @@ resource "ovh_dedicated_server" "srv" { ssh_key = "ssh-ed25519 AAAAC3..." } os = "debian12_64" - properties = null storage = null } ``` diff --git a/docs/resources/dedicated_server.md b/docs/resources/dedicated_server.md index b4eaf5490..285a24553 100644 --- a/docs/resources/dedicated_server.md +++ b/docs/resources/dedicated_server.md @@ -109,6 +109,7 @@ resource "ovh_dedicated_server" "server" { * `os` - Operating System to install * `customizations` - Customization of the OS configuration + * `config_drive_metadata` - Config Drive MetaData * `config_drive_user_data` - Config Drive UserData * `efi_bootloader_path` - Path of the EFI bootloader from the OS installed on the server * `hostname` - Custom hostname @@ -139,7 +140,7 @@ resource "ovh_dedicated_server" "server" { * `raid_level` - Software raid type * `size` - Partition size in MiB * `scheme_name` - Partitioning scheme (if applicable with selected operating system) -* `properties` - Arbitrary properties to pass to cloud-init's config drive datasource +* `properties` - Deprecated, has no effect ### Arguments used to control the lifecycle of a dedicated server diff --git a/docs/resources/dedicated_server_reinstall_task.md b/docs/resources/dedicated_server_reinstall_task.md index 4ac9cf8bc..5624ea0d0 100644 --- a/docs/resources/dedicated_server_reinstall_task.md +++ b/docs/resources/dedicated_server_reinstall_task.md @@ -119,18 +119,16 @@ resource "ovh_dedicated_server_reinstall_task" "server_install" { service_name = data.ovh_dedicated_server.server.service_name os = "byolinux_64" customizations { + config_drive_metadata = { + foo = "bar" + hello = "world" + } config_drive_user_data = "I2Nsb3VkLWNvbmZpZwpzc2hfYXV0aG9yaXplZF9rZXlzOgogIC0gc3NoLXJzYSBBQUFBQjhkallpdz09IG15c2VsZkBteWRvbWFpbi5uZXQKCnVzZXJzOgogIC0gbmFtZTogcGF0aWVudDAKICAgIHN1ZG86IEFMTD0oQUxMKSBOT1BBU1NXRDpBTEwKICAgIGdyb3VwczogdXNlcnMsIHN1ZG8KICAgIHNoZWxsOiAvYmluL2Jhc2gKICAgIGxvY2tfcGFzc3dkOiBmYWxzZQogICAgc3NoX2F1dGhvcml6ZWRfa2V5czoKICAgICAgLSBzc2gtcnNhIEFBQUFCOGRqWWl3PT0gbXlzZWxmQG15ZG9tYWluLm5ldApkaXNhYmxlX3Jvb3Q6IGZhbHNlCnBhY2thZ2VzOgogIC0gdmltCiAgLSB0cmVlCmZpbmFsX21lc3NhZ2U6IFRoZSBzeXN0ZW0gaXMgZmluYWxseSB1cCwgYWZ0ZXIgJFVQVElNRSBzZWNvbmRzCg==" hostname = "mon-tux" http_headers = { Authorization = "Basic bG9naW46cGFzc3dvcmQ=" } - image_check_sum = "367f26c915f39314dde155db3a2b0326803e06975d1f4be04256f8b591e38fd4062d36eb7d50e99da7a50b7f4cd69640e56a4ab93e8e0274e4e478e0f84b5d29" - image_check_sum_type = "sha512" - image_url = "https://github.com/ashmonger/akution_test/releases/download/0.5-compress/deb11k6.qcow2" - } - properties = { - essential = "false" - role = "webservers" + image_url = "https://github.com/ashmonger/akution_test/releases/download/0.5-compress/deb11k6.qcow2" } } ``` @@ -241,7 +239,7 @@ The following arguments are supported: ~> **WARNING** Some customizations may be required on some Operating Systems. [Check how to list the available and required customization(s) for your operating system](https://help.ovhcloud.com/csm/en-dedicated-servers-api-os-installation?id=kb_article_view&sysparm_article=KB0061951#os-inputs) (do not forget to adapt camel case customization name to snake case parameter). -* `properties` - Arbitrary properties to pass to cloud-init's config drive datasource. It supports any key with any string value. +* `properties` - Deprecated, has no effect * `storage`: OS reinstallation storage configurations. [More details about disks, hardware/software RAID and partitioning configuration](https://help.ovhcloud.com/csm/en-dedicated-servers-api-partitioning?id=kb_article_view&sysparm_article=KB0043882) (do not forget to adapt camel case parameters to snake case parameters). * `disk_group_id`: Disk group id to install the OS to (default is 0, meaning automatic). diff --git a/examples/resources/dedicated_server_reinstall_task/example_4.tf b/examples/resources/dedicated_server_reinstall_task/example_4.tf index ee500e82d..a737cb839 100644 --- a/examples/resources/dedicated_server_reinstall_task/example_4.tf +++ b/examples/resources/dedicated_server_reinstall_task/example_4.tf @@ -10,17 +10,15 @@ resource "ovh_dedicated_server_reinstall_task" "server_install" { service_name = data.ovh_dedicated_server.server.service_name os = "byolinux_64" customizations { + config_drive_metadata = { + foo = "bar" + hello = "world" + } config_drive_user_data = "I2Nsb3VkLWNvbmZpZwpzc2hfYXV0aG9yaXplZF9rZXlzOgogIC0gc3NoLXJzYSBBQUFBQjhkallpdz09IG15c2VsZkBteWRvbWFpbi5uZXQKCnVzZXJzOgogIC0gbmFtZTogcGF0aWVudDAKICAgIHN1ZG86IEFMTD0oQUxMKSBOT1BBU1NXRDpBTEwKICAgIGdyb3VwczogdXNlcnMsIHN1ZG8KICAgIHNoZWxsOiAvYmluL2Jhc2gKICAgIGxvY2tfcGFzc3dkOiBmYWxzZQogICAgc3NoX2F1dGhvcml6ZWRfa2V5czoKICAgICAgLSBzc2gtcnNhIEFBQUFCOGRqWWl3PT0gbXlzZWxmQG15ZG9tYWluLm5ldApkaXNhYmxlX3Jvb3Q6IGZhbHNlCnBhY2thZ2VzOgogIC0gdmltCiAgLSB0cmVlCmZpbmFsX21lc3NhZ2U6IFRoZSBzeXN0ZW0gaXMgZmluYWxseSB1cCwgYWZ0ZXIgJFVQVElNRSBzZWNvbmRzCg==" hostname = "mon-tux" http_headers = { Authorization = "Basic bG9naW46cGFzc3dvcmQ=" } - image_check_sum = "367f26c915f39314dde155db3a2b0326803e06975d1f4be04256f8b591e38fd4062d36eb7d50e99da7a50b7f4cd69640e56a4ab93e8e0274e4e478e0f84b5d29" - image_check_sum_type = "sha512" image_url = "https://github.com/ashmonger/akution_test/releases/download/0.5-compress/deb11k6.qcow2" } - properties = { - essential = "false" - role = "webservers" - } } diff --git a/ovh/resource_dedicated_server_gen.go b/ovh/resource_dedicated_server_gen.go index 4ad27e82a..b66e96d34 100644 --- a/ovh/resource_dedicated_server_gen.go +++ b/ovh/resource_dedicated_server_gen.go @@ -70,6 +70,12 @@ func DedicatedServerResourceSchema(ctx context.Context) schema.Schema { }, "customizations": schema.SingleNestedAttribute{ Attributes: map[string]schema.Attribute{ + "config_drive_metadata": schema.MapAttribute{ + CustomType: ovhtypes.NewTfMapNestedType[ovhtypes.TfStringValue](ctx), + Optional: true, + Description: "Config Drive MetaData", + MarkdownDescription: "Config Drive MetaData", + }, "config_drive_user_data": schema.StringAttribute{ CustomType: ovhtypes.TfStringType{}, Optional: true, @@ -349,6 +355,7 @@ func DedicatedServerResourceSchema(ctx context.Context) schema.Schema { Optional: true, Description: "Arbitrary properties to pass to cloud-init's config drive datasource", MarkdownDescription: "Arbitrary properties to pass to cloud-init's config drive datasource", + DeprecationMessage: "Attribute 'properties' is deprecated and has no effect", }, "rack": schema.StringAttribute{ CustomType: ovhtypes.TfStringType{}, @@ -1101,6 +1108,24 @@ func (t CustomizationsType) ValueFromObject(ctx context.Context, in basetypes.Ob attributes := in.Attributes() + configDriveMetadataAttribute, ok := attributes["config_drive_metadata"] + + if !ok { + diags.AddError( + "Attribute Missing", + `config_drive_metadata is missing from object`) + + return nil, diags + } + + configDriveMetadataVal, ok := configDriveMetadataAttribute.(ovhtypes.TfMapNestedValue[ovhtypes.TfStringValue]) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`config_drive_metadata expected to be ovhtypes.TfMapNestedValue[ovhtypes.TfStringValue], was: %T`, configDriveMetadataAttribute)) + } + configDriveUserDataAttribute, ok := attributes["config_drive_user_data"] if !ok { @@ -1322,6 +1347,7 @@ func (t CustomizationsType) ValueFromObject(ctx context.Context, in basetypes.Ob } return CustomizationsValue{ + ConfigDriveMetadata: configDriveMetadataVal, ConfigDriveUserData: configDriveUserDataVal, EfiBootloaderPath: efiBootloaderPathVal, Hostname: hostnameVal, @@ -1401,6 +1427,24 @@ func NewCustomizationsValue(attributeTypes map[string]attr.Type, attributes map[ return NewCustomizationsValueUnknown(), diags } + configDriveMetadataAttribute, ok := attributes["config_drive_metadata"] + + if !ok { + diags.AddError( + "Attribute Missing", + `config_drive_metadata is missing from object`) + + return NewCustomizationsValueUnknown(), diags + } + + configDriveMetadataVal, ok := configDriveMetadataAttribute.(ovhtypes.TfMapNestedValue[ovhtypes.TfStringValue]) + + if !ok { + diags.AddError( + "Attribute Wrong Type", + fmt.Sprintf(`config_drive_metadata expected to be ovhtypes.TfMapNestedValue[ovhtypes.TfStringValue], was: %T`, configDriveMetadataAttribute)) + } + configDriveUserDataAttribute, ok := attributes["config_drive_user_data"] if !ok { @@ -1622,6 +1666,7 @@ func NewCustomizationsValue(attributeTypes map[string]attr.Type, attributes map[ } return CustomizationsValue{ + ConfigDriveMetadata: configDriveMetadataVal, ConfigDriveUserData: configDriveUserDataVal, EfiBootloaderPath: efiBootloaderPathVal, Hostname: hostnameVal, @@ -1706,6 +1751,7 @@ func (t CustomizationsType) ValueType(ctx context.Context) attr.Value { var _ basetypes.ObjectValuable = CustomizationsValue{} type CustomizationsValue struct { + ConfigDriveMetadata ovhtypes.TfMapNestedValue[ovhtypes.TfStringValue] `tfsdk:"config_drive_metadata" json:"configDriveMetadata"` ConfigDriveUserData ovhtypes.TfStringValue `tfsdk:"config_drive_user_data" json:"configDriveUserData"` EfiBootloaderPath ovhtypes.TfStringValue `tfsdk:"efi_bootloader_path" json:"efiBootloaderPath"` Hostname ovhtypes.TfStringValue `tfsdk:"hostname" json:"hostname"` @@ -1722,6 +1768,7 @@ type CustomizationsValue struct { } type CustomizationsWritableValue struct { + ConfigDriveMetadata *ovhtypes.TfMapNestedValue[ovhtypes.TfStringValue] `json:"ConfigDriveMetadata,omitempty"` ConfigDriveUserData *ovhtypes.TfStringValue `json:"configDriveUserData,omitempty"` EfiBootloaderPath *ovhtypes.TfStringValue `json:"efiBootloaderPath,omitempty"` Hostname *ovhtypes.TfStringValue `json:"hostname,omitempty"` @@ -1787,6 +1834,10 @@ func (v CustomizationsValue) ToCreate() *CustomizationsWritableValue { res.ConfigDriveUserData = &v.ConfigDriveUserData } + if !v.ConfigDriveMetadata.IsNull() { + res.ConfigDriveMetadata = &v.ConfigDriveMetadata + } + return res } @@ -1797,6 +1848,7 @@ func (v *CustomizationsValue) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &tmp); err != nil { return err } + v.ConfigDriveMetadata = tmp.ConfigDriveMetadata v.ConfigDriveUserData = tmp.ConfigDriveUserData v.EfiBootloaderPath = tmp.EfiBootloaderPath v.Hostname = tmp.Hostname @@ -1817,6 +1869,10 @@ func (v *CustomizationsValue) UnmarshalJSON(data []byte) error { func (v *CustomizationsValue) MergeWith(other *CustomizationsValue) { + if (v.ConfigDriveMetadata.IsUnknown() || v.ConfigDriveMetadata.IsNull()) && !other.ConfigDriveMetadata.IsUnknown() { + v.ConfigDriveMetadata = other.ConfigDriveMetadata + } + if (v.ConfigDriveUserData.IsUnknown() || v.ConfigDriveUserData.IsNull()) && !other.ConfigDriveUserData.IsUnknown() { v.ConfigDriveUserData = other.ConfigDriveUserData } @@ -1872,6 +1928,7 @@ func (v *CustomizationsValue) MergeWith(other *CustomizationsValue) { func (v CustomizationsValue) Attributes() map[string]attr.Value { return map[string]attr.Value{ + "configDriveMetadata": v.ConfigDriveMetadata, "configDriveUserData": v.ConfigDriveUserData, "efiBootloaderPath": v.EfiBootloaderPath, "hostname": v.Hostname, @@ -1892,6 +1949,9 @@ func (v CustomizationsValue) ToTerraformValue(ctx context.Context) (tftypes.Valu var val tftypes.Value var err error + attrTypes["config_drive_metadata"] = basetypes.MapType{ + ElemType: types.StringType, + }.TerraformType(ctx) attrTypes["config_drive_user_data"] = basetypes.StringType{}.TerraformType(ctx) attrTypes["efi_bootloader_path"] = basetypes.StringType{}.TerraformType(ctx) attrTypes["hostname"] = basetypes.StringType{}.TerraformType(ctx) @@ -1913,6 +1973,14 @@ func (v CustomizationsValue) ToTerraformValue(ctx context.Context) (tftypes.Valu case attr.ValueStateKnown: vals := make(map[string]tftypes.Value, 12) + val, err = v.ConfigDriveMetadata.ToTerraformValue(ctx) + + if err != nil { + return tftypes.NewValue(objectType, tftypes.UnknownValue), err + } + + vals["config_drive_metadata"] = val + val, err = v.ConfigDriveUserData.ToTerraformValue(ctx) if err != nil { @@ -2040,6 +2108,7 @@ func (v CustomizationsValue) ToObjectValue(ctx context.Context) (basetypes.Objec objVal, diags := types.ObjectValue( map[string]attr.Type{ + "config_drive_metadata": ovhtypes.NewTfMapNestedType[ovhtypes.TfStringValue](ctx), "config_drive_user_data": ovhtypes.TfStringType{}, "efi_bootloader_path": ovhtypes.TfStringType{}, "hostname": ovhtypes.TfStringType{}, @@ -2054,6 +2123,7 @@ func (v CustomizationsValue) ToObjectValue(ctx context.Context) (basetypes.Objec "ssh_key": ovhtypes.TfStringType{}, }, map[string]attr.Value{ + "config_drive_metadata": v.ConfigDriveMetadata, "config_drive_user_data": v.ConfigDriveUserData, "efi_bootloader_path": v.EfiBootloaderPath, "hostname": v.Hostname, @@ -2086,6 +2156,10 @@ func (v CustomizationsValue) Equal(o attr.Value) bool { return true } + if !v.ConfigDriveMetadata.Equal(other.ConfigDriveMetadata) { + return false + } + if !v.ConfigDriveUserData.Equal(other.ConfigDriveUserData) { return false } @@ -2147,6 +2221,7 @@ func (v CustomizationsValue) Type(ctx context.Context) attr.Type { func (v CustomizationsValue) AttributeTypes(ctx context.Context) map[string]attr.Type { return map[string]attr.Type{ + "config_drive_metadata": ovhtypes.NewTfMapNestedType[ovhtypes.TfStringValue](ctx), "config_drive_user_data": ovhtypes.TfStringType{}, "efi_bootloader_path": ovhtypes.TfStringType{}, "hostname": ovhtypes.TfStringType{}, diff --git a/ovh/resource_dedicated_server_reinstall_task.go b/ovh/resource_dedicated_server_reinstall_task.go index 67599db6d..f74b69e11 100644 --- a/ovh/resource_dedicated_server_reinstall_task.go +++ b/ovh/resource_dedicated_server_reinstall_task.go @@ -48,6 +48,15 @@ func resourceDedicatedServerReinstallTask() *schema.Resource { Description: "OS reinstallation customizations", Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "config_drive_metadata": { + Type: schema.TypeMap, + Optional: true, + ForceNew: true, + Description: "Config Drive MetaData", + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, "config_drive_user_data": { Type: schema.TypeString, Optional: true, @@ -130,7 +139,7 @@ func resourceDedicatedServerReinstallTask() *schema.Resource { Type: schema.TypeMap, Optional: true, ForceNew: true, - Description: "Arbitrary properties to pass to cloud-init's config drive datasource", + Description: "Attribute 'properties' is deprecated and has no effect", Elem: &schema.Schema{ Type: schema.TypeString, }, diff --git a/ovh/resource_dedicated_server_reinstall_task_test.go b/ovh/resource_dedicated_server_reinstall_task_test.go index 2659b597b..84999e42d 100644 --- a/ovh/resource_dedicated_server_reinstall_task_test.go +++ b/ovh/resource_dedicated_server_reinstall_task_test.go @@ -292,12 +292,14 @@ resource "ovh_dedicated_server_reinstall_task" "server_reinstall" { os = "byolinux_64" customizations { hostname = "mon-tux" - image_check_sum = "047122c9ff4d2a69512212104b06c678f5a9cdb22b75467353613ff87ccd03b57b38967e56d810e61366f9d22d6bd39ac0addf4e00a4c6445112a2416af8f225" - image_check_sum_type = "sha512" image_url = "https://github.com/ashmonger/akution_test/releases/download/0.6-fixCache/deb11k6.qcow2" efi_bootloader_path = "\\efi\\debian\\grubx64.efi" ssh_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIrODOo0SvY5f0TlQNvGHIRKzr4bHPa+D5bYF18RiOgP email@example.com" config_drive_user_data = "c3NoX2F1dGhvcml6ZWRfa2V5czoKICAtIHNzaC1yc2EgQUFBQUI4ZGpZaXc9PSBteXNlbGZAbXlkb21haW4ubmV0Cgp1c2VyczoKICAtIG5hbWU6IHBhdGllbnQwCiAgICBzdWRvOiBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMCiAgICBncm91cHM6IHVzZXJzLCBzdWRvCiAgICBzaGVsbDogL2Jpbi9iYXNoCiAgICBsb2NrX3Bhc3N3ZDogZmFsc2UKICAgIHNzaF9hdXRob3JpemVkX2tleXM6CiAgICAgIC0gc3NoLXJzYSBBQUFBQjhkallpdz09IG15c2VsZkBteWRvbWFpbi5uZXQKZGlzYWJsZV9yb290OiBmYWxzZQpwYWNrYWdlczoKICAtIHZpbQogIC0gdHJlZQpmaW5hbF9tZXNzYWdlOiBUaGUgc3lzdGVtIGlzIGZpbmFsbHkgdXAsIGFmdGVyICRVUFRJTUUgc2Vjb25kcw==" + config_drive_metadata = { + foo = "bar" + hello = "world" + } http_headers = { Authorization = "Basic bG9naW46cGFzc3dvcmQ=" } diff --git a/ovh/types_dedicated_server.go b/ovh/types_dedicated_server.go index 8630e213e..ff855ef04 100644 --- a/ovh/types_dedicated_server.go +++ b/ovh/types_dedicated_server.go @@ -184,6 +184,7 @@ type ExtrasDetails struct { } type DedicatedServerReinstallTaskCustomizations struct { + ConfigDriveMetadata map[string]interface{} `json:"configDriveMetadata,omitempty"` ConfigDriveUserData *string `json:"configDriveUserData,omitempty"` EfiBootloaderPath *string `json:"efiBootloaderPath,omitempty"` Hostname *string `json:"hostname,omitempty"` @@ -199,6 +200,7 @@ type DedicatedServerReinstallTaskCustomizations struct { } func (opts *DedicatedServerReinstallTaskCustomizations) FromResource(d *schema.ResourceData, parent string) *DedicatedServerReinstallTaskCustomizations { + opts.ConfigDriveMetadata = helpers.GetMapFromData(d, fmt.Sprintf("%s.config_drive_metadata", parent)) opts.ConfigDriveUserData = helpers.GetNilStringPointerFromData(d, fmt.Sprintf("%s.config_drive_user_data", parent)) opts.EfiBootloaderPath = helpers.GetNilStringPointerFromData(d, fmt.Sprintf("%s.efi_bootloader_path", parent)) opts.Hostname = helpers.GetNilStringPointerFromData(d, fmt.Sprintf("%s.hostname", parent)) diff --git a/templates/guides/dedicated_server_migration.md b/templates/guides/dedicated_server_migration.md index 9553834a3..085f45f4f 100644 --- a/templates/guides/dedicated_server_migration.md +++ b/templates/guides/dedicated_server_migration.md @@ -37,7 +37,7 @@ terraform apply ## Second step: backport your previous task details into the imported resource -This step is manual and requires you to convert the previous installation details from resource `ovh_dedicated_server_install_task` to the new fields of resource `ovh_dedicated_server`: `os`, `customizations`, `properties` and `storage`. +This step is manual and requires you to convert the previous installation details from resource `ovh_dedicated_server_install_task` to the new fields of resource `ovh_dedicated_server`: `os`, `customizations` and `storage`. Let's take an example: if you previously used the following configuration: @@ -74,7 +74,6 @@ resource "ovh_dedicated_server" "srv" { ssh_key = "ssh-ed25519 AAAAC3..." } os = "debian12_64" - properties = null storage = null } ``` diff --git a/templates/resources/dedicated_server.md.tmpl b/templates/resources/dedicated_server.md.tmpl index 6bb1f4dd0..e3e52df42 100644 --- a/templates/resources/dedicated_server.md.tmpl +++ b/templates/resources/dedicated_server.md.tmpl @@ -56,6 +56,7 @@ Use this resource to order and manage a dedicated server. * `os` - Operating System to install * `customizations` - Customization of the OS configuration + * `config_drive_metadata` - Config Drive MetaData * `config_drive_user_data` - Config Drive UserData * `efi_bootloader_path` - Path of the EFI bootloader from the OS installed on the server * `hostname` - Custom hostname @@ -86,7 +87,7 @@ Use this resource to order and manage a dedicated server. * `raid_level` - Software raid type * `size` - Partition size in MiB * `scheme_name` - Partitioning scheme (if applicable with selected operating system) -* `properties` - Arbitrary properties to pass to cloud-init's config drive datasource +* `properties` - Attribute 'properties' is deprecated and has no effect ### Arguments used to control the lifecycle of a dedicated server diff --git a/templates/resources/dedicated_server_reinstall_task.md.tmpl b/templates/resources/dedicated_server_reinstall_task.md.tmpl index 7019362bc..109dfe30c 100644 --- a/templates/resources/dedicated_server_reinstall_task.md.tmpl +++ b/templates/resources/dedicated_server_reinstall_task.md.tmpl @@ -85,7 +85,7 @@ The following arguments are supported: ~> **WARNING** Some customizations may be required on some Operating Systems. [Check how to list the available and required customization(s) for your operating system](https://help.ovhcloud.com/csm/en-dedicated-servers-api-os-installation?id=kb_article_view&sysparm_article=KB0061951#os-inputs) (do not forget to adapt camel case customization name to snake case parameter). -* `properties` - Arbitrary properties to pass to cloud-init's config drive datasource. It supports any key with any string value. +* `properties` - Attribute 'properties' is deprecated and has no effect. * `storage`: OS reinstallation storage configurations. [More details about disks, hardware/software RAID and partitioning configuration](https://help.ovhcloud.com/csm/en-dedicated-servers-api-partitioning?id=kb_article_view&sysparm_article=KB0043882) (do not forget to adapt camel case parameters to snake case parameters). * `disk_group_id`: Disk group id to install the OS to (default is 0, meaning automatic).