Skip to content

Commit cd9a7fe

Browse files
authored
fix(instance): server private_network with deleted pnic (#2552)
* tests(instance): test server private_network support with a deleted private_nic * fix(instance): server private_network with deleted pnic * add cassette
1 parent 157066b commit cd9a7fe

File tree

4 files changed

+4546
-1
lines changed

4 files changed

+4546
-1
lines changed

internal/services/instance/helpers_instance.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ func (ph *privateNICsHandler) set(d *schema.ResourceData) error {
427427
keyValue := d.Get(pnKey)
428428
keyRaw, err := ph.get(keyValue.(string))
429429
if err != nil {
430-
return err
430+
continue
431431
}
432432
privateNetworks = append(privateNetworks, keyRaw.(map[string]interface{}))
433433
}
@@ -448,6 +448,7 @@ func (ph *privateNICsHandler) get(key string) (interface{}, error) {
448448
"mac_address": pn.MacAddress,
449449
"status": pn.State.String(),
450450
"zone": loc,
451+
"pnic_id": pn.ID,
451452
}, nil
452453
}
453454

internal/services/instance/server.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,11 @@ func ResourceServer() *schema.Resource {
302302
Computed: true,
303303
Description: "The private NIC state",
304304
},
305+
"pnic_id": {
306+
Type: schema.TypeString,
307+
Computed: true,
308+
Description: "The ID of the NIC",
309+
},
305310
"zone": zonal.Schema(),
306311
},
307312
},

internal/services/instance/server_test.go

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

internal/services/instance/testdata/server-private-network-missing-pnic.cassette.yaml

Lines changed: 4375 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)