From 137de92d1c4a2afa1e2aa5b69de6485bbd35bd5b Mon Sep 17 00:00:00 2001 From: Zhiwei Liang <121905282+zliang-akamai@users.noreply.github.com> Date: Thu, 5 Mar 2026 14:03:10 -0500 Subject: [PATCH 1/3] Fix VPC interface addresses flattening (#408) * Fix VPC interface addresses flattening in `flattenVPCInterface` * Comprehensive uni test suites for flatten functions * format --- .../linode/step_create_disk_config_test.go | 155 ++++++++++- builder/linode/step_create_linode.go | 4 +- builder/linode/step_create_linode_test.go | 252 ++++++++++++++++++ 3 files changed, 399 insertions(+), 12 deletions(-) create mode 100644 builder/linode/step_create_linode_test.go diff --git a/builder/linode/step_create_disk_config_test.go b/builder/linode/step_create_disk_config_test.go index e3ffd48c..28fd35a7 100644 --- a/builder/linode/step_create_disk_config_test.go +++ b/builder/linode/step_create_disk_config_test.go @@ -1,6 +1,7 @@ package linode import ( + "reflect" "strings" "testing" @@ -271,22 +272,52 @@ func TestFlattenDisk(t *testing.T) { t.Run(tt.name, func(t *testing.T) { got := flattenDisk(tt.disk) - if got.Label != tt.want.Label { - t.Errorf("flattenDisk() Label = %v, want %v", got.Label, tt.want.Label) - } - if got.Size != tt.want.Size { - t.Errorf("flattenDisk() Size = %v, want %v", got.Size, tt.want.Size) - } - if got.Image != tt.want.Image { - t.Errorf("flattenDisk() Image = %v, want %v", got.Image, tt.want.Image) - } - if got.Filesystem != tt.want.Filesystem { - t.Errorf("flattenDisk() Filesystem = %v, want %v", got.Filesystem, tt.want.Filesystem) + if !reflect.DeepEqual(got, tt.want) { + t.Fatalf("flattenDisk() = %+v, want %+v", got, tt.want) } }) } } +func TestFlattenDisk_AllFields(t *testing.T) { + disk := Disk{ + Label: "boot", + Size: 32000, + Image: "linode/ubuntu24.04", + Filesystem: "ext4", + AuthorizedKeys: []string{"ssh-rsa AAAA-test"}, + AuthorizedUsers: []string{"root", "devops"}, + StackscriptID: 123, + StackscriptData: map[string]string{"foo": "bar"}, + } + + got := flattenDisk(disk) + if got.Label != disk.Label { + t.Fatalf("Label = %q, want %q", got.Label, disk.Label) + } + if got.Size != disk.Size { + t.Fatalf("Size = %d, want %d", got.Size, disk.Size) + } + if got.Image != disk.Image { + t.Fatalf("Image = %q, want %q", got.Image, disk.Image) + } + if got.Filesystem != disk.Filesystem { + t.Fatalf("Filesystem = %q, want %q", got.Filesystem, disk.Filesystem) + } + if len(got.AuthorizedKeys) != 1 || got.AuthorizedKeys[0] != "ssh-rsa AAAA-test" { + t.Fatalf("AuthorizedKeys = %v, want [ssh-rsa AAAA-test]", got.AuthorizedKeys) + } + if len(got.AuthorizedUsers) != 2 || got.AuthorizedUsers[0] != "root" || got.AuthorizedUsers[1] != "devops" { + t.Fatalf("AuthorizedUsers = %v, want [root devops]", got.AuthorizedUsers) + } + if got.StackscriptID != 123 { + t.Fatalf("StackscriptID = %d, want 123", got.StackscriptID) + } + if got.StackscriptData["foo"] != "bar" { + t.Fatalf("StackscriptData = %v, want map[foo:bar]", got.StackscriptData) + } +} + func TestFlattenInstanceConfigHelpers(t *testing.T) { t.Run("Nil helpers returns nil", func(t *testing.T) { result := flattenInstanceConfigHelpers(nil) @@ -437,10 +468,112 @@ func TestFlattenInstanceConfig(t *testing.T) { if opts.Label != tt.config.Label { t.Errorf("flattenInstanceConfig() Label = %v, want %v", opts.Label, tt.config.Label) } + if opts.Comments != tt.config.Comments { + t.Errorf("flattenInstanceConfig() Comments = %v, want %v", opts.Comments, tt.config.Comments) + } + + if tt.config.Devices != nil { + if tt.config.Devices.SDA != nil { + if opts.Devices.SDA == nil || opts.Devices.SDA.DiskID != diskLabelToID[tt.config.Devices.SDA.DiskLabel] { + t.Errorf("flattenInstanceConfig() SDA = %v, want disk id %d", opts.Devices.SDA, diskLabelToID[tt.config.Devices.SDA.DiskLabel]) + } + } + if tt.config.Devices.SDB != nil { + if opts.Devices.SDB == nil || opts.Devices.SDB.DiskID != diskLabelToID[tt.config.Devices.SDB.DiskLabel] { + t.Errorf("flattenInstanceConfig() SDB = %v, want disk id %d", opts.Devices.SDB, diskLabelToID[tt.config.Devices.SDB.DiskLabel]) + } + } + } + + if len(opts.Interfaces) != len(tt.config.Interfaces) { + t.Errorf("flattenInstanceConfig() Interfaces length = %d, want %d", len(opts.Interfaces), len(tt.config.Interfaces)) + } + for i := range tt.config.Interfaces { + if i >= len(opts.Interfaces) { + break + } + if opts.Interfaces[i].Purpose != linodego.ConfigInterfacePurpose(tt.config.Interfaces[i].Purpose) { + t.Errorf("flattenInstanceConfig() Interfaces[%d].Purpose = %q, want %q", i, opts.Interfaces[i].Purpose, tt.config.Interfaces[i].Purpose) + } + if opts.Interfaces[i].Primary != tt.config.Interfaces[i].Primary { + t.Errorf("flattenInstanceConfig() Interfaces[%d].Primary = %v, want %v", i, opts.Interfaces[i].Primary, tt.config.Interfaces[i].Primary) + } + } + + if tt.config.RootDevice == "" { + if opts.RootDevice != nil { + t.Errorf("flattenInstanceConfig() RootDevice = %v, want nil", opts.RootDevice) + } + } else { + if opts.RootDevice == nil || *opts.RootDevice != tt.config.RootDevice { + t.Errorf("flattenInstanceConfig() RootDevice = %v, want %q", opts.RootDevice, tt.config.RootDevice) + } + } + + if opts.MemoryLimit != tt.config.MemoryLimit || opts.Kernel != tt.config.Kernel || opts.InitRD != tt.config.InitRD || opts.RunLevel != tt.config.RunLevel || opts.VirtMode != tt.config.VirtMode { + t.Errorf("flattenInstanceConfig() scalar fields mismatch: got %+v, config %+v", opts, tt.config) + } }) } } +func TestFlattenInstanceConfig_AllFields(t *testing.T) { + diskLabelToID := map[string]int{"boot": 101, "swap": 202} + trueVal := true + cfg := InstanceConfig{ + Label: "cfg-all", + Comments: "all fields", + Devices: &InstanceConfigDevices{ + SDA: &InstanceConfigDevice{DiskLabel: "boot"}, + SDB: &InstanceConfigDevice{DiskLabel: "swap"}, + }, + Helpers: &InstanceConfigHelpers{ + UpdateDBDisabled: &trueVal, + Distro: &trueVal, + ModulesDep: &trueVal, + Network: &trueVal, + DevTmpFsAutomount: &trueVal, + }, + Interfaces: []Interface{{Purpose: "public", Primary: true}}, + MemoryLimit: 2048, + Kernel: "linode/grub2", + InitRD: 44, + RootDevice: "/dev/sda", + RunLevel: "default", + VirtMode: "paravirt", + } + + opts, err := flattenInstanceConfig(cfg, diskLabelToID) + if err != nil { + t.Fatalf("flattenInstanceConfig() unexpected error: %v", err) + } + + if opts.Label != cfg.Label || opts.Comments != cfg.Comments { + t.Fatalf("label/comments = %q/%q, want %q/%q", opts.Label, opts.Comments, cfg.Label, cfg.Comments) + } + if opts.Devices.SDA == nil || opts.Devices.SDA.DiskID != 101 { + t.Fatalf("SDA = %v, want DiskID 101", opts.Devices.SDA) + } + if opts.Devices.SDB == nil || opts.Devices.SDB.DiskID != 202 { + t.Fatalf("SDB = %v, want DiskID 202", opts.Devices.SDB) + } + if opts.Helpers == nil || !opts.Helpers.UpdateDBDisabled || !opts.Helpers.Distro || !opts.Helpers.ModulesDep || !opts.Helpers.Network || !opts.Helpers.DevTmpFsAutomount { + t.Fatalf("helpers = %+v, want all true", opts.Helpers) + } + if len(opts.Interfaces) != 1 { + t.Fatalf("interfaces length = %d, want 1", len(opts.Interfaces)) + } + if opts.Interfaces[0].Purpose != linodego.ConfigInterfacePurpose("public") || !opts.Interfaces[0].Primary { + t.Fatalf("interface mapping = %+v, want purpose public primary true", opts.Interfaces[0]) + } + if opts.MemoryLimit != cfg.MemoryLimit || opts.Kernel != cfg.Kernel || opts.InitRD != cfg.InitRD || opts.RunLevel != cfg.RunLevel || opts.VirtMode != cfg.VirtMode { + t.Fatalf("scalar config fields not mapped correctly: %+v", opts) + } + if opts.RootDevice == nil || *opts.RootDevice != cfg.RootDevice { + t.Fatalf("RootDevice = %v, want %q", opts.RootDevice, cfg.RootDevice) + } +} + // TestSelectBootConfig tests the boot configuration selection logic func TestSelectBootConfig(t *testing.T) { tests := []struct { diff --git a/builder/linode/step_create_linode.go b/builder/linode/step_create_linode.go index 96e87700..f479aa59 100644 --- a/builder/linode/step_create_linode.go +++ b/builder/linode/step_create_linode.go @@ -80,7 +80,9 @@ func flattenVPCInterface(vpc *VPCInterface) *linodego.VPCInterfaceCreateOptions ranges := make([]linodego.VPCInterfaceIPv4RangeCreateOptions, len(vpc.IPv4.Ranges)) for i, addr := range vpc.IPv4.Addresses { addresses[i] = linodego.VPCInterfaceIPv4AddressCreateOptions{ - Address: addr.Address, + Address: addr.Address, + Primary: addr.Primary, + NAT1To1Address: addr.NAT1To1Address, } } for i, r := range vpc.IPv4.Ranges { diff --git a/builder/linode/step_create_linode_test.go b/builder/linode/step_create_linode_test.go new file mode 100644 index 00000000..ca953325 --- /dev/null +++ b/builder/linode/step_create_linode_test.go @@ -0,0 +1,252 @@ +package linode + +import ( + "testing" + + "github.com/linode/linodego" +) + +func TestFlattenVPCInterface_IPv4AddressFields(t *testing.T) { + vpc := &VPCInterface{ + SubnetID: 12345, + IPv4: &VPCInterfaceIPv4{ + Addresses: []VPCInterfaceIPv4Address{ + { + Address: linodego.Pointer("auto"), + Primary: linodego.Pointer(true), + NAT1To1Address: linodego.Pointer("192.0.2.10"), + }, + }, + Ranges: []VPCInterfaceIPv4Range{ + {Range: "10.0.0.0/28"}, + }, + }, + } + + got := flattenVPCInterface(vpc) + if got == nil { + t.Fatal("flattenVPCInterface() returned nil") + } + if got.SubnetID != 12345 { + t.Fatalf("subnet_id = %d, want 12345", got.SubnetID) + } + if got.IPv4 == nil { + t.Fatal("flattenVPCInterface().IPv4 returned nil") + } + if got.IPv4.Addresses == nil || len(*got.IPv4.Addresses) != 1 { + t.Fatalf("flattenVPCInterface().IPv4.Addresses = %v, want one address", got.IPv4.Addresses) + } + + addr := (*got.IPv4.Addresses)[0] + if addr.Address == nil || *addr.Address != "auto" { + t.Fatalf("address = %v, want auto", addr.Address) + } + if addr.Primary == nil || *addr.Primary != true { + t.Fatalf("primary = %v, want true", addr.Primary) + } + if addr.NAT1To1Address == nil || *addr.NAT1To1Address != "192.0.2.10" { + t.Fatalf("nat_1_1_address = %v, want 192.0.2.10", addr.NAT1To1Address) + } + if got.IPv4.Ranges == nil || len(*got.IPv4.Ranges) != 1 { + t.Fatalf("ranges = %v, want one range", got.IPv4.Ranges) + } + if (*got.IPv4.Ranges)[0].Range != "10.0.0.0/28" { + t.Fatalf("range = %q, want 10.0.0.0/28", (*got.IPv4.Ranges)[0].Range) + } +} + +func TestFlattenConfigInterface_AllFields(t *testing.T) { + vpcIP := &InterfaceIPv4{VPC: "10.0.0.2", NAT1To1: linodego.Pointer("198.51.100.2")} + iface := Interface{ + VLANInterfaceAttributes: VLANInterfaceAttributes{ + Label: "eth1", + IPAMAddress: "10.0.0.2/24", + }, + VPCInterfaceAttributes: VPCInterfaceAttributes{ + SubnetID: linodego.Pointer(999), + IPv4: vpcIP, + IPRanges: []string{"10.0.0.3/32"}, + }, + Purpose: "vpc", + Primary: true, + } + + got := flattenConfigInterface(iface) + if got.IPAMAddress != iface.IPAMAddress { + t.Fatalf("ipam_address = %q, want %q", got.IPAMAddress, iface.IPAMAddress) + } + if got.Label != iface.Label { + t.Fatalf("label = %q, want %q", got.Label, iface.Label) + } + if got.Purpose != linodego.ConfigInterfacePurpose(iface.Purpose) { + t.Fatalf("purpose = %q, want %q", got.Purpose, iface.Purpose) + } + if !got.Primary { + t.Fatal("primary = false, want true") + } + if got.SubnetID == nil || *got.SubnetID != 999 { + t.Fatalf("subnet_id = %v, want 999", got.SubnetID) + } + if got.IPv4 == nil || got.IPv4.VPC != "10.0.0.2" { + t.Fatalf("ipv4 = %v, want VPC 10.0.0.2", got.IPv4) + } + if got.IPv4.NAT1To1 == nil || *got.IPv4.NAT1To1 != "198.51.100.2" { + t.Fatalf("nat_1_1 = %v, want 198.51.100.2", got.IPv4.NAT1To1) + } + if len(got.IPRanges) != 1 || got.IPRanges[0] != "10.0.0.3/32" { + t.Fatalf("ip_ranges = %v, want [10.0.0.3/32]", got.IPRanges) + } +} + +func TestFlattenPublicInterface_AllFields(t *testing.T) { + public := &PublicInterface{ + IPv4: &PublicInterfaceIPv4{ + Addresses: []PublicInterfaceIPv4Address{{ + Address: linodego.Pointer("auto"), + Primary: linodego.Pointer(true), + }}, + }, + IPv6: &PublicInterfaceIPv6{ + Ranges: []PublicInterfaceIPv6Range{{Range: "/64"}}, + }, + } + + got := flattenPublicInterface(public) + if got == nil || got.IPv4 == nil || got.IPv6 == nil { + t.Fatalf("flattenPublicInterface() = %v, want non-nil ipv4 and ipv6", got) + } + if got.IPv4.Addresses == nil || len(*got.IPv4.Addresses) != 1 { + t.Fatalf("ipv4 addresses = %v, want one address", got.IPv4.Addresses) + } + addr := (*got.IPv4.Addresses)[0] + if addr.Address == nil || *addr.Address != "auto" { + t.Fatalf("ipv4 address = %v, want auto", addr.Address) + } + if addr.Primary == nil || !*addr.Primary { + t.Fatalf("ipv4 primary = %v, want true", addr.Primary) + } + if got.IPv6.Ranges == nil || len(*got.IPv6.Ranges) != 1 || (*got.IPv6.Ranges)[0].Range != "/64" { + t.Fatalf("ipv6 ranges = %v, want [/64]", got.IPv6.Ranges) + } +} + +func TestFlattenLinodeInterface_AllFields(t *testing.T) { + fw := 123 + li := LinodeInterface{ + FirewallID: &fw, + DefaultRoute: &InterfaceDefaultRoute{ + IPv4: linodego.Pointer(true), + IPv6: linodego.Pointer(false), + }, + Public: &PublicInterface{ + IPv4: &PublicInterfaceIPv4{ + Addresses: []PublicInterfaceIPv4Address{{Address: linodego.Pointer("auto")}}, + }, + }, + VPC: &VPCInterface{SubnetID: 99}, + VLAN: &VLANInterface{ + VLANLabel: "vlan-1", + IPAMAddress: linodego.Pointer("10.0.0.1/24"), + }, + } + + got := flattenLinodeInterface(li) + if got.FirewallID == nil || *got.FirewallID == nil || **got.FirewallID != 123 { + t.Fatalf("firewall_id = %v, want 123", got.FirewallID) + } + if got.DefaultRoute == nil || got.DefaultRoute.IPv4 == nil || !*got.DefaultRoute.IPv4 { + t.Fatalf("default route ipv4 = %v, want true", got.DefaultRoute) + } + if got.DefaultRoute.IPv6 == nil || *got.DefaultRoute.IPv6 { + t.Fatalf("default route ipv6 = %v, want false", got.DefaultRoute.IPv6) + } + if got.Public == nil { + t.Fatalf("public = nil, want non-nil") + } + if got.Public.IPv4 == nil || got.Public.IPv4.Addresses == nil || len(*got.Public.IPv4.Addresses) != 1 { + t.Fatalf("public ipv4 addresses = %v, want one address", got.Public) + } + if addr := (*got.Public.IPv4.Addresses)[0]; addr.Address == nil || *addr.Address != "auto" { + t.Fatalf("public ipv4 address = %v, want auto", addr.Address) + } + if got.Public.IPv6 != nil { + t.Fatalf("public ipv6 = %v, want nil", got.Public.IPv6) + } + if got.VPC == nil || got.VPC.SubnetID != 99 { + t.Fatalf("vpc = %v, want subnet_id 99", got.VPC) + } + if got.VPC.IPv4 != nil { + t.Fatalf("vpc ipv4 = %v, want nil", got.VPC.IPv4) + } + if got.VLAN == nil || got.VLAN.VLANLabel != "vlan-1" { + t.Fatalf("vlan = %v, want label vlan-1", got.VLAN) + } + if got.VLAN.IPAMAddress == nil || *got.VLAN.IPAMAddress != "10.0.0.1/24" { + t.Fatalf("vlan ipam_address = %v, want 10.0.0.1/24", got.VLAN.IPAMAddress) + } +} + +func TestFlattenConfigInterfaceIPv4(t *testing.T) { + t.Run("nil input", func(t *testing.T) { + if got := flattenConfigInterfaceIPv4(nil); got != nil { + t.Fatalf("flattenConfigInterfaceIPv4(nil) = %v, want nil", got) + } + }) + + t.Run("maps all fields", func(t *testing.T) { + nat := "198.51.100.9" + got := flattenConfigInterfaceIPv4(&InterfaceIPv4{ + VPC: "10.10.10.2", + NAT1To1: &nat, + }) + if got == nil { + t.Fatal("flattenConfigInterfaceIPv4() returned nil") + } + if got.VPC != "10.10.10.2" { + t.Fatalf("VPC = %q, want 10.10.10.2", got.VPC) + } + if got.NAT1To1 == nil || *got.NAT1To1 != nat { + t.Fatalf("NAT1To1 = %v, want %q", got.NAT1To1, nat) + } + }) +} + +func TestFlattenVLANInterface(t *testing.T) { + t.Run("nil input", func(t *testing.T) { + if got := flattenVLANInterface(nil); got != nil { + t.Fatalf("flattenVLANInterface(nil) = %v, want nil", got) + } + }) + + t.Run("with and without ipam", func(t *testing.T) { + gotNoIPAM := flattenVLANInterface(&VLANInterface{VLANLabel: "vlan-a"}) + if gotNoIPAM == nil || gotNoIPAM.VLANLabel != "vlan-a" { + t.Fatalf("flattenVLANInterface(no ipam) = %v, want label vlan-a", gotNoIPAM) + } + if gotNoIPAM.IPAMAddress != nil { + t.Fatalf("IPAMAddress = %v, want nil", gotNoIPAM.IPAMAddress) + } + + ipam := "10.0.0.2/24" + gotWithIPAM := flattenVLANInterface(&VLANInterface{VLANLabel: "vlan-b", IPAMAddress: &ipam}) + if gotWithIPAM == nil || gotWithIPAM.IPAMAddress == nil || *gotWithIPAM.IPAMAddress != ipam { + t.Fatalf("flattenVLANInterface(with ipam) = %v, want ipam %q", gotWithIPAM, ipam) + } + }) +} + +func TestFlattenMetadata(t *testing.T) { + t.Run("empty userdata returns nil", func(t *testing.T) { + if got := flattenMetadata(Metadata{}); got != nil { + t.Fatalf("flattenMetadata(empty) = %v, want nil", got) + } + }) + + t.Run("userdata is mapped", func(t *testing.T) { + m := Metadata{UserData: "IyEvYmluL2Jhc2gK"} + got := flattenMetadata(m) + if got == nil || got.UserData != m.UserData { + t.Fatalf("flattenMetadata() = %v, want UserData %q", got, m.UserData) + } + }) +} From 97d072f4e7d7b29b41fa292d6e0d84c151211674 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 14:03:33 -0500 Subject: [PATCH 2/3] build(deps): bump github.com/linode/linodego from 1.65.0 to 1.66.0 (#409) Bumps [github.com/linode/linodego](https://github.com/linode/linodego) from 1.65.0 to 1.66.0. - [Release notes](https://github.com/linode/linodego/releases) - [Commits](https://github.com/linode/linodego/compare/v1.65.0...v1.66.0) --- updated-dependencies: - dependency-name: github.com/linode/linodego dependency-version: 1.66.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 835152d9..23e55add 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,13 @@ module github.com/linode/packer-plugin-linode -go 1.25 +go 1.25.0 toolchain go1.25.7 require ( github.com/hashicorp/hcl/v2 v2.24.0 github.com/hashicorp/packer-plugin-sdk v0.6.5 - github.com/linode/linodego v1.65.0 + github.com/linode/linodego v1.66.0 github.com/mitchellh/mapstructure v1.5.0 github.com/zclconf/go-cty v1.16.3 golang.org/x/crypto v0.48.0 @@ -49,7 +49,7 @@ require ( github.com/fatih/color v1.16.0 // indirect github.com/go-jose/go-jose/v4 v4.0.5 // indirect github.com/go-logr/logr v1.4.1 // indirect - github.com/go-resty/resty/v2 v2.17.1 // indirect + github.com/go-resty/resty/v2 v2.17.2 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -113,7 +113,7 @@ require ( go.opencensus.io v0.24.0 // indirect golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect golang.org/x/mod v0.32.0 // indirect - golang.org/x/net v0.49.0 // indirect + golang.org/x/net v0.51.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.41.0 // indirect golang.org/x/term v0.40.0 // indirect diff --git a/go.sum b/go.sum index cddadc11..3f856244 100644 --- a/go.sum +++ b/go.sum @@ -108,8 +108,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-resty/resty/v2 v2.17.1 h1:x3aMpHK1YM9e4va/TMDRlusDDoZiQ+ViDu/WpA6xTM4= -github.com/go-resty/resty/v2 v2.17.1/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= +github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk= +github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -272,8 +272,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/linode/linodego v1.65.0 h1:SdsuGD8VSsPWeShXpE7ihl5vec+fD3MgwhnfYC/rj7k= -github.com/linode/linodego v1.65.0/go.mod h1:tOFiTErdjkbVnV+4S0+NmIE9dqqZUEM2HsJaGu8wMh8= +github.com/linode/linodego v1.66.0 h1:rK8QJFaV53LWOEJvb/evhTg/dP5ElvtuZmx4iv4RJds= +github.com/linode/linodego v1.66.0/go.mod h1:12ykGs9qsvxE+OU3SXuW2w+DTruWF35FPlXC7gGk2tU= github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786 h1:2ZKn+w/BJeL43sCxI2jhPLRv73oVVOjEKZjKkflyqxg= github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc= github.com/masterzen/winrm v0.0.0-20250927112105-5f8e6c707321 h1:AKIJL2PfBX2uie0Mn5pxtG1+zut3hAVMZbRfoXecFzI= @@ -431,8 +431,8 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= -golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= From 39af6983ff81aeba9c9272708bfd3644f9a1414d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 11:35:32 -0400 Subject: [PATCH 3/3] build(deps): bump golang.org/x/oauth2 from 0.35.0 to 0.36.0 (#411) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.35.0 to 0.36.0. - [Commits](https://github.com/golang/oauth2/compare/v0.35.0...v0.36.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-version: 0.36.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 23e55add..3a58c353 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/zclconf/go-cty v1.16.3 golang.org/x/crypto v0.48.0 - golang.org/x/oauth2 v0.35.0 + golang.org/x/oauth2 v0.36.0 ) require ( diff --git a/go.sum b/go.sum index 3f856244..3cc57fcd 100644 --- a/go.sum +++ b/go.sum @@ -434,8 +434,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= -golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=