@@ -14,6 +14,7 @@ import (
1414 instanceSDK "github.com/scaleway/scaleway-sdk-go/api/instance/v1"
1515 "github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
1616 "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
17+ "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal"
1718 "github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
1819 "github.com/scaleway/terraform-provider-scaleway/v2/internal/provider"
1920 "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/instance"
@@ -1957,3 +1958,166 @@ func TestAccServer_BlockExternal(t *testing.T) {
19571958 },
19581959 })
19591960}
1961+
1962+ func TestAccServer_PrivateNetworkMissingPNIC (t * testing.T ) {
1963+ tt := acctest .NewTestTools (t )
1964+ defer tt .Cleanup ()
1965+ resource .ParallelTest (t , resource.TestCase {
1966+ PreCheck : func () { acctest .PreCheck (t ) },
1967+ ProviderFactories : tt .ProviderFactories ,
1968+ CheckDestroy : instancechecks .IsServerDestroyed (tt ),
1969+ Steps : []resource.TestStep {
1970+ {
1971+ Config : `
1972+ resource scaleway_vpc_private_network pn {}
1973+
1974+ resource "scaleway_instance_server" "main" {
1975+ image = "ubuntu_jammy"
1976+ type = "PLAY2-PICO"
1977+ private_network {
1978+ pn_id = scaleway_vpc_private_network.pn.id
1979+ }
1980+ }
1981+ ` ,
1982+ Check : resource .ComposeTestCheckFunc (
1983+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "type" , "PLAY2-PICO" ),
1984+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "private_network.#" , "1" ),
1985+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pn_id" ),
1986+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.mac_address" ),
1987+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.status" ),
1988+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.zone" ),
1989+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pnic_id" ),
1990+ resource .TestCheckResourceAttrPair ("scaleway_instance_server.main" , "private_network.0.pn_id" ,
1991+ "scaleway_vpc_private_network.pn" , "id" ),
1992+ ),
1993+ },
1994+ {
1995+ Config : `
1996+ resource scaleway_vpc_private_network pn {}
1997+
1998+ resource "scaleway_instance_server" "main" {
1999+ image = "ubuntu_jammy"
2000+ type = "PLAY2-PICO"
2001+ private_network {
2002+ pn_id = scaleway_vpc_private_network.pn.id
2003+ }
2004+ }
2005+
2006+ resource scaleway_instance_private_nic pnic {
2007+ private_network_id = scaleway_vpc_private_network.pn.id
2008+ server_id = scaleway_instance_server.main.id
2009+ }
2010+ ` ,
2011+ ResourceName : "scaleway_instance_private_nic.pnic" ,
2012+ ImportState : true ,
2013+ ImportStateIdFunc : func (state * terraform.State ) (string , error ) {
2014+ serverID := state .RootModule ().Resources ["scaleway_instance_server.main" ].Primary .ID
2015+ pnicID , exists := state .RootModule ().Resources ["scaleway_instance_server.main" ].Primary .Attributes ["private_network.0.pnic_id" ]
2016+ if ! exists {
2017+ return "" , errors .New ("private_network.0.pnic_id not found" )
2018+ }
2019+
2020+ id := serverID + "/" + pnicID
2021+
2022+ return id , nil
2023+ },
2024+ ImportStatePersist : true ,
2025+ },
2026+ { // We import private nic as a separate resource to trigger its deletion.
2027+ Config : `
2028+ resource scaleway_vpc_private_network pn {}
2029+
2030+ resource "scaleway_instance_server" "main" {
2031+ image = "ubuntu_jammy"
2032+ type = "PLAY2-PICO"
2033+ private_network {
2034+ pn_id = scaleway_vpc_private_network.pn.id
2035+ }
2036+ }
2037+
2038+ resource scaleway_instance_private_nic pnic {
2039+ private_network_id = scaleway_vpc_private_network.pn.id
2040+ server_id = scaleway_instance_server.main.id
2041+ }
2042+ ` ,
2043+ Check : resource .ComposeTestCheckFunc (
2044+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "type" , "PLAY2-PICO" ),
2045+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "private_network.#" , "1" ),
2046+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pn_id" ),
2047+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.mac_address" ),
2048+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.status" ),
2049+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.zone" ),
2050+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pnic_id" ),
2051+ resource .TestCheckResourceAttrPair ("scaleway_instance_server.main" , "private_network.0.pn_id" ,
2052+ "scaleway_vpc_private_network.pn" , "id" ),
2053+ func (state * terraform.State ) error {
2054+ serverPNICID , exists := state .RootModule ().Resources ["scaleway_instance_server.main" ].Primary .Attributes ["private_network.0.pnic_id" ]
2055+ if ! exists {
2056+ return errors .New ("private_network.0.pnic_id not found" )
2057+ }
2058+ localizedPNICID := state .RootModule ().Resources ["scaleway_instance_private_nic.pnic" ].Primary .ID
2059+ _ , pnicID , _ , err := zonal .ParseNestedID (localizedPNICID )
2060+ if err != nil {
2061+ return err
2062+ }
2063+
2064+ if serverPNICID != pnicID {
2065+ return fmt .Errorf ("expected server pnic (%s) to equal standalone pnic id (%s)" , serverPNICID , pnicID )
2066+ }
2067+
2068+ return nil
2069+ },
2070+ ),
2071+ },
2072+ {
2073+ Config : `
2074+ resource scaleway_vpc_private_network pn {}
2075+
2076+ resource "scaleway_instance_server" "main" {
2077+ image = "ubuntu_jammy"
2078+ type = "PLAY2-PICO"
2079+ private_network {
2080+ pn_id = scaleway_vpc_private_network.pn.id
2081+ }
2082+ }
2083+ ` ,
2084+ Check : resource .ComposeTestCheckFunc (
2085+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "type" , "PLAY2-PICO" ),
2086+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "private_network.#" , "1" ),
2087+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pn_id" ),
2088+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.mac_address" ),
2089+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.status" ),
2090+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.zone" ),
2091+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pnic_id" ),
2092+ resource .TestCheckResourceAttrPair ("scaleway_instance_server.main" , "private_network.0.pn_id" ,
2093+ "scaleway_vpc_private_network.pn" , "id" ),
2094+ ),
2095+ ExpectNonEmptyPlan : true , // pnic get deleted and the plan is not empty after the apply as private_network is now missing
2096+ },
2097+ {
2098+ Config : `
2099+ resource scaleway_vpc_private_network pn {}
2100+
2101+ resource "scaleway_instance_server" "main" {
2102+ image = "ubuntu_jammy"
2103+ type = "PLAY2-PICO"
2104+ private_network {
2105+ pn_id = scaleway_vpc_private_network.pn.id
2106+ }
2107+ }
2108+ ` ,
2109+ Check : resource .ComposeTestCheckFunc (
2110+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "type" , "PLAY2-PICO" ),
2111+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "private_network.#" , "1" ),
2112+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pn_id" ),
2113+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.mac_address" ),
2114+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.status" ),
2115+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.zone" ),
2116+ resource .TestCheckResourceAttrSet ("scaleway_instance_server.main" , "private_network.0.pnic_id" ),
2117+ resource .TestCheckResourceAttrPair ("scaleway_instance_server.main" , "private_network.0.pn_id" ,
2118+ "scaleway_vpc_private_network.pn" , "id" ),
2119+ ),
2120+ },
2121+ },
2122+ })
2123+ }
0 commit comments