@@ -2,7 +2,9 @@ package iaas_test
22
33import (
44 "context"
5+ "errors"
56 "fmt"
7+ "net/http"
68 "os"
79 "path/filepath"
810 "strings"
@@ -12,8 +14,10 @@ import (
1214 "github.com/hashicorp/terraform-plugin-testing/helper/resource"
1315 "github.com/hashicorp/terraform-plugin-testing/terraform"
1416 "github.com/stackitcloud/stackit-sdk-go/core/config"
17+ "github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1518 "github.com/stackitcloud/stackit-sdk-go/core/utils"
1619 "github.com/stackitcloud/stackit-sdk-go/services/iaas"
20+ "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait"
1721 "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
1822 "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/testutil"
1923)
@@ -31,9 +35,10 @@ var networkResource = map[string]string{
3135 "ipv4_prefix_length" : "24" ,
3236 "nameserver0" : "1.2.3.4" ,
3337 "nameserver1" : "5.6.7.8" ,
34- "ipv4_gateway" : "10.1 .2.1" ,
35- "ipv4_prefix" : "10.1 .2.1 /24" ,
38+ "ipv4_gateway" : "10.2 .2.1" ,
39+ "ipv4_prefix" : "10.2 .2.0 /24" ,
3640 "routed" : "false" ,
41+ "name_updated" : fmt .Sprintf ("acc-test-%s" , acctest .RandStringFromCharSet (5 , acctest .CharSetAlphaNum )),
3742}
3843
3944var networkAreaResource = map [string ]string {
@@ -444,6 +449,117 @@ func testAccImageConfig(name string) string {
444449 )
445450}
446451
452+ func TestAccNetwork (t * testing.T ) {
453+ resource .Test (t , resource.TestCase {
454+ ProtoV6ProviderFactories : testutil .TestAccProtoV6ProviderFactories ,
455+ CheckDestroy : testAccCheckNetworkDestroy ,
456+ Steps : []resource.TestStep {
457+
458+ // Creation
459+ {
460+ Config : networkResourceConfig (
461+ networkResource ["name" ],
462+ fmt .Sprintf ("[%q, %q]" ,
463+ networkResource ["nameserver0" ],
464+ networkResource ["nameserver1" ]),
465+ ),
466+ Check : resource .ComposeAggregateTestCheckFunc (
467+ resource .TestCheckResourceAttrSet ("stackit_network.network" , "network_id" ),
468+ resource .TestCheckResourceAttr ("stackit_network.network" , "name" , networkResource ["name" ]),
469+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_nameservers.#" , "2" ),
470+ // nameservers may be returned in a randomized order, so we have to check them with a helper function
471+ resource .TestCheckTypeSetElemAttr ("stackit_network.network" , "nameservers.*" , networkResource ["nameserver0" ]),
472+ resource .TestCheckTypeSetElemAttr ("stackit_network.network" , "nameservers.*" , networkResource ["nameserver1" ]),
473+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_gateway" , networkResource ["ipv4_gateway" ]),
474+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_prefix" , networkResource ["ipv4_prefix" ]),
475+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_prefix_length" , networkResource ["ipv4_prefix_length" ]),
476+ ),
477+ },
478+ // Data source
479+ {
480+ Config : fmt .Sprintf (`
481+ %s
482+
483+ data "stackit_network" "network" {
484+ project_id = "%s"
485+ network_id = stackit_network.network.network_id
486+ }
487+ ` , networkResourceConfig (
488+ networkResource ["name" ],
489+ fmt .Sprintf ("[%q, %q]" ,
490+ networkResource ["nameserver0" ],
491+ networkResource ["nameserver1" ]),
492+ ),
493+ testutil .ProjectId ,
494+ ),
495+ Check : resource .ComposeAggregateTestCheckFunc (
496+ resource .TestCheckResourceAttrSet ("data.stackit_network.network" , "network_id" ),
497+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "name" , networkResource ["name" ]),
498+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_gateway" , networkResource ["ipv4_gateway" ]),
499+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_nameservers.#" , "2" ),
500+ // nameservers may be returned in a randomized order, so we have to check them with a helper function
501+ resource .TestCheckTypeSetElemAttr ("stackit_network.network" , "nameservers.*" , networkResource ["nameserver0" ]),
502+ resource .TestCheckTypeSetElemAttr ("stackit_network.network" , "nameservers.*" , networkResource ["nameserver1" ]),
503+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefix" , networkResource ["ipv4_prefix" ]),
504+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefix_length" , networkResource ["ipv4_prefix_length" ]),
505+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefixes.#" , "1" ),
506+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefixes.0" , networkResource ["ipv4_prefix" ]),
507+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "routed" , networkResource ["routed" ]),
508+ ),
509+ },
510+
511+ // Import
512+ {
513+ ResourceName : "stackit_network.network" ,
514+ ImportStateIdFunc : func (s * terraform.State ) (string , error ) {
515+ r , ok := s .RootModule ().Resources ["stackit_network.network" ]
516+ if ! ok {
517+ return "" , fmt .Errorf ("couldn't find resource stackit_network.network" )
518+ }
519+ networkId , ok := r .Primary .Attributes ["network_id" ]
520+ if ! ok {
521+ return "" , fmt .Errorf ("couldn't find attribute network_id" )
522+ }
523+ return fmt .Sprintf ("%s,%s" , testutil .ProjectId , networkId ), nil
524+ },
525+ ImportState : true ,
526+ Check : resource .ComposeAggregateTestCheckFunc (
527+ resource .TestCheckResourceAttrSet ("data.stackit_network.network" , "network_id" ),
528+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "name" , networkResource ["name" ]),
529+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_gateway" , networkResource ["ipv4_gateway" ]),
530+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_nameservers.#" , "2" ),
531+ // nameservers may be returned in a randomized order, so we have to check them with a helper function
532+ resource .TestCheckTypeSetElemAttr ("stackit_network.network" , "nameservers.*" , networkResource ["nameserver0" ]),
533+ resource .TestCheckTypeSetElemAttr ("stackit_network.network" , "nameservers.*" , networkResource ["nameserver1" ]),
534+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefix" , networkResource ["ipv4_prefix" ]),
535+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefix_length" , networkResource ["ipv4_prefix_length" ]),
536+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefixes.#" , "1" ),
537+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "ipv4_prefixes.0" , networkResource ["ipv4_prefix" ]),
538+ resource .TestCheckResourceAttr ("data.stackit_network.network" , "routed" , networkResource ["routed" ]),
539+ ),
540+ },
541+
542+ // Update
543+ {
544+ Config : networkResourceConfig (
545+ networkResource ["name_updated" ],
546+ fmt .Sprintf ("[%q, %q]" ,
547+ networkResource ["nameserver0" ],
548+ networkResource ["nameserver1" ]),
549+ ),
550+ Check : resource .ComposeAggregateTestCheckFunc (
551+ resource .TestCheckResourceAttrSet ("stackit_network.network" , "network_id" ),
552+ resource .TestCheckResourceAttr ("stackit_network.network" , "name" , networkResource ["name_updated" ]),
553+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_nameservers.#" , "2" ),
554+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_gateway" , networkResource ["ipv4_gateway" ]),
555+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_prefix" , networkResource ["ipv4_prefix" ]),
556+ resource .TestCheckResourceAttr ("stackit_network.network" , "ipv4_prefix_length" , networkResource ["ipv4_prefix_length" ])),
557+ },
558+ // Deletion is done by the framework implicitly
559+ },
560+ })
561+ }
562+
447563func TestAccNetworkArea (t * testing.T ) {
448564 resource .Test (t , resource.TestCase {
449565 ProtoV6ProviderFactories : testutil .TestAccProtoV6ProviderFactories ,
@@ -1557,6 +1673,49 @@ func TestAccImage(t *testing.T) {
15571673 })
15581674}
15591675
1676+ func testAccCheckNetworkDestroy (s * terraform.State ) error {
1677+ ctx := context .Background ()
1678+ var client * iaas.APIClient
1679+ var err error
1680+ if testutil .IaaSCustomEndpoint == "" {
1681+ client , err = iaas .NewAPIClient (
1682+ config .WithRegion ("eu01" ),
1683+ )
1684+ } else {
1685+ client , err = iaas .NewAPIClient (
1686+ config .WithEndpoint (testutil .IaaSCustomEndpoint ),
1687+ )
1688+ }
1689+ if err != nil {
1690+ return fmt .Errorf ("creating client: %w" , err )
1691+ }
1692+
1693+ var errs []error
1694+ // networks
1695+ for _ , rs := range s .RootModule ().Resources {
1696+ if rs .Type != "stackit_network" {
1697+ continue
1698+ }
1699+ networkId := strings .Split (rs .Primary .ID , core .Separator )[1 ]
1700+ err := client .DeleteNetworkExecute (ctx , testutil .ProjectId , networkId )
1701+ if err != nil {
1702+ var oapiErr * oapierror.GenericOpenAPIError
1703+ if errors .As (err , & oapiErr ) {
1704+ if oapiErr .StatusCode == http .StatusNotFound {
1705+ continue
1706+ }
1707+ }
1708+ errs = append (errs , fmt .Errorf ("cannot trigger network deletion %q: %w" , networkId , err ))
1709+ }
1710+ _ , err = wait .DeleteNetworkWaitHandler (ctx , client , testutil .ProjectId , networkId ).WaitWithContext (ctx )
1711+ if err != nil {
1712+ errs = append (errs , fmt .Errorf ("cannot delete network %q: %w" , networkId , err ))
1713+ }
1714+ }
1715+
1716+ return errors .Join (errs ... )
1717+ }
1718+
15601719func testAccCheckNetworkAreaDestroy (s * terraform.State ) error {
15611720 ctx := context .Background ()
15621721 var client * iaas.APIClient
0 commit comments