Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions assets/terraform/internal/manager/entry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,63 @@ var _ = Describe("Entry", func() {
Expect(client.list()).To(MatchEntries(planEntries))
})
})

Context("when renaming an existing entry", func() {
It("should rename the entry on the server", func() {
stateEntries := []*MockEntryObject{{Name: "1", Value: "A"}, {Name: "2", Value: "B"}, {Name: "3", Value: "C"}}
planEntries := []*MockEntryObject{{Name: "1", Value: "A"}, {Name: "two", Value: "B"}, {Name: "3", Value: "C"}}

processed, err := sdk.UpdateMany(ctx, location, []string{}, stateEntries, planEntries)

Expect(err).ToNot(HaveOccurred())
Expect(processed).To(MatchEntries(planEntries))
Expect(client.list()).To(MatchEntries(planEntries))

Expect(client.MultiConfigOpers).To(HaveLen(1))
Expect(client.MultiConfigOpers[0]).To(ContainElement(
MultiConfigOper{Operation: MultiConfigOperRename, EntryName: "2", NewName: "two"},
))
})
})

Context("with combined rename, delete, and add operations", func() {
BeforeEach(func() {
existing = []*MockEntryObject{
{Name: "1", Value: "A"},
{Name: "2", Value: "B"},
{Name: "3", Value: "C"},
{Name: "4", Value: "D"},
}
})

It("should correctly apply all changes", func() {
stateEntries := []*MockEntryObject{
{Name: "1", Value: "A"},
{Name: "2", Value: "B"},
{Name: "3", Value: "C"},
{Name: "4", Value: "D"},
}
planEntries := []*MockEntryObject{
{Name: "one", Value: "A"}, // renamed from "1"
{Name: "2", Value: "B"}, // unchanged
{Name: "three", Value: "C"}, // renamed from "3"
{Name: "5", Value: "E"}, // added (and "4" deleted)
}

processed, err := sdk.UpdateMany(ctx, location, []string{}, stateEntries, planEntries)

Expect(err).ToNot(HaveOccurred())
Expect(processed).To(HaveLen(4))
Expect(processed).To(MatchEntries(planEntries))

Expect(client.MultiConfigOpers[0]).To(ContainElements([]MultiConfigOper{
{Operation: MultiConfigOperRename, EntryName: "1", NewName: "one"},
{Operation: MultiConfigOperRename, EntryName: "3", NewName: "three"},
{Operation: MultiConfigOperDelete, EntryName: "4"},
{Operation: MultiConfigOperEdit, EntryName: "5"},
}))
})
})
})

Context("Delete()", func() {
Expand Down
183 changes: 180 additions & 3 deletions assets/terraform/test/resource_addresses_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func (o *expectServerAddressObjects) CheckState(ctx context.Context, req statech
}
}

func TestAccAddresses(t *testing.T) {
func TestAccAddresses_Basic(t *testing.T) {
t.Parallel()

nameSuffix := acctest.RandStringFromCharSet(6, acctest.CharSetAlphaNum)
Expand Down Expand Up @@ -115,6 +115,9 @@ func TestAccAddresses(t *testing.T) {
fmt.Sprintf("%s-fqdn", prefix): config.ObjectVariable(map[string]config.Variable{
"fqdn": config.StringVariable("example.com"),
}),
fmt.Sprintf("%s-ip-netmask-2", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.1/32"),
}),
}),
},
ConfigStateChecks: []statecheck.StateCheck{
Expand Down Expand Up @@ -161,9 +164,18 @@ func TestAccAddresses(t *testing.T) {
"ip_wildcard": knownvalue.Null(),
"fqdn": knownvalue.StringExact("example.com"),
}),
fmt.Sprintf("%s-ip-netmask-2", prefix): knownvalue.ObjectExact(map[string]knownvalue.Check{
"tags": knownvalue.Null(),
"description": knownvalue.Null(),
"disable_override": knownvalue.Null(),
"ip_netmask": knownvalue.StringExact("10.0.0.1/32"),
"ip_range": knownvalue.Null(),
"ip_wildcard": knownvalue.Null(),
"fqdn": knownvalue.Null(),
}),
}),
),
ExpectServerAddressObjects(*location, prefix, []string{"ip-netmask", "ip-range", "ip-wildcard", "fqdn"}),
ExpectServerAddressObjects(*location, prefix, []string{"ip-netmask", "ip-range", "ip-wildcard", "fqdn", "ip-netmask-2"}),
},
},
{
Expand All @@ -178,6 +190,9 @@ func TestAccAddresses(t *testing.T) {
fmt.Sprintf("%s-fqdn2", prefix): config.ObjectVariable(map[string]config.Variable{
"fqdn": config.StringVariable("example.com"),
}),
fmt.Sprintf("%s-ip-netmask-2", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.2/32"),
}),
}),
},
ConfigStateChecks: []statecheck.StateCheck{
Expand All @@ -204,9 +219,18 @@ func TestAccAddresses(t *testing.T) {
"ip_wildcard": knownvalue.Null(),
"fqdn": knownvalue.StringExact("example.com"),
}),
fmt.Sprintf("%s-ip-netmask-2", prefix): knownvalue.ObjectExact(map[string]knownvalue.Check{
"tags": knownvalue.Null(),
"description": knownvalue.Null(),
"disable_override": knownvalue.Null(),
"ip_netmask": knownvalue.StringExact("10.0.0.2/32"),
"ip_range": knownvalue.Null(),
"ip_wildcard": knownvalue.Null(),
"fqdn": knownvalue.Null(),
}),
}),
),
ExpectServerAddressObjects(*location, prefix, []string{"ip-range", "fqdn2"}),
ExpectServerAddressObjects(*location, prefix, []string{"ip-range", "fqdn2", "ip-netmask-2"}),
},
},
{
Expand Down Expand Up @@ -423,3 +447,156 @@ func TestAccAddresses_MultipleResources(t *testing.T) {
},
})
}

const testAccAddresses_Rename_Tmpl = `
variable prefix { type = string }
variable "addresses" {
type = map(object({
ip_netmask = string
}))
}

resource "panos_device_group" "example" {
location = { panorama = {} }
name = var.prefix
}

resource "panos_addresses" "addresses" {
location = { device_group = { name = panos_device_group.example.name } }

addresses = { for name, value in var.addresses : name => {
ip_netmask = value.ip_netmask
}}
}
`

func TestAccAddresses_Rename(t *testing.T) {
t.Parallel()

nameSuffix := acctest.RandStringFromCharSet(6, acctest.CharSetAlphaNum)
prefix := fmt.Sprintf("test-acc-%s", nameSuffix)

location := address.NewDeviceGroupLocation()
location.DeviceGroup.DeviceGroup = prefix

addressCheck := func(name string, ipNetmask string) knownvalue.Check {
return knownvalue.ObjectExact(map[string]knownvalue.Check{
"tags": knownvalue.Null(),
"description": knownvalue.Null(),
"disable_override": knownvalue.Null(),
"ip_netmask": knownvalue.StringExact(ipNetmask),
"ip_range": knownvalue.Null(),
"ip_wildcard": knownvalue.Null(),
"fqdn": knownvalue.Null(),
})
}

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProtoV6ProviderFactories: testAccProviders,
Steps: []resource.TestStep{
// Step 1: Create 4 addresses
{
Config: testAccAddresses_Rename_Tmpl,
ConfigVariables: map[string]config.Variable{
"prefix": config.StringVariable(prefix),
"addresses": config.MapVariable(map[string]config.Variable{
fmt.Sprintf("%s-addr-1", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.1/32"),
}),
fmt.Sprintf("%s-addr-2", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.2/32"),
}),
fmt.Sprintf("%s-addr-3", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.3/32"),
}),
fmt.Sprintf("%s-addr-4", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.4/32"),
}),
}),
},
ConfigStateChecks: []statecheck.StateCheck{
statecheck.ExpectKnownValue(
"panos_addresses.addresses",
tfjsonpath.New("addresses"),
knownvalue.ObjectExact(map[string]knownvalue.Check{
fmt.Sprintf("%s-addr-1", prefix): addressCheck("addr-1", "10.0.0.1/32"),
fmt.Sprintf("%s-addr-2", prefix): addressCheck("addr-2", "10.0.0.2/32"),
fmt.Sprintf("%s-addr-3", prefix): addressCheck("addr-3", "10.0.0.3/32"),
fmt.Sprintf("%s-addr-4", prefix): addressCheck("addr-4", "10.0.0.4/32"),
}),
),
ExpectServerAddressObjects(*location, prefix, []string{"addr-1", "addr-2", "addr-3", "addr-4"}),
},
},
// Step 2: Rename addr-1 -> addr-1-renamed, addr-3 -> addr-3-renamed
{
Config: testAccAddresses_Rename_Tmpl,
ConfigVariables: map[string]config.Variable{
"prefix": config.StringVariable(prefix),
"addresses": config.MapVariable(map[string]config.Variable{
fmt.Sprintf("%s-addr-1-renamed", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.1/32"),
}),
fmt.Sprintf("%s-addr-2", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.2/32"),
}),
fmt.Sprintf("%s-addr-3-renamed", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.3/32"),
}),
fmt.Sprintf("%s-addr-4", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.4/32"),
}),
}),
},
ConfigStateChecks: []statecheck.StateCheck{
statecheck.ExpectKnownValue(
"panos_addresses.addresses",
tfjsonpath.New("addresses"),
knownvalue.ObjectExact(map[string]knownvalue.Check{
fmt.Sprintf("%s-addr-1-renamed", prefix): addressCheck("addr-1-renamed", "10.0.0.1/32"),
fmt.Sprintf("%s-addr-2", prefix): addressCheck("addr-2", "10.0.0.2/32"),
fmt.Sprintf("%s-addr-3-renamed", prefix): addressCheck("addr-3-renamed", "10.0.0.3/32"),
fmt.Sprintf("%s-addr-4", prefix): addressCheck("addr-4", "10.0.0.4/32"),
}),
),
ExpectServerAddressObjects(*location, prefix, []string{"addr-1-renamed", "addr-2", "addr-3-renamed", "addr-4"}),
},
},
// Step 3: Swap — addr-1-renamed gets addr-3-renamed's value and vice versa.
{
Config: testAccAddresses_Rename_Tmpl,
ConfigVariables: map[string]config.Variable{
"prefix": config.StringVariable(prefix),
"addresses": config.MapVariable(map[string]config.Variable{
fmt.Sprintf("%s-addr-1-renamed", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.3/32"),
}),
fmt.Sprintf("%s-addr-2", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.2/32"),
}),
fmt.Sprintf("%s-addr-3-renamed", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.1/32"),
}),
fmt.Sprintf("%s-addr-4", prefix): config.ObjectVariable(map[string]config.Variable{
"ip_netmask": config.StringVariable("10.0.0.4/32"),
}),
}),
},
ConfigStateChecks: []statecheck.StateCheck{
statecheck.ExpectKnownValue(
"panos_addresses.addresses",
tfjsonpath.New("addresses"),
knownvalue.ObjectExact(map[string]knownvalue.Check{
fmt.Sprintf("%s-addr-1-renamed", prefix): addressCheck("addr-1-renamed", "10.0.0.3/32"),
fmt.Sprintf("%s-addr-2", prefix): addressCheck("addr-2", "10.0.0.2/32"),
fmt.Sprintf("%s-addr-3-renamed", prefix): addressCheck("addr-3-renamed", "10.0.0.1/32"),
fmt.Sprintf("%s-addr-4", prefix): addressCheck("addr-4", "10.0.0.4/32"),
}),
),
ExpectServerAddressObjects(*location, prefix, []string{"addr-1-renamed", "addr-2", "addr-3-renamed", "addr-4"}),
},
},
},
})
}
2 changes: 1 addition & 1 deletion assets/terraform/test/resource_dynamic_user_group_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ resource "panos_administrative_tag" "tag2" {
}

resource "panos_dynamic_user_group" "example" {
depends_on = [panos_administrative_tag.tag1, panos_administrative_tag.tag2]
depends_on = [panos_administrative_tag.tag1, panos_administrative_tag.tag2, panos_device_group.example]
location = var.location

name = var.prefix
Expand Down
Loading
Loading