diff --git a/GNUmakefile b/GNUmakefile index fbd299ab..36cf3421 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,5 +1,5 @@ TEST?=netbox/*.go -TEST_FUNC?=TestAccNetboxRack_basic +TEST_FUNC?=TestAccNetboxVirtualMachine* GOFMT_FILES?=$$(find . -name '*.go' | grep -v vendor) DOCKER_COMPOSE=docker compose diff --git a/docs/data-sources/virtual_machines.md b/docs/data-sources/virtual_machines.md index 204318a2..00c9f6e1 100644 --- a/docs/data-sources/virtual_machines.md +++ b/docs/data-sources/virtual_machines.md @@ -62,7 +62,7 @@ Read-Only: - `description` (String) - `device_id` (Number) - `device_name` (String) -- `disk_size_gb` (Number) +- `disk_size_mb` (Number) - `local_context_data` (String) - `memory_mb` (Number) - `name` (String) diff --git a/docs/resources/event_rule.md b/docs/resources/event_rule.md index 18477de3..1739b70b 100644 --- a/docs/resources/event_rule.md +++ b/docs/resources/event_rule.md @@ -22,11 +22,11 @@ resource "netbox_webhook" "test" { } resource "netbox_event_rule" "test" { - name = "my-event-rule" - content_types = ["dcim.site", "virtualization.cluster"] - action_type = "webhook" - action_object_id = netbox_webhook.test.id - event_types = [ + name = "my-event-rule" + content_types = ["dcim.site", "virtualization.cluster"] + action_type = "webhook" + action_object_id = netbox_webhook.test.id + event_types = [ "object_created", "object_updated", "object_deleted", diff --git a/docs/resources/virtual_disk.md b/docs/resources/virtual_disk.md index d5401453..89245554 100644 --- a/docs/resources/virtual_disk.md +++ b/docs/resources/virtual_disk.md @@ -29,7 +29,7 @@ resource "netbox_virtual_machine" "base_vm" { resource "netbox_virtual_disk" "example" { name = "disk-01" description = "Main disk" - size_gb = 50 + size_mb = 50 virtual_machine_id = netbox_virtual_machine.base_vm.id } ``` @@ -40,7 +40,7 @@ resource "netbox_virtual_disk" "example" { ### Required - `name` (String) -- `size_gb` (Number) +- `size_mb` (Number) - `virtual_machine_id` (Number) ### Optional diff --git a/docs/resources/virtual_machine.md b/docs/resources/virtual_machine.md index 9362e7a6..8d0591a7 100644 --- a/docs/resources/virtual_machine.md +++ b/docs/resources/virtual_machine.md @@ -33,7 +33,7 @@ data "netbox_cluster" "vmw_cluster_01" { resource "netbox_virtual_machine" "basic_vm" { cluster_id = data.netbox_cluster.vmw_cluster_01.id name = "myvm-2" - disk_size_gb = 40 + disk_size_mb = 40000 memory_mb = 4092 vcpus = "2" } @@ -50,7 +50,7 @@ data "netbox_tenant" "customer_a" { resource "netbox_virtual_machine" "full_vm" { cluster_id = data.netbox_cluster.vmw_cluster_01.id name = "myvm-3" - disk_size_gb = 40 + disk_size_mb = 40000 memory_mb = 4092 vcpus = "2" role_id = 31 // This corresponds to the Netbox ID for a given role @@ -76,7 +76,7 @@ resource "netbox_virtual_machine" "full_vm" { - `custom_fields` (Map of String) - `description` (String) - `device_id` (Number) -- `disk_size_gb` (Number) +- `disk_size_mb` (Number) - `local_context_data` (String) This is best managed through the use of `jsonencode` and a map of settings. - `memory_mb` (Number) - `platform_id` (Number) diff --git a/docs/resources/vlan_group.md b/docs/resources/vlan_group.md index 39457353..cbddf85f 100644 --- a/docs/resources/vlan_group.md +++ b/docs/resources/vlan_group.md @@ -15,8 +15,8 @@ description: |- ```terraform #Basic VLAN Group example resource "netbox_vlan_group" "example1" { - name = "example1" - slug = "example1" + name = "example1" + slug = "example1" } #Full VLAN Group example diff --git a/example/main.tf b/example/main.tf index 5f33782d..9c980191 100644 --- a/example/main.tf +++ b/example/main.tf @@ -77,7 +77,7 @@ resource "netbox_virtual_machine" "testvm" { comments = "my-test-comment" memory_mb = 1024 vcpus = 4 - disk_size_gb = 512 + disk_size_mb = 512 cluster_id = netbox_cluster.testcluster.id tenant_id = netbox_tenant.testtenant.id platform_id = netbox_platform.testplatform.id diff --git a/examples/resources/netbox_event_rule/resource.tf b/examples/resources/netbox_event_rule/resource.tf index 8cbffd5a..4c7489d5 100644 --- a/examples/resources/netbox_event_rule/resource.tf +++ b/examples/resources/netbox_event_rule/resource.tf @@ -4,11 +4,11 @@ resource "netbox_webhook" "test" { } resource "netbox_event_rule" "test" { - name = "my-event-rule" - content_types = ["dcim.site", "virtualization.cluster"] - action_type = "webhook" - action_object_id = netbox_webhook.test.id - event_types = [ + name = "my-event-rule" + content_types = ["dcim.site", "virtualization.cluster"] + action_type = "webhook" + action_object_id = netbox_webhook.test.id + event_types = [ "object_created", "object_updated", "object_deleted", diff --git a/examples/resources/netbox_virtual_disk/resource.tf b/examples/resources/netbox_virtual_disk/resource.tf index e628e584..a8134a5c 100644 --- a/examples/resources/netbox_virtual_disk/resource.tf +++ b/examples/resources/netbox_virtual_disk/resource.tf @@ -11,6 +11,6 @@ resource "netbox_virtual_machine" "base_vm" { resource "netbox_virtual_disk" "example" { name = "disk-01" description = "Main disk" - size_gb = 50 + size_mb = 50 virtual_machine_id = netbox_virtual_machine.base_vm.id } diff --git a/examples/resources/netbox_virtual_machine/resource.tf b/examples/resources/netbox_virtual_machine/resource.tf index bc478cc6..95184279 100644 --- a/examples/resources/netbox_virtual_machine/resource.tf +++ b/examples/resources/netbox_virtual_machine/resource.tf @@ -15,7 +15,7 @@ data "netbox_cluster" "vmw_cluster_01" { resource "netbox_virtual_machine" "basic_vm" { cluster_id = data.netbox_cluster.vmw_cluster_01.id name = "myvm-2" - disk_size_gb = 40 + disk_size_mb = 40000 memory_mb = 4092 vcpus = "2" } @@ -32,7 +32,7 @@ data "netbox_tenant" "customer_a" { resource "netbox_virtual_machine" "full_vm" { cluster_id = data.netbox_cluster.vmw_cluster_01.id name = "myvm-3" - disk_size_gb = 40 + disk_size_mb = 40000 memory_mb = 4092 vcpus = "2" role_id = 31 // This corresponds to the Netbox ID for a given role diff --git a/examples/resources/netbox_vlan_group/resource.tf b/examples/resources/netbox_vlan_group/resource.tf index 7edb16eb..58452c29 100644 --- a/examples/resources/netbox_vlan_group/resource.tf +++ b/examples/resources/netbox_vlan_group/resource.tf @@ -1,7 +1,7 @@ #Basic VLAN Group example resource "netbox_vlan_group" "example1" { - name = "example1" - slug = "example1" + name = "example1" + slug = "example1" } #Full VLAN Group example diff --git a/netbox/data_source_netbox_virtual_machines.go b/netbox/data_source_netbox_virtual_machines.go index 2180164d..c1694d0e 100644 --- a/netbox/data_source_netbox_virtual_machines.go +++ b/netbox/data_source_netbox_virtual_machines.go @@ -77,7 +77,7 @@ func dataSourceNetboxVirtualMachine() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "disk_size_gb": { + "disk_size_mb": { Type: schema.TypeInt, Computed: true, }, @@ -244,7 +244,7 @@ func dataSourceNetboxVirtualMachineRead(d *schema.ResourceData, m interface{}) e mapping["custom_fields"] = v.CustomFields } if v.Disk != nil { - mapping["disk_size_gb"] = *v.Disk / 1000 + mapping["disk_size_mb"] = *v.Disk } if v.LocalContextData != nil { if localContextData, err := json.Marshal(v.LocalContextData); err == nil { diff --git a/netbox/data_source_netbox_virtual_machines_test.go b/netbox/data_source_netbox_virtual_machines_test.go index 9b7cbb24..4639bd8d 100644 --- a/netbox/data_source_netbox_virtual_machines_test.go +++ b/netbox/data_source_netbox_virtual_machines_test.go @@ -24,7 +24,7 @@ func TestAccNetboxVirtualMachinesDataSource_basic(t *testing.T) { resource.TestCheckResourceAttr("data.netbox_virtual_machines.test", "vms.0.name", testName+"_0"), resource.TestCheckResourceAttr("data.netbox_virtual_machines.test", "vms.0.vcpus", "4"), resource.TestCheckResourceAttr("data.netbox_virtual_machines.test", "vms.0.memory_mb", "1024"), - resource.TestCheckResourceAttr("data.netbox_virtual_machines.test", "vms.0.disk_size_gb", "256"), + resource.TestCheckResourceAttr("data.netbox_virtual_machines.test", "vms.0.disk_size_mb", "256"), resource.TestCheckResourceAttr("data.netbox_virtual_machines.test", "vms.0.comments", "thisisacomment"), resource.TestCheckResourceAttrPair("data.netbox_virtual_machines.test", "vms.0.tenant_id", "netbox_tenant.test", "id"), resource.TestCheckResourceAttrPair("data.netbox_virtual_machines.test", "vms.0.role_id", "netbox_device_role.test", "id"), @@ -126,7 +126,7 @@ resource "netbox_virtual_machine" "test0" { device_id = netbox_device.test.id comments = "thisisacomment" memory_mb = 1024 - disk_size_gb = 256 + disk_size_mb = 256 tenant_id = netbox_tenant.test.id role_id = netbox_device_role.test.id platform_id = netbox_platform.test.id @@ -156,11 +156,11 @@ resource "netbox_virtual_machine" "test3" { func testAccNetboxVirtualMachineDataSourceDependenciesWithTags(testName string) string { return testAccNetboxVirtualMachineFullDependencies(testName) + fmt.Sprintf(` resource "netbox_tag" "servicea" { - name = "%[1]s_service-a" + name = "%[1]s_service-a" } resource "netbox_tag" "serviceb" { - name = "%[1]s_service-b" + name = "%[1]s_service-b" } resource "netbox_virtual_machine" "test0" { @@ -169,33 +169,33 @@ resource "netbox_virtual_machine" "test0" { site_id = netbox_site.test.id comments = "thisisacomment" memory_mb = 1024 - disk_size_gb = 256 + disk_size_mb = 256 tenant_id = netbox_tenant.test.id role_id = netbox_device_role.test.id platform_id = netbox_platform.test.id vcpus = 4 tags = [ - netbox_tag.servicea.name, - netbox_tag.serviceb.name, - ] + netbox_tag.servicea.name, + netbox_tag.serviceb.name, + ] } resource "netbox_virtual_machine" "test1" { name = "%[1]s_1" cluster_id = netbox_cluster.test.id site_id = netbox_site.test.id - tags = [ - netbox_tag.servicea.name, - ] + tags = [ + netbox_tag.servicea.name, + ] } resource "netbox_virtual_machine" "test2" { name = "%[1]s_2_regex" cluster_id = netbox_cluster.test.id site_id = netbox_site.test.id - tags = [ - netbox_tag.serviceb.name, - ] + tags = [ + netbox_tag.serviceb.name, + ] } `, testName) } @@ -242,12 +242,12 @@ data "netbox_virtual_machines" "test" { func testAccNetboxVirtualMachineDataSourceTagA(testName string) string { return fmt.Sprintf(` - data "netbox_virtual_machines" "tag-a" { - filter { - name = "tag" - value = "%[1]s_service-a" - } - }`, testName) +data "netbox_virtual_machines" "tag-a" { + filter { + name = "tag" + value = "%[1]s_service-a" + } +}`, testName) } func testAccNetboxVirtualMachineDataSourceTagB(testName string) string { @@ -256,21 +256,21 @@ data "netbox_virtual_machines" "tag-b" { filter { name = "tag" value = "%[1]s_service-b" - } + } }`, testName) } func testAccNetboxVirtualMachineDataSourceTagAB(testName string) string { return fmt.Sprintf(` data "netbox_virtual_machines" "tag-ab" { - filter { + filter { name = "tag" value = "%[1]s_service-a" - } + } filter { name = "tag" value = "%[1]s_service-b" - } + } }`, testName) } @@ -293,40 +293,40 @@ data "netbox_virtual_machines" "test_decommissioning" { func testAccNetboxVirtualMachineDataSourceDependenciesWithStatus(testName string) string { return testAccNetboxVirtualMachineFullDependencies(testName) + fmt.Sprintf(` resource "netbox_tag" "servicea" { - name = "%[1]s_service-a" + name = "%[1]s_service-a" } resource "netbox_virtual_machine" "test0" { - name = "%[1]s_0" - cluster_id = netbox_cluster.test.id - site_id = netbox_site.test.id - comments = "thisisacomment" - memory_mb = 1024 - disk_size_gb = 256 - tenant_id = netbox_tenant.test.id - role_id = netbox_device_role.test.id - platform_id = netbox_platform.test.id - vcpus = 4 - status = "active" - tags = [ - netbox_tag.servicea.name, - ] + name = "%[1]s_0" + cluster_id = netbox_cluster.test.id + site_id = netbox_site.test.id + comments = "thisisacomment" + memory_mb = 1024 + disk_size_mb = 256 + tenant_id = netbox_tenant.test.id + role_id = netbox_device_role.test.id + platform_id = netbox_platform.test.id + vcpus = 4 + status = "active" + tags = [ + netbox_tag.servicea.name, + ] } resource "netbox_virtual_machine" "test1" { - name = "%[1]s_1" - cluster_id = netbox_cluster.test.id - site_id = netbox_site.test.id - comments = "thisisacomment" - memory_mb = 1024 - disk_size_gb = 256 - tenant_id = netbox_tenant.test.id - role_id = netbox_device_role.test.id - platform_id = netbox_platform.test.id - vcpus = 4 - status = "decommissioning" - tags = [ - netbox_tag.servicea.name, - ] + name = "%[1]s_1" + cluster_id = netbox_cluster.test.id + site_id = netbox_site.test.id + comments = "thisisacomment" + memory_mb = 1024 + disk_size_mb = 256 + tenant_id = netbox_tenant.test.id + role_id = netbox_device_role.test.id + platform_id = netbox_platform.test.id + vcpus = 4 + status = "decommissioning" + tags = [ + netbox_tag.servicea.name, + ] }`, testName) } diff --git a/netbox/provider.go b/netbox/provider.go index 0d24e6b3..0f5da73f 100644 --- a/netbox/provider.go +++ b/netbox/provider.go @@ -296,7 +296,7 @@ func providerConfigure(ctx context.Context, data *schema.ResourceData) (interfac netboxVersion := res.GetPayload().(map[string]interface{})["netbox-version"].(string) - supportedVersions := []string{"4.1.0", "4.1.1", "4.1.2", "4.1.3"} + supportedVersions := []string{"4.1.0", "4.1.1", "4.1.2", "4.1.3", "4.1.4", "4.1.5", "4.1.6", "4.1.7", "4.1.8", "4.1.10", "4.1.11"} if !slices.Contains(supportedVersions, netboxVersion) { // Currently, there is no way to test these warnings. There is an issue to track this: https://github.com/hashicorp/terraform-plugin-sdk/issues/864 diff --git a/netbox/resource_netbox_primary_ip_test.go b/netbox/resource_netbox_primary_ip_test.go index d14230b9..108eb990 100644 --- a/netbox/resource_netbox_primary_ip_test.go +++ b/netbox/resource_netbox_primary_ip_test.go @@ -64,7 +64,7 @@ resource "netbox_virtual_machine" "test" { site_id = netbox_site.test.id comments = "thisisacomment" memory_mb = 1024 - disk_size_gb = 256 + disk_size_mb = 256 tenant_id = netbox_tenant.test.id role_id = netbox_device_role.test.id platform_id = netbox_platform.test.id @@ -115,7 +115,7 @@ resource "netbox_primary_ip" "test_v4" { resource.TestCheckResourceAttr("netbox_virtual_machine.test", "comments", "thisisacomment"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "memory_mb", "1024"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "vcpus", "4"), - resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_gb", "256"), + resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_mb", "256"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.#", "1"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.0", testName), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "status", "planned"), @@ -159,7 +159,7 @@ resource "netbox_primary_ip" "test_v6" { resource.TestCheckResourceAttr("netbox_virtual_machine.test", "comments", "thisisacomment"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "memory_mb", "1024"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "vcpus", "4"), - resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_gb", "256"), + resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_mb", "256"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.#", "1"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.0", testName), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "status", "planned"), diff --git a/netbox/resource_netbox_virtual_disk.go b/netbox/resource_netbox_virtual_disk.go index 44b3c653..4aab3c84 100644 --- a/netbox/resource_netbox_virtual_disk.go +++ b/netbox/resource_netbox_virtual_disk.go @@ -30,7 +30,7 @@ func resourceNetboxVirtualDisks() *schema.Resource { Type: schema.TypeString, Optional: true, }, - "size_gb": { + "size_mb": { Type: schema.TypeInt, Required: true, }, @@ -44,6 +44,14 @@ func resourceNetboxVirtualDisks() *schema.Resource { Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, + SchemaVersion: 1, + StateUpgraders: []schema.StateUpgrader{ + { + Type: resourceNetboxVirtualDiskResourceV0().CoreConfigSchema().ImpliedType(), + Upgrade: resourceNetboxVirtualDiskStateUpgradeV0, + Version: 0, + }, + }, } } @@ -51,7 +59,7 @@ func resourceNetboxVirtualDisksCreate(ctx context.Context, d *schema.ResourceDat api := m.(*client.NetBoxAPI) name := d.Get("name").(string) - size := d.Get("size_gb").(int) + size := d.Get("size_mb").(int) virtualMachineID := d.Get("virtual_machine_id").(int) data := models.WritableVirtualDisk{ @@ -110,7 +118,7 @@ func resourceNetboxVirtualDisksRead(ctx context.Context, d *schema.ResourceData, d.Set("description", VirtualDisks.Description) if VirtualDisks.Size != nil { - d.Set("size_gb", *VirtualDisks.Size) + d.Set("size_mb", *VirtualDisks.Size) } if VirtualDisks.VirtualMachine != nil { d.Set("virtual_machine_id", VirtualDisks.VirtualMachine.ID) @@ -132,7 +140,7 @@ func resourceNetboxVirtualDisksUpdate(ctx context.Context, d *schema.ResourceDat data := models.WritableVirtualDisk{} name := d.Get("name").(string) - size := int64(d.Get("size_gb").(int)) + size := int64(d.Get("size_mb").(int)) virtualMachineID := int64(d.Get("virtual_machine_id").(int)) data.Name = &name diff --git a/netbox/resource_netbox_virtual_disk_migrate_v0.go b/netbox/resource_netbox_virtual_disk_migrate_v0.go new file mode 100644 index 00000000..d77c5fcf --- /dev/null +++ b/netbox/resource_netbox_virtual_disk_migrate_v0.go @@ -0,0 +1,53 @@ +package netbox + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func resourceNetboxVirtualDiskResourceV0() *schema.Resource { + return &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + }, + "description": { + Type: schema.TypeString, + Optional: true, + }, + "size_mb": { + Type: schema.TypeInt, + Required: true, + }, + "virtual_machine_id": { + Type: schema.TypeInt, + Required: true, + }, + tagsKey: tagsSchema, + customFieldsKey: customFieldsSchema, + }, + } +} + +func resourceNetboxVirtualDiskStateUpgradeV0(_ context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { + v, ok := rawState["size_gb"].(float64) + if !ok { + log.Printf("[DEBUG] disk size before migration isnt float64: %#v\n but a %T", rawState["size_gb"], rawState["size_gb"]) + rawState["size_mb"] = float64(0) + delete(rawState, "size_gb") + return rawState, nil + } + + log.Printf("[DEBUG] disk size in GB before migration: %#v\n", rawState["size_gb"]) + + // set new disk size + rawState["size_mb"] = v * 1000 + log.Printf("[DEBUG] disk size in MB after migration: %#v\n", rawState["size_mb"]) + + delete(rawState, "size_gb") + + return rawState, nil +} diff --git a/netbox/resource_netbox_virtual_disk_test.go b/netbox/resource_netbox_virtual_disk_test.go index 77a6702b..862a51fb 100644 --- a/netbox/resource_netbox_virtual_disk_test.go +++ b/netbox/resource_netbox_virtual_disk_test.go @@ -37,7 +37,7 @@ resource "netbox_virtual_machine" "test" { resource "netbox_virtual_disk" "test" { name = "%[1]s" description = "description" - size_gb = 30 + size_mb = 30 virtual_machine_id = netbox_virtual_machine.test.id tags = [netbox_tag.tag_a.name] } @@ -60,7 +60,7 @@ resource "netbox_virtual_machine" "test" { resource "netbox_virtual_disk" "test" { name = "%[1]s_updated" description = "description updated" - size_gb = 60 + size_mb = 60 virtual_machine_id = netbox_virtual_machine.test.id tags = [netbox_tag.tag_a.name] } diff --git a/netbox/resource_netbox_virtual_machine.go b/netbox/resource_netbox_virtual_machine.go index 9b65764c..1422373f 100644 --- a/netbox/resource_netbox_virtual_machine.go +++ b/netbox/resource_netbox_virtual_machine.go @@ -73,7 +73,7 @@ func resourceNetboxVirtualMachine() *schema.Resource { Type: schema.TypeFloat, Optional: true, }, - "disk_size_gb": { + "disk_size_mb": { Type: schema.TypeInt, Optional: true, Computed: true, @@ -104,13 +104,18 @@ func resourceNetboxVirtualMachine() *schema.Resource { Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, - SchemaVersion: 1, + SchemaVersion: 2, StateUpgraders: []schema.StateUpgrader{ { Type: resourceNetboxVirtualMachineResourceV0().CoreConfigSchema().ImpliedType(), Upgrade: resourceNetboxVirtualMachineStateUpgradeV0, Version: 0, }, + { + Type: resourceNetboxVirtualMachineResourceV1().CoreConfigSchema().ImpliedType(), + Upgrade: resourceNetboxVirtualMachineStateUpgradeV1, + Version: 1, + }, }, } } @@ -151,10 +156,10 @@ func resourceNetboxVirtualMachineCreate(ctx context.Context, d *schema.ResourceD data.Memory = &memoryMb } - diskSizeValue, ok := d.GetOk("disk_size_gb") + diskSizeValue, ok := d.GetOk("disk_size_mb") if ok { - diskSizeMb := int64(diskSizeValue.(int)) * 1000 - data.Disk = &diskSizeMb + diskSize := int64(diskSizeValue.(int)) + data.Disk = &diskSize } tenantIDValue, ok := d.GetOk("tenant_id") @@ -308,10 +313,7 @@ func resourceNetboxVirtualMachineRead(ctx context.Context, d *schema.ResourceDat d.Set("vcpus", nil) } d.Set("memory_mb", vm.Memory) - if vm.Disk != nil { - diskSizeGb := *vm.Disk / 1000 - d.Set("disk_size_gb", diskSizeGb) - } + d.Set("disk_size_mb", vm.Disk) if vm.Status != nil { d.Set("status", vm.Status.Value) } else { @@ -384,10 +386,10 @@ func resourceNetboxVirtualMachineUpdate(ctx context.Context, d *schema.ResourceD data.Vcpus = &vcpus } - diskSizeValue, ok := d.GetOk("disk_size_gb") + diskSizeValue, ok := d.GetOk("disk_size_mb") if ok { - diskSizeMb := int64(diskSizeValue.(int)) * 1000 - data.Disk = &diskSizeMb + diskSize := int64(diskSizeValue.(int)) + data.Disk = &diskSize } primaryIP4Value, ok := d.GetOk("primary_ipv4") diff --git a/netbox/resource_netbox_virtual_machine_migrate_v1.go b/netbox/resource_netbox_virtual_machine_migrate_v1.go new file mode 100644 index 00000000..383b1c08 --- /dev/null +++ b/netbox/resource_netbox_virtual_machine_migrate_v1.go @@ -0,0 +1,105 @@ +package netbox + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func resourceNetboxVirtualMachineResourceV1() *schema.Resource { + return &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + }, + "cluster_id": { + Type: schema.TypeInt, + Optional: true, + AtLeastOneOf: []string{"site_id", "cluster_id"}, + }, + "tenant_id": { + Type: schema.TypeInt, + Optional: true, + }, + "device_id": { + Type: schema.TypeInt, + Optional: true, + }, + "platform_id": { + Type: schema.TypeInt, + Optional: true, + }, + "role_id": { + Type: schema.TypeInt, + Optional: true, + }, + "site_id": { + Type: schema.TypeInt, + Optional: true, + AtLeastOneOf: []string{"site_id", "cluster_id"}, + }, + "comments": { + Type: schema.TypeString, + Optional: true, + }, + "description": { + Type: schema.TypeString, + Optional: true, + }, + "memory_mb": { + Type: schema.TypeInt, + Optional: true, + }, + "vcpus": { + Type: schema.TypeFloat, + Optional: true, + }, + "disk_size_gb": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Optional: true, + Default: "active", + }, + tagsKey: tagsSchema, + "primary_ipv4": { + Type: schema.TypeInt, + Computed: true, + }, + "primary_ipv6": { + Type: schema.TypeInt, + Computed: true, + }, + "local_context_data": { + Type: schema.TypeString, + Optional: true, + Description: "This is best managed through the use of `jsonencode` and a map of settings.", + }, + customFieldsKey: customFieldsSchema, + }, + } +} +func resourceNetboxVirtualMachineStateUpgradeV1(_ context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { + v, ok := rawState["disk_size_gb"].(float64) + if !ok { + log.Printf("[DEBUG] disk size before migration isnt float64: %#v\n but a %T", rawState["disk_size_gb"], rawState["disk_size_gb"]) + rawState["disk_size_mb"] = float64(0) + delete(rawState, "disk_size_gb") + return rawState, nil + } + + log.Printf("[DEBUG] disk size in GB before migration: %#v\n", rawState["disk_size_gb"]) + + // set new disk size + rawState["disk_size_mb"] = v * 1000 + log.Printf("[DEBUG] disk size in MB after migration: %#v\n", rawState["disk_size_mb"]) + + delete(rawState, "disk_size_gb") + + return rawState, nil +} diff --git a/netbox/resource_netbox_virtual_machine_migrate_v1_test.go b/netbox/resource_netbox_virtual_machine_migrate_v1_test.go new file mode 100644 index 00000000..bab46e31 --- /dev/null +++ b/netbox/resource_netbox_virtual_machine_migrate_v1_test.go @@ -0,0 +1,41 @@ +package netbox + +import ( + "context" + "reflect" + "testing" +) + +func TestResourceNetboxVirtualMachineStateUpgradeV1(t *testing.T) { + for _, tt := range []struct { + name string + state map[string]interface{} + expected map[string]interface{} + }{ + { + name: "Zero", + state: map[string]interface{}{"disk_size_gb": float64(0)}, + expected: map[string]interface{}{"disk_size_mb": float64(0)}, + }, + { + name: "NonZero", + state: map[string]interface{}{"disk_size_gb": float64(123)}, + expected: map[string]interface{}{"disk_size_mb": float64(123000)}, + }, + { + name: "Invalid", + state: map[string]interface{}{"disk_size_gb": "foo"}, + expected: map[string]interface{}{"disk_size_mb": float64(0)}, + }, + } { + t.Run(tt.name, func(t *testing.T) { + actual, err := resourceNetboxVirtualMachineStateUpgradeV1(context.Background(), tt.state, nil) + if err != nil { + t.Fatalf("error migrating state: %s", err) + } + if !reflect.DeepEqual(tt.expected, actual) { + t.Fatalf("\n\nexpected:\n\n%#v\n\ngot:\n\n%#v\n\n", tt.expected, actual) + } + }) + } +} diff --git a/netbox/resource_netbox_virtual_machine_test.go b/netbox/resource_netbox_virtual_machine_test.go index 4d6746bc..15c24968 100644 --- a/netbox/resource_netbox_virtual_machine_test.go +++ b/netbox/resource_netbox_virtual_machine_test.go @@ -190,7 +190,7 @@ resource "netbox_virtual_machine" "test" { comments = "thisisacomment" description = "thisisadescription" memory_mb = 1024 - disk_size_gb = 256 + disk_size_mb = 256 tenant_id = netbox_tenant.test.id role_id = netbox_device_role.test.id platform_id = netbox_platform.test.id @@ -210,7 +210,7 @@ resource "netbox_virtual_machine" "test" { resource.TestCheckResourceAttr("netbox_virtual_machine.test", "description", "thisisadescription"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "memory_mb", "1024"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "vcpus", "4"), - resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_gb", "256"), + resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_mb", "256"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "status", "active"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.#", "1"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.0", testName+"a"), @@ -224,7 +224,7 @@ resource "netbox_virtual_machine" "test" { comments = "thisisacomment" description = "thisisadescription" memory_mb = 1024 - disk_size_gb = 256 + disk_size_mb = 256 tenant_id = netbox_tenant.test.id role_id = netbox_device_role.test.id platform_id = netbox_platform.test.id @@ -242,7 +242,7 @@ resource "netbox_virtual_machine" "test" { resource.TestCheckResourceAttr("netbox_virtual_machine.test", "description", "thisisadescription"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "memory_mb", "1024"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "vcpus", "4"), - resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_gb", "256"), + resource.TestCheckResourceAttr("netbox_virtual_machine.test", "disk_size_mb", "256"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "status", "active"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.#", "1"), resource.TestCheckResourceAttr("netbox_virtual_machine.test", "tags.0", testName+"a"),