Skip to content

Commit

Permalink
rework ipv4_pool tests to exercise large pool creation race condition
Browse files Browse the repository at this point in the history
  • Loading branch information
chrismarget-j committed May 1, 2024
1 parent 24bf1cb commit 75c5c0c
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 79 deletions.
114 changes: 38 additions & 76 deletions apstra/resource_ipv4_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,24 +68,49 @@ func (o ipv4PoolConfig) render(rType, rName string) string {
}

func (o ipv4PoolConfig) testChecks(t testing.TB, rType, rName string) testChecks {
t.Helper()
result := newTestChecks(rType + "." + rName)

var totalIPs int
prefixes := make([]net.IPNet, len(o.subnets))
for i, s := range o.subnets {
ip, prefix, err := net.ParseCIDR(s)
require.NoError(t, err)
require.EqualValuesf(t, ip.String(), prefix.IP.String(), "%s is not a base address", s)

prefixes[i] = *prefix

ones, bits := prefix.Mask.Size()
totalIPs += int(math.Pow(2, float64(bits-ones)))
}

// required and computed attributes can always be checked
result.append(t, "TestCheckResourceAttrSet", "id")
result.append(t, "TestCheckResourceAttr", "name", o.name)
result.append(t, "TestCheckResourceAttr", "status", "not_in_use")
result.append(t, "TestCheckResourceAttr", "total", strconv.Itoa(totalIPs))
result.append(t, "TestCheckResourceAttr", "used", "0")
result.append(t, "TestCheckResourceAttr", "used_percentage", "0")
result.append(t, "TestCheckResourceAttr", "subnets.#", strconv.Itoa(len(o.subnets)))

for i, s := range o.subnets {
// todo: add tests for each subnet
_, _ = i, s
for _, p := range prefixes {
ones, bits := p.Mask.Size()
v := map[string]string{
"network": p.String(),
"status": "pool_element_available",
"total": strconv.Itoa(int(math.Pow(2, float64(bits-ones)))),
"used": "0",
"used_percentage": "0",
}
result.appendSetNestedCheck(t, "subnets.*", v)
}

return result
}

func TestAccResourceIpv4Pool(t *testing.T) {
ctx := context.Background()
testutils.TestCfgFileToEnv()
require.NoError(t, testutils.TestCfgFileToEnv())

type testCase struct {
stepConfigs []ipv4PoolConfig
Expand All @@ -104,14 +129,15 @@ func TestAccResourceIpv4Pool(t *testing.T) {
},
},
},
"lots": {
stepConfigs: []ipv4PoolConfig{
{
name: acctest.RandString(6),
subnets: ipv4Subnets(t, "10.0.0.0/8", 28, 50),
},
},
},
// AOS-46273
//"lots": {
// stepConfigs: []ipv4PoolConfig{
// {
// name: acctest.RandString(6),
// subnets: ipv4Subnets(t, "10.0.0.0/8", 28, 50),
// },
// },
//},
}

resourceType := tfapstra.ResourceName(ctx, &tfapstra.ResourceIpv4Pool)
Expand Down Expand Up @@ -144,68 +170,4 @@ func TestAccResourceIpv4Pool(t *testing.T) {
})
})
}

//var (
// testAccResourceIpv4PoolCfg1Name = acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)
// testAccResourceIpv4PoolCfg1Subnets = strings.Join([]string{
// fmt.Sprintf(resourceIpv4PoolSubnetTemplateHCL, "192.168.0.0/16"),
// }, ",")
// testAccResourceIpv4PoolCfg1 = fmt.Sprintf(resourceIpv4PoolTemplateHCL, testAccResourceIpv4PoolCfg1Name, testAccResourceIpv4PoolCfg1Subnets)
//
// testAccResourceIpv4PoolCfg2Name = acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)
// testAccResourceIpv4PoolCfg2Subnets = strings.Join([]string{
// fmt.Sprintf(resourceIpv4PoolSubnetTemplateHCL, "192.168.1.0/24"),
// fmt.Sprintf(resourceIpv4PoolSubnetTemplateHCL, "192.168.0.0/24"),
// fmt.Sprintf(resourceIpv4PoolSubnetTemplateHCL, "192.168.2.0/23"),
// }, ",")
// testAccResourceIpv4PoolCfg2 = fmt.Sprintf(resourceIpv4PoolTemplateHCL, testAccResourceIpv4PoolCfg2Name, testAccResourceIpv4PoolCfg2Subnets)
//)
//
//resource.Test(t, resource.TestCase{
// ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
// Steps: []resource.TestStep{
// // Create and Read testing
// {
// Config: insecureProviderConfigHCL + testAccResourceIpv4PoolCfg1,
// Check: resource.ComposeAggregateTestCheckFunc(
// // Verify ID has any value set
// resource.TestCheckResourceAttrSet("apstra_ipv4_pool.test", "id"),
// // Verify name and overall usage statistics
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "name", testAccResourceIpv4PoolCfg1Name),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "status", "not_in_use"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "total", "65536"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "used", "0"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "used_percentage", "0"),
// // Verify number of subnets
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.#", "1"),
// // Verify first subnet
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.0.network", "192.168.0.0/16"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.0.status", "pool_element_available"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.0.total", "65536"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.0.used", "0"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.0.used_percentage", "0"),
// ),
// },
// // Update and Read testing
// {
// Config: insecureProviderConfigHCL + testAccResourceIpv4PoolCfg2,
// Check: resource.ComposeAggregateTestCheckFunc(
// // Verify ID has any value set
// resource.TestCheckResourceAttrSet("apstra_ipv4_pool.test", "id"),
// // Verify name and overall usage statistics
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "name", testAccResourceIpv4PoolCfg2Name),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "status", "not_in_use"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "total", "1024"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "used", "0"),
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "used_percentage", "0"),
// // Verify number of subnets
// resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.#", "3"),
// //// cannot verify subnets here because they're not sorted
// //resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.0.network", "192.168.0.0/24"),
// //resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.1.network", "192.168.1.0/24"),
// //resource.TestCheckResourceAttr("apstra_ipv4_pool.test", "subnets.2.network", "192.168.2.0/23"),
// ),
// },
// },
//})
}
5 changes: 5 additions & 0 deletions apstra/test_helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,11 @@ func (o *testChecks) append(t testing.TB, testCheckFuncName string, testCheckFun
}
}

func (o *testChecks) appendSetNestedCheck(t testing.TB, attrName string, m map[string]string) {
o.checks = append(o.checks, resource.TestCheckTypeSetElemNestedAttrs(o.path, attrName, m))
o.logLines.appendf("TestCheckTypeSetElemNestedAttrs(%s, %s)", attrName, m)
}

func (o *testChecks) extractFromState(t testing.TB, id string, targetMap map[string]string) {
o.checks = append(o.checks, extractValueFromTerraformState(t, o.path, id, targetMap))
o.logLines.appendf("extractValueFromTerraformState(%s, %q)", o.path, id)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ toolchain go1.21.1

require (
github.com/IBM/netaddr v1.5.0
github.com/Juniper/apstra-go-sdk v0.0.0-20240422203629-497c16d7c591
github.com/Juniper/apstra-go-sdk v0.0.0-20240430192907-3b8e9f7648cf
github.com/apparentlymart/go-cidr v1.1.0
github.com/chrismarget-j/go-licenses v0.0.0-20240224210557-f22f3e06d3d4
github.com/google/go-cmp v0.6.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,8 @@ github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
github.com/IBM/netaddr v1.5.0 h1:IJlFZe1+nFs09TeMB/HOP4+xBnX2iM/xgiDOgZgTJq0=
github.com/IBM/netaddr v1.5.0/go.mod h1:DDBPeYgbFzoXHjSz9Jwk7K8wmWV4+a/Kv0LqRnb8we4=
github.com/Juniper/apstra-go-sdk v0.0.0-20240422203629-497c16d7c591 h1:lsYejC4zGdzv+c4dWihuVCNKVtHrFU3DshAmjGWAuPk=
github.com/Juniper/apstra-go-sdk v0.0.0-20240422203629-497c16d7c591/go.mod h1:Xwj3X8v/jRZWv28o6vQAqD4lz2JmzaSYLZ2ch1SS89w=
github.com/Juniper/apstra-go-sdk v0.0.0-20240430192907-3b8e9f7648cf h1:4PVRSN7ChmQDy1oTjpGcVXqL3hohO+1N9NBCuMxDN5M=
github.com/Juniper/apstra-go-sdk v0.0.0-20240430192907-3b8e9f7648cf/go.mod h1:Xwj3X8v/jRZWv28o6vQAqD4lz2JmzaSYLZ2ch1SS89w=
github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0=
github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
Expand Down

0 comments on commit 75c5c0c

Please sign in to comment.