Skip to content

Commit c4c7b10

Browse files
authored
feat(private_nic): add tags (#1830)
* feat(private_nic): add tags * add doc * fix lint
1 parent f988f9c commit c4c7b10

8 files changed

+3997
-663
lines changed

docs/data-sources/instance_private_nic.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,19 @@ data "scaleway_instance_private_nic" "by_pn_id" {
2020
server_id = "11111111-1111-1111-1111-111111111111"
2121
private_network_id = "11111111-1111-1111-1111-111111111111"
2222
}
23+
24+
data "scaleway_instance_private_nic" "by_tags" {
25+
server_id = "11111111-1111-1111-1111-111111111111"
26+
tags = ["mytag"]
27+
}
2328
```
2429

2530
## Argument Reference
2631

2732
- `server_id` - (Required) The server's id
28-
Only one of `address` and `id` should be specified.
33+
34+
- `tags` (Optional) The tags associated with the private NIC.
35+
As datasource only returns one private NIC, the search with given tags must return only one result
2936

3037
- `private_nic_id` - (Optional) The ID of the instance server private nic
3138
Only one of `private_nic_id` and `private_network_id` should be specified.

docs/resources/instance_private_nic.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ The following arguments are required:
4747

4848
- `server_id` - (Required) The ID of the server associated with.
4949
- `private_network_id` - (Required) The ID of the private network attached to.
50+
- `tags` - (Optional) The tags associated with the private NIC.
5051
- `zone` - (Defaults to [provider](../index.md#zone) `zone`) The [zone](../guides/regions_and_zones.md#zones) in which the server must be created.
5152

5253
## Attributes Reference

scaleway/data_source_instance_private_nic.go

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,16 @@ func dataSourceScalewayInstancePrivateNIC() *schema.Resource {
1414
// Generate datasource schema from resource
1515
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayInstancePrivateNIC().Schema)
1616

17-
addOptionalFieldsToSchema(dsSchema, "private_network_id", "zone")
17+
addOptionalFieldsToSchema(dsSchema, "private_network_id", "zone", "tags")
1818
fixDatasourceSchemaFlags(dsSchema, true, "server_id")
1919

2020
dsSchema["private_network_id"].ConflictsWith = []string{"private_nic_id"}
21-
dsSchema["private_network_id"].AtLeastOneOf = []string{"private_nic_id"}
2221

2322
dsSchema["private_nic_id"] = &schema.Schema{
2423
Type: schema.TypeString,
2524
Optional: true,
2625
Description: "The ID of the Private NIC",
2726
ValidateFunc: validationUUIDorUUIDWithLocality(),
28-
AtLeastOneOf: []string{"private_network_id"},
2927
ConflictsWith: []string{"private_network_id"},
3028
}
3129

@@ -46,11 +44,20 @@ func dataSourceScalewayInstancePrivateNICRead(ctx context.Context, d *schema.Res
4644
id, ok := d.GetOk("private_nic_id")
4745
var privateNICID string
4846
if !ok {
49-
privateNetworkID := expandID(d.Get("private_network_id"))
50-
privateNic, err := privateNICWithPrivateNetworkID(ctx, instanceAPI, zone, serverID, privateNetworkID)
47+
resp, err := instanceAPI.ListPrivateNICs(&instance.ListPrivateNICsRequest{
48+
Zone: zone,
49+
ServerID: serverID,
50+
Tags: expandStrings(d.Get("tags")),
51+
}, scw.WithContext(ctx))
52+
if err != nil {
53+
return diag.FromErr(fmt.Errorf("failed to list instance private_nic: %w", err))
54+
}
55+
56+
privateNic, err := privateNICWithFilters(resp.PrivateNics, d)
5157
if err != nil {
5258
return diag.FromErr(err)
5359
}
60+
5461
privateNICID = privateNic.ID
5562
} else {
5663
_, privateNICID, _ = parseLocalizedID(id.(string))
@@ -79,18 +86,34 @@ func dataSourceScalewayInstancePrivateNICRead(ctx context.Context, d *schema.Res
7986
return nil
8087
}
8188

82-
func privateNICWithPrivateNetworkID(ctx context.Context, api *instance.API, zone scw.Zone, serverID, privateNetworkID string) (*instance.PrivateNIC, error) {
83-
resp, err := api.ListPrivateNICs(&instance.ListPrivateNICsRequest{
84-
Zone: zone,
85-
ServerID: serverID,
86-
}, scw.WithContext(ctx))
87-
if err != nil {
88-
return nil, fmt.Errorf("failed to list instance private_nic: %w", err)
89+
func privateNICWithFilters(privateNICs []*instance.PrivateNIC, d *schema.ResourceData) (*instance.PrivateNIC, error) {
90+
privateNetworkID := expandID(d.Get("private_network_id"))
91+
92+
if privateNetworkID == "" {
93+
switch {
94+
case len(privateNICs) == 1:
95+
return privateNICs[0], nil
96+
case len(privateNICs) == 0:
97+
return nil, fmt.Errorf("found no private nic with given filters")
98+
default:
99+
return nil, fmt.Errorf("found more than one private nic with given filters")
100+
}
89101
}
90-
for _, pnic := range resp.PrivateNics {
102+
103+
var privateNIC *instance.PrivateNIC
104+
105+
for _, pnic := range privateNICs {
91106
if pnic.PrivateNetworkID == privateNetworkID {
92-
return pnic, nil
107+
if privateNIC != nil {
108+
return nil, fmt.Errorf("found more than one private nic for request private network (%s)", privateNetworkID)
109+
}
110+
privateNIC = pnic
93111
}
94112
}
95-
return nil, fmt.Errorf("could not find a private_nic for server (%s) and private network (%s) in zone (%s)", serverID, privateNetworkID, zone)
113+
114+
if privateNIC != nil {
115+
return privateNIC, nil
116+
}
117+
118+
return nil, fmt.Errorf("could not find a private_nic for private network (%s)", privateNetworkID)
96119
}

scaleway/data_source_instance_private_nic_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func TestAccScalewayDataSourceInstancePrivateNIC_Basic(t *testing.T) {
2828
resource "scaleway_instance_private_nic" "nic" {
2929
server_id = scaleway_instance_server.server.id
3030
private_network_id = scaleway_vpc_private_network.vpc.id
31+
tags = ["test-terraform-datasource-private-nic"]
3132
}`,
3233
},
3334
{
@@ -42,6 +43,7 @@ func TestAccScalewayDataSourceInstancePrivateNIC_Basic(t *testing.T) {
4243
resource "scaleway_instance_private_nic" "nic" {
4344
server_id = scaleway_instance_server.server.id
4445
private_network_id = scaleway_vpc_private_network.vpc.id
46+
tags = ["test-terraform-datasource-private-nic"]
4547
}
4648
4749
data scaleway_instance_private_nic find_by_nic_id {
@@ -53,13 +55,22 @@ func TestAccScalewayDataSourceInstancePrivateNIC_Basic(t *testing.T) {
5355
server_id = scaleway_instance_server.server.id
5456
private_network_id = scaleway_vpc_private_network.vpc.id
5557
}
58+
59+
data scaleway_instance_private_nic find_by_tags {
60+
server_id = scaleway_instance_server.server.id
61+
tags = ["test-terraform-datasource-private-nic"]
62+
}
5663
`,
5764
Check: resource.ComposeTestCheckFunc(
5865
testAccCheckScalewayInstancePrivateNICExists(tt, "scaleway_instance_private_nic.nic"),
5966

67+
resource.TestCheckResourceAttrPair("scaleway_instance_private_nic.nic", "id", "data.scaleway_instance_private_nic.find_by_nic_id", "id"),
68+
resource.TestCheckResourceAttrPair("scaleway_instance_private_nic.nic", "id", "data.scaleway_instance_private_nic.find_by_vpc_id", "id"),
69+
resource.TestCheckResourceAttrPair("scaleway_instance_private_nic.nic", "id", "data.scaleway_instance_private_nic.find_by_tags", "id"),
6070
resource.TestCheckResourceAttrPair("data.scaleway_instance_private_nic.find_by_nic_id", "id", "data.scaleway_instance_private_nic.find_by_vpc_id", "id"),
6171
resource.TestCheckResourceAttrSet("data.scaleway_instance_private_nic.find_by_nic_id", "mac_address"),
6272
resource.TestCheckResourceAttrSet("data.scaleway_instance_private_nic.find_by_vpc_id", "mac_address"),
73+
resource.TestCheckResourceAttrSet("data.scaleway_instance_private_nic.find_by_tags", "mac_address"),
6374
),
6475
},
6576
},

scaleway/resource_instance_private_nic.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ func resourceScalewayInstancePrivateNIC() *schema.Resource {
4141
Description: "MAC address of the NIC",
4242
Computed: true,
4343
},
44+
"tags": {
45+
Type: schema.TypeList,
46+
Elem: &schema.Schema{
47+
Type: schema.TypeString,
48+
},
49+
Optional: true,
50+
Description: "The tags associated with the private-nic",
51+
},
4452
"zone": zoneSchema(),
4553
},
4654
CustomizeDiff: customizeDiffLocalityCheck("server_id", "private_network_id"),
@@ -62,6 +70,7 @@ func resourceScalewayInstancePrivateNICCreate(ctx context.Context, d *schema.Res
6270
Zone: zone,
6371
ServerID: expandZonedID(d.Get("server_id").(string)).ID,
6472
PrivateNetworkID: expandZonedID(d.Get("private_network_id").(string)).ID,
73+
Tags: expandStrings(d.Get("tags")),
6574
}
6675

6776
privateNIC, err := instanceAPI.CreatePrivateNIC(
@@ -112,6 +121,10 @@ func resourceScalewayInstancePrivateNICRead(ctx context.Context, d *schema.Resou
112121
_ = d.Set("private_network_id", newZonedID(zone, privateNIC.PrivateNetworkID).String())
113122
_ = d.Set("mac_address", privateNIC.MacAddress)
114123

124+
if len(privateNIC.Tags) > 0 {
125+
_ = d.Set("tags", privateNIC.Tags)
126+
}
127+
115128
return nil
116129
}
117130

@@ -153,6 +166,7 @@ func resourceScalewayInstancePrivateNICUpdate(ctx context.Context, d *schema.Res
153166
Zone: zone,
154167
ServerID: expandZonedID(d.Get("server_id").(string)).ID,
155168
PrivateNetworkID: expandZonedID(d.Get("private_network_id").(string)).ID,
169+
Tags: expandStrings(d.Get("tags")),
156170
}
157171

158172
privateNIC, err := instanceAPI.CreatePrivateNIC(
@@ -175,6 +189,19 @@ func resourceScalewayInstancePrivateNICUpdate(ctx context.Context, d *schema.Res
175189
privateNIC.PrivateNic.ID,
176190
),
177191
)
192+
} else if d.HasChange("tags") {
193+
_, err := instanceAPI.UpdatePrivateNIC(
194+
&instance.UpdatePrivateNICRequest{
195+
Zone: zone,
196+
ServerID: serverID,
197+
PrivateNicID: privateNICID,
198+
Tags: expandUpdatedStringsPtr(d.Get("tags")),
199+
},
200+
scw.WithContext(ctx),
201+
)
202+
if err != nil {
203+
return diag.FromErr(err)
204+
}
178205
}
179206

180207
return resourceScalewayInstancePrivateNICRead(ctx, d, meta)

scaleway/resource_instance_private_nic_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,94 @@ func TestAccScalewayInstancePrivateNIC_Basic(t *testing.T) {
5151
})
5252
}
5353

54+
func TestAccScalewayInstancePrivateNIC_Tags(t *testing.T) {
55+
tt := NewTestTools(t)
56+
defer tt.Cleanup()
57+
resource.ParallelTest(t, resource.TestCase{
58+
PreCheck: func() { testAccPreCheck(t) },
59+
ProviderFactories: tt.ProviderFactories,
60+
CheckDestroy: testAccCheckScalewayInstancePrivateNICDestroy(tt),
61+
Steps: []resource.TestStep{
62+
{
63+
Config: `
64+
resource scaleway_vpc_private_network pn01 {
65+
name = "TestAccScalewayInstancePrivateNIC_Tags"
66+
}
67+
68+
resource "scaleway_instance_server" "server01" {
69+
image = "ubuntu_jammy"
70+
type = "PLAY2-PICO"
71+
state = "stopped"
72+
}
73+
74+
resource scaleway_instance_private_nic nic01 {
75+
server_id = scaleway_instance_server.server01.id
76+
private_network_id = scaleway_vpc_private_network.pn01.id
77+
}
78+
`,
79+
Check: resource.ComposeTestCheckFunc(
80+
testAccCheckScalewayInstancePrivateNICExists(tt, "scaleway_instance_private_nic.nic01"),
81+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "mac_address"),
82+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "private_network_id"),
83+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "server_id"),
84+
),
85+
},
86+
{
87+
Config: `
88+
resource scaleway_vpc_private_network pn01 {
89+
name = "TestAccScalewayInstancePrivateNIC_Tags"
90+
}
91+
92+
resource "scaleway_instance_server" "server01" {
93+
image = "ubuntu_jammy"
94+
type = "PLAY2-PICO"
95+
state = "stopped"
96+
}
97+
98+
resource scaleway_instance_private_nic nic01 {
99+
server_id = scaleway_instance_server.server01.id
100+
private_network_id = scaleway_vpc_private_network.pn01.id
101+
tags = ["tag1", "tag2"]
102+
}
103+
`,
104+
Check: resource.ComposeTestCheckFunc(
105+
testAccCheckScalewayInstancePrivateNICExists(tt, "scaleway_instance_private_nic.nic01"),
106+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "mac_address"),
107+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "private_network_id"),
108+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "server_id"),
109+
resource.TestCheckResourceAttr("scaleway_instance_private_nic.nic01", "tags.0", "tag1"),
110+
resource.TestCheckResourceAttr("scaleway_instance_private_nic.nic01", "tags.1", "tag2"),
111+
),
112+
},
113+
{
114+
Config: `
115+
resource scaleway_vpc_private_network pn01 {
116+
name = "TestAccScalewayInstancePrivateNIC_Tags"
117+
}
118+
119+
resource "scaleway_instance_server" "server01" {
120+
image = "ubuntu_jammy"
121+
type = "PLAY2-PICO"
122+
state = "stopped"
123+
}
124+
125+
resource scaleway_instance_private_nic nic01 {
126+
server_id = scaleway_instance_server.server01.id
127+
private_network_id = scaleway_vpc_private_network.pn01.id
128+
}
129+
`,
130+
Check: resource.ComposeTestCheckFunc(
131+
testAccCheckScalewayInstancePrivateNICExists(tt, "scaleway_instance_private_nic.nic01"),
132+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "mac_address"),
133+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "private_network_id"),
134+
resource.TestCheckResourceAttrSet("scaleway_instance_private_nic.nic01", "server_id"),
135+
resource.TestCheckResourceAttr("scaleway_instance_private_nic.nic01", "tags.#", "0"),
136+
),
137+
},
138+
},
139+
})
140+
}
141+
54142
func testAccCheckScalewayInstancePrivateNICExists(tt *TestTools, n string) resource.TestCheckFunc {
55143
return func(s *terraform.State) error {
56144
rs, ok := s.RootModule().Resources[n]

scaleway/testdata/data-source-instance-private-nic-basic.cassette.yaml

Lines changed: 1867 additions & 647 deletions
Large diffs are not rendered by default.

scaleway/testdata/instance-private-nic-tags.cassette.yaml

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

0 commit comments

Comments
 (0)