Onboard iaas network area (#500)

* Onboard network-area resource (#469)

* onboard network-area resource

* fix update network ranges

* fix linter issues

* add organization id to test util

* add examples

* change project count to computed and adapt unit tests

* extend acceptance tests

* add docs

* fix linter issues

* add datasource to provider

* remove routes from the datasource schema

* remove obsolete api cals

* remove raw response from create network area

* change network ranges to list of objects

* update examples

* fix linter issues

* Update stackit/internal/services/iaas/networkarea/resource.go

Co-authored-by: João Palet <joao.palet@outlook.com>

* add network range id to schema

* map network_range_id

* fix unit tests

* adapt acceptance test

* fix acceptance tests

* Update stackit/internal/services/iaas/iaas_acc_test.go

Co-authored-by: João Palet <joao.palet@outlook.com>

---------

Co-authored-by: João Palet <joao.palet@outlook.com>

* Add network area to beta resources list (#481)

* add network area to beta resources list

* add accidentally removed line

* add accidentally removed line

* Fix multi range creation issue (#483)

* fix multi range creation issue

* fix network range update issue

* fix some unit tests

* fix order issue

* Update stackit/internal/services/iaas/networkarea/resource.go

Co-authored-by: João Palet <joao.palet@outlook.com>

* add unit test to cover the reconciled list

---------

Co-authored-by: João Palet <joao.palet@outlook.com>

* Onboard IaaS network area route (#491)

* onboard network area route

* generate docs

* add route to beta resources

* extend acceptance test

* fix import id handling

* Update next_hop description

Co-authored-by: João Palet <joao.palet@outlook.com>

* Update prefix description

Co-authored-by: João Palet <joao.palet@outlook.com>

* change descriptions in datasource

* add IP and CIDR validators

* use requiresReplace in resource

* improve error logs

* change the create response handling

* update docs

* change route and route id detection

---------

Co-authored-by: João Palet <joao.palet@outlook.com>

---------

Co-authored-by: João Palet <joao.palet@outlook.com>
This commit is contained in:
GokceGK 2024-08-09 12:38:35 +02:00 committed by GitHub
parent 2a923dc4b6
commit b58bd0f640
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 3077 additions and 8 deletions

View file

@ -25,10 +25,22 @@ var networkResource = map[string]string{
"nameserver1": "5.6.7.8",
}
func resourceConfig(name, nameservers string) string {
return fmt.Sprintf(`
%s
var networkAreaResource = map[string]string{
"organization_id": testutil.OrganizationId,
"name": fmt.Sprintf("acc-test-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum)),
"networkrange0": "10.0.0.0/16",
"transfer_network": "10.1.2.0/24",
}
var networkAreaRouteResource = map[string]string{
"organization_id": networkAreaResource["organization_id"],
"network_area_id": networkAreaResource["network_area_id"],
"prefix": "1.1.1.0/24",
"next_hop": "1.1.1.1",
}
func networkResourceConfig(name, nameservers string) string {
return fmt.Sprintf(`
resource "stackit_network" "network" {
project_id = "%s"
name = "%s"
@ -36,7 +48,6 @@ func resourceConfig(name, nameservers string) string {
nameservers = %s
}
`,
testutil.IaaSProviderConfig(),
networkResource["project_id"],
name,
networkResource["ipv4_prefix_length"],
@ -44,6 +55,47 @@ func resourceConfig(name, nameservers string) string {
)
}
func networkAreaResourceConfig(areaname, networkranges string) string {
return fmt.Sprintf(`
resource "stackit_network_area" "network_area" {
organization_id = "%s"
name = "%s"
network_ranges = [{
prefix = "%s"
}]
transfer_network = "%s"
}
`,
networkAreaResource["organization_id"],
areaname,
networkranges,
networkAreaResource["transfer_network"],
)
}
func networkAreaRouteResourceConfig() string {
return fmt.Sprintf(`
resource "stackit_network_area_route" "network_area_route" {
organization_id = stackit_network_area.network_area.organization_id
network_area_id = stackit_network_area.network_area.network_area_id
prefix = "%s"
next_hop = "%s"
}
`,
networkAreaRouteResource["prefix"],
networkAreaRouteResource["next_hop"],
)
}
func resourceConfig(name, nameservers, areaname, networkranges string) string {
return fmt.Sprintf("%s\n\n%s\n\n%s\n\n%s",
testutil.IaaSProviderConfig(),
networkResourceConfig(name, nameservers),
networkAreaResourceConfig(areaname, networkranges),
networkAreaRouteResourceConfig(),
)
}
func TestAccIaaS(t *testing.T) {
resource.Test(t, resource.TestCase{
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
@ -58,6 +110,8 @@ func TestAccIaaS(t *testing.T) {
"[%q]",
networkResource["nameserver0"],
),
networkAreaResource["name"],
networkAreaResource["networkrange0"],
),
Check: resource.ComposeAggregateTestCheckFunc(
// Instance
@ -66,23 +120,58 @@ func TestAccIaaS(t *testing.T) {
resource.TestCheckResourceAttr("stackit_network.network", "name", networkResource["name"]),
resource.TestCheckResourceAttr("stackit_network.network", "nameservers.#", "1"),
resource.TestCheckResourceAttr("stackit_network.network", "nameservers.0", networkResource["nameserver0"]),
// Network Area
resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", networkAreaResource["organization_id"]),
resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_area_id"),
resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", networkAreaResource["name"]),
resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.#", "1"),
resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", networkAreaResource["networkrange0"]),
resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_ranges.0.network_range_id"),
// Network Area Route
resource.TestCheckResourceAttrPair(
"stackit_network_area_route.network_area_route", "organization_id",
"stackit_network_area.network_area", "organization_id",
),
resource.TestCheckResourceAttrPair(
"stackit_network_area_route.network_area_route", "network_area_id",
"stackit_network_area.network_area", "network_area_id",
),
resource.TestCheckResourceAttrSet("stackit_network_area_route.network_area_route", "network_area_route_id"),
resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", networkAreaRouteResource["prefix"]),
resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", networkAreaRouteResource["next_hop"]),
),
},
// Data source
{
Config: fmt.Sprintf(`
%s
data "stackit_network" "network" {
project_id = stackit_network.network.project_id
network_id = stackit_network.network.network_id
}`,
}
data "stackit_network_area" "network_area" {
organization_id = stackit_network_area.network_area.organization_id
network_area_id = stackit_network_area.network_area.network_area_id
}
data "stackit_network_area_route" "network_area_route" {
organization_id = stackit_network_area.network_area.organization_id
network_area_id = stackit_network_area.network_area.network_area_id
network_area_route_id = stackit_network_area_route.network_area_route.network_area_route_id
}
`,
resourceConfig(
networkResource["name"],
fmt.Sprintf(
"[%q]",
networkResource["nameserver0"],
),
networkAreaResource["name"],
networkAreaResource["networkrange0"],
),
),
Check: resource.ComposeAggregateTestCheckFunc(
@ -94,6 +183,29 @@ func TestAccIaaS(t *testing.T) {
),
resource.TestCheckResourceAttr("data.stackit_network.network", "name", networkResource["name"]),
resource.TestCheckResourceAttr("data.stackit_network.network", "nameservers.0", networkResource["nameserver0"]),
// Network area
resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "organization_id", networkAreaResource["organization_id"]),
resource.TestCheckResourceAttrPair(
"stackit_network_area.network_area", "network_area_id",
"data.stackit_network_area.network_area", "network_area_id",
),
resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "name", networkAreaResource["name"]),
resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.#", "1"),
resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.0.prefix", networkAreaResource["networkrange0"]),
// Network area route
resource.TestCheckResourceAttrPair(
"stackit_network_area_route.network_area_route", "organization_id",
"stackit_network_area.network_area", "organization_id",
),
resource.TestCheckResourceAttrPair(
"stackit_network_area_route.network_area_route", "network_area_id",
"stackit_network_area.network_area", "network_area_id",
),
resource.TestCheckResourceAttrSet("stackit_network_area_route.network_area_route", "network_area_route_id"),
resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", networkAreaRouteResource["prefix"]),
resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", networkAreaRouteResource["next_hop"]),
),
},
// Import
@ -114,6 +226,42 @@ func TestAccIaaS(t *testing.T) {
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"ipv4_prefix_length"}, // Field is not returned by the API
},
{
ResourceName: "stackit_network_area.network_area",
ImportStateIdFunc: func(s *terraform.State) (string, error) {
r, ok := s.RootModule().Resources["stackit_network_area.network_area"]
if !ok {
return "", fmt.Errorf("couldn't find resource stackit_network_area.network_area")
}
networkAreaId, ok := r.Primary.Attributes["network_area_id"]
if !ok {
return "", fmt.Errorf("couldn't find attribute network_area_id")
}
return fmt.Sprintf("%s,%s", testutil.OrganizationId, networkAreaId), nil
},
ImportState: true,
ImportStateVerify: true,
},
{
ResourceName: "stackit_network_area_route.network_area_route",
ImportStateIdFunc: func(s *terraform.State) (string, error) {
r, ok := s.RootModule().Resources["stackit_network_area_route.network_area_route"]
if !ok {
return "", fmt.Errorf("couldn't find resource stackit_network_area_route.network_area_route")
}
networkAreaId, ok := r.Primary.Attributes["network_area_id"]
if !ok {
return "", fmt.Errorf("couldn't find attribute network_area_id")
}
networkAreaRouteId, ok := r.Primary.Attributes["network_area_route_id"]
if !ok {
return "", fmt.Errorf("couldn't find attribute network_area_route_id")
}
return fmt.Sprintf("%s,%s,%s", testutil.OrganizationId, networkAreaId, networkAreaRouteId), nil
},
ImportState: true,
ImportStateVerify: true,
},
// Update
{
Config: resourceConfig(
@ -123,6 +271,8 @@ func TestAccIaaS(t *testing.T) {
networkResource["nameserver0"],
networkResource["nameserver1"],
),
fmt.Sprintf("%s-updated", networkAreaResource["name"]),
networkAreaResource["networkrange0"],
),
Check: resource.ComposeAggregateTestCheckFunc(
// Instance
@ -132,6 +282,13 @@ func TestAccIaaS(t *testing.T) {
resource.TestCheckResourceAttr("stackit_network.network", "nameservers.#", "2"),
resource.TestCheckResourceAttr("stackit_network.network", "nameservers.0", networkResource["nameserver0"]),
resource.TestCheckResourceAttr("stackit_network.network", "nameservers.1", networkResource["nameserver1"]),
// Network area
resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", networkAreaResource["organization_id"]),
resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_area_id"),
resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", fmt.Sprintf("%s-updated", networkAreaResource["name"])),
resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.#", "1"),
resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", networkAreaResource["networkrange0"]),
),
},
// Deletion is done by the framework implicitly
@ -183,5 +340,33 @@ func testAccCheckIaaSDestroy(s *terraform.State) error {
}
}
}
// network areas
networkAreasToDestroy := []string{}
for _, rs := range s.RootModule().Resources {
if rs.Type != "stackit_network_area" {
continue
}
networkAreaId := strings.Split(rs.Primary.ID, core.Separator)[1]
networkAreasToDestroy = append(networkAreasToDestroy, networkAreaId)
}
networkAreasResp, err := client.ListNetworkAreasExecute(ctx, testutil.OrganizationId)
if err != nil {
return fmt.Errorf("getting networkAreasResp: %w", err)
}
networkAreas := *networkAreasResp.Items
for i := range networkAreas {
if networkAreas[i].AreaId == nil {
continue
}
if utils.Contains(networkAreasToDestroy, *networkAreas[i].AreaId) {
err := client.DeleteNetworkAreaExecute(ctx, testutil.OrganizationId, *networkAreas[i].AreaId)
if err != nil {
return fmt.Errorf("destroying network area %s during CheckDestroy: %w", *networkAreas[i].AreaId, err)
}
}
}
return nil
}