Skip to content

Commit

Permalink
Refactor and write tests for vnic services
Browse files Browse the repository at this point in the history
  • Loading branch information
appilon committed Apr 26, 2023
1 parent b3bda3a commit 775498c
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 23 deletions.
36 changes: 13 additions & 23 deletions vsphere/resource_vsphere_vnic.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"strings"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/hashicorp/terraform-provider-vsphere/vsphere/internal/helper/hostsystem"
"github.com/hashicorp/terraform-provider-vsphere/vsphere/internal/helper/structure"
"github.com/vmware/govmomi"
Expand Down Expand Up @@ -133,12 +134,12 @@ func resourceVsphereNicRead(d *schema.ResourceData, meta interface{}) error {
}

// get enabled services
host_system, err := hostsystem.FromID(client, hostID)
hostSystem, err := hostsystem.FromID(client, hostID)
if err != nil {
return err
}

hostVnicMgr, err := host_system.ConfigManager().VirtualNicManager(ctx)
hostVnicMgr, err := hostSystem.ConfigManager().VirtualNicManager(ctx)
if err != nil {
return nil
}
Expand Down Expand Up @@ -317,7 +318,10 @@ func BaseVMKernelSchema() map[string]*schema.Schema {
Type: schema.TypeSet,
Optional: true,
Description: "Enabled services setting for this interface. Current possible values are 'vmotion', 'management' and 'vsan'",
Elem: &schema.Schema{Type: schema.TypeString},
Elem: &schema.Schema{
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice(vnicServiceTypeAllowedValues, false),
},
},
}
return sch
Expand Down Expand Up @@ -357,17 +361,17 @@ func updateVNic(d *schema.ResourceData, meta interface{}) (string, error) {
}

func updateVnicService(d *schema.ResourceData, hostID string, nicID string, meta interface{}) error {
service_old, service_new := d.GetChange("services")
deleteList := service_old.(*schema.Set).List()
addList := service_new.(*schema.Set).List()
serviceOld, serviceNew := d.GetChange("services")
deleteList := serviceOld.(*schema.Set).List()
addList := serviceNew.(*schema.Set).List()

client := meta.(*Client).vimClient
ctx := context.TODO()
host_system, err := hostsystem.FromID(client, hostID)
hostSystem, err := hostsystem.FromID(client, hostID)
if err != nil {
return err
}
method, err := host_system.ConfigManager().VirtualNicManager(ctx)
method, err := hostSystem.ConfigManager().VirtualNicManager(ctx)
if err != nil {
return nil
}
Expand All @@ -391,21 +395,7 @@ func updateVnicService(d *schema.ResourceData, hostID string, nicID string, meta

func precheckEnableServices(d *schema.ResourceData) error {
if d.Get("netstack").(string) != "defaultTcpipStack" && len(d.Get("services").(*schema.Set).List()) != 0 {
return fmt.Errorf("Services could be configured only when the netstack is set to defaultTcpipStack.")
}
// will expand scope later, current possible values are vmotion, management and vsan.
data := d.Get("services").(*schema.Set).List()
for _, value := range data {
isValueAllowed := false
for _, allowedValue := range vnicServiceTypeAllowedValues {
if value == allowedValue {
isValueAllowed = true
break
}
}
if !isValueAllowed {
return fmt.Errorf("%s is not an allowed service type.", value)
}
return fmt.Errorf("services can only be configured when netstack is set to defaultTcpipStack")
}
return nil
}
Expand Down
114 changes: 114 additions & 0 deletions vsphere/resource_vsphere_vnic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"os"
"regexp"
"strconv"
"strings"
"testing"
Expand All @@ -18,6 +19,8 @@ import (
"github.com/vmware/govmomi"
)

// TODO: move away from tests being composed in this manner

type genTfConfig func(string) string

func generateSteps(cfgFunc genTfConfig, netstack string) []resource.TestStep {
Expand Down Expand Up @@ -117,6 +120,117 @@ func TestAccResourceVSphereVNic_hvs_vmotion(t *testing.T) {
})
}

func TestAccResourceVSphereVNic_services_nonDefaultNetstack(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() {
RunSweepers()
testAccPreCheck(t)
},
Providers: testAccProviders,
CheckDestroy: testAccVSphereVNicDestroy,
Steps: []resource.TestStep{
{
Config: testaccvspherevnicconfigHvs(
combineSnippets(
ipv4Snippet("192.0.2.10|255.255.255.0|192.0.2.1"),
"",
netstackSnippet("vmotion"),
"",
`services = ["vsan"]`,
),
),
ExpectError: regexp.MustCompile("services can only be configured when netstack is set to defaultTcpipStack"),
},
},
})
}

func TestAccResourceVSphereVNic_services_invalid(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() {
RunSweepers()
testAccPreCheck(t)
},
Providers: testAccProviders,
CheckDestroy: testAccVSphereVNicDestroy,
Steps: []resource.TestStep{
{
Config: testaccvspherevnicconfigHvs(
combineSnippets(
ipv4Snippet("192.0.2.10|255.255.255.0|192.0.2.1"),
"",
netstackSnippet("defaultTcpipStack"),
"",
`services = ["invalid"]`,
),
),
ExpectError: regexp.MustCompile("Error"),
PlanOnly: true,
},
},
})
}

func TestAccResourceVSphereVNic_services_valid(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() {
RunSweepers()
testAccPreCheck(t)
},
Providers: testAccProviders,
CheckDestroy: testAccVSphereVNicDestroy,
Steps: []resource.TestStep{
{
Config: testaccvspherevnicconfigHvs(
combineSnippets(
ipv4Snippet("192.0.2.10|255.255.255.0|192.0.2.1"),
"",
netstackSnippet("defaultTcpipStack"),
"",
`services = ["vsan"]`,
),
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("vsphere_vnic.v1", "services.#", "1"),
resource.TestCheckTypeSetElemAttr("vsphere_vnic.v1", "services.*", "vsan"),
),
},
{
Config: testaccvspherevnicconfigHvs(
combineSnippets(
ipv4Snippet("192.0.2.10|255.255.255.0|192.0.2.1"),
"",
netstackSnippet("defaultTcpipStack"),
"",
`services = ["vmotion"]`,
),
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("vsphere_vnic.v1", "services.#", "1"),
resource.TestCheckTypeSetElemAttr("vsphere_vnic.v1", "services.*", "vmotion"),
),
},
{
Config: testaccvspherevnicconfigHvs(
combineSnippets(
ipv4Snippet("192.0.2.10|255.255.255.0|192.0.2.1"),
"",
netstackSnippet("defaultTcpipStack"),
"",
`services = ["vmotion", "management", "vsan"]`,
),
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("vsphere_vnic.v1", "services.#", "3"),
resource.TestCheckTypeSetElemAttr("vsphere_vnic.v1", "services.*", "vmotion"),
resource.TestCheckTypeSetElemAttr("vsphere_vnic.v1", "services.*", "management"),
resource.TestCheckTypeSetElemAttr("vsphere_vnic.v1", "services.*", "vsan"),
),
},
},
})
}

func testAccVsphereVNicNetworkSettings(name, ipv4State, ipv6State, netstack string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[name]
Expand Down

0 comments on commit 775498c

Please sign in to comment.