Skip to content

Commit

Permalink
add tests
Browse files Browse the repository at this point in the history
Signed-off-by: futuretea <Hang.Yu@suse.com>
  • Loading branch information
futuretea authored and guangbochen committed Jul 22, 2021
1 parent e350da6 commit 420b467
Show file tree
Hide file tree
Showing 7 changed files with 807 additions and 0 deletions.
74 changes: 74 additions & 0 deletions internal/tests/provider_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package tests

import (
"context"
"sync"
"testing"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
apierrors "k8s.io/apimachinery/pkg/api/errors"

"github.com/harvester/terraform-provider-harvester/internal/provider"
)

var (
testAccProviders map[string]*schema.Provider
testAccProviderFactories map[string]func() (*schema.Provider, error)
testAccProvider *schema.Provider
testAccProviderConfigure sync.Once
)

const (
ProviderNameHarvester = "harvester"

testAccResourceStateRemoved = "removed"
testAccResourceStateExist = "exist"
)

func init() {
testAccProvider = provider.Provider()

testAccProviders = map[string]*schema.Provider{
ProviderNameHarvester: testAccProvider,
}

testAccProviderFactories = map[string]func() (*schema.Provider, error){
ProviderNameHarvester: func() (*schema.Provider, error) { return provider.Provider(), nil }, //nolint:unparam
}
}

func testAccPreCheck(t *testing.T) {
testAccProviderConfigure.Do(func() {
err := testAccProvider.Configure(context.Background(), terraform.NewResourceConfigRaw(nil))
if err != nil {
t.Fatal(err)
}
})
}

func getStateChangeConf(refresh resource.StateRefreshFunc) *resource.StateChangeConf {
return &resource.StateChangeConf{
Pending: []string{testAccResourceStateExist},
Target: []string{testAccResourceStateRemoved},
Refresh: refresh,
Timeout: 1 * time.Minute,
Delay: 1 * time.Second,
MinTimeout: 3 * time.Second,
}
}

func getResourceStateRefreshFunc(getResourceFunc func() (interface{}, error)) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
obj, err := getResourceFunc()
if err != nil {
if apierrors.IsNotFound(err) {
return obj, testAccResourceStateRemoved, nil
}
return nil, "", err
}
return obj, testAccResourceStateExist, nil
}
}
98 changes: 98 additions & 0 deletions internal/tests/resource_clusternetwork_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package tests

import (
"context"
"fmt"
"testing"

harvsternetworkv1 "github.com/harvester/harvester-network-controller/pkg/apis/network.harvesterhci.io/v1beta1"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/harvester/terraform-provider-harvester/pkg/client"
"github.com/harvester/terraform-provider-harvester/pkg/constants"
"github.com/harvester/terraform-provider-harvester/pkg/helper"
)

const (
testAccClusterNetworkNamespace = "harvester-system"
testAccClusterNetworkName = "vlan"
testAccClusterNetworkResourceName = constants.ResourceTypeClusterNetwork + "." + testAccClusterNetworkName
testAccClusterNetworkDescription = "Terraform Harvester ClusterNetwork acceptance test"

testAccClusterNetworkEnable = "true"
testAccClusterNetworkDefaultPhysicalNIC = "eth0"

testAccClusterNetworkConfigTemplate = `
resource %s "%s" {
namespace = harvester-system
%s = "%s"
%s = "%s"
%s = %s
%s = "%s"
}
`
)

func buildClusterNetworkConfig(name, description, enable, defaultPhysicalNIC string) string {
return fmt.Sprintf(testAccClusterNetworkConfigTemplate, constants.ResourceTypeClusterNetwork, name,
constants.FieldCommonName, name,
constants.FieldCommonDescription, description,
constants.FieldClusterNetworkEnable, enable,
constants.FieldClusterNetworkDefaultPhysicalNIC, defaultPhysicalNIC)
}

func TestAccClusterNetwork_basic(t *testing.T) {
var (
clusterNetwork *harvsternetworkv1.ClusterNetwork
ctx = context.Background()
)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
ResourceName: testAccClusterNetworkResourceName,
ImportState: true,
ImportStateId: testAccClusterNetworkNamespace + "/" + testAccClusterNetworkName,
Destroy: false,
Config: buildClusterNetworkConfig(testAccClusterNetworkName, testAccClusterNetworkDescription, testAccClusterNetworkEnable, testAccClusterNetworkDefaultPhysicalNIC),
Check: resource.ComposeTestCheckFunc(
testAccClusterNetworkExists(ctx, testAccClusterNetworkResourceName, clusterNetwork),
resource.TestCheckResourceAttr(testAccClusterNetworkResourceName, constants.FieldCommonName, testAccClusterNetworkName),
resource.TestCheckResourceAttr(testAccClusterNetworkResourceName, constants.FieldCommonDescription, testAccClusterNetworkDescription),
resource.TestCheckResourceAttr(testAccClusterNetworkResourceName, constants.FieldClusterNetworkEnable, testAccClusterNetworkEnable),
resource.TestCheckResourceAttr(testAccClusterNetworkResourceName, constants.FieldClusterNetworkDefaultPhysicalNIC, testAccClusterNetworkDefaultPhysicalNIC),
),
},
},
})
}

func testAccClusterNetworkExists(ctx context.Context, n string, clusterNetwork *harvsternetworkv1.ClusterNetwork) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Resource %s not found. ", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("Resource %s ID not set. ", n)
}

id := rs.Primary.ID
c := testAccProvider.Meta().(*client.Client)

namespace, name, err := helper.IDParts(id)
if err != nil {
return err
}
foundClusterNetwork, err := c.HarvesterNetworkClient.NetworkV1beta1().ClusterNetworks(namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return err
}
clusterNetwork = foundClusterNetwork
return nil
}
}
127 changes: 127 additions & 0 deletions internal/tests/resource_image_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package tests

import (
"context"
"fmt"
"regexp"
"testing"

harvsterv1 "github.com/harvester/harvester/pkg/apis/harvesterhci.io/v1beta1"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/harvester/terraform-provider-harvester/pkg/client"
"github.com/harvester/terraform-provider-harvester/pkg/constants"
"github.com/harvester/terraform-provider-harvester/pkg/helper"
)

const (
testAccImageName = "test-acc-foo"
testAccImageResourceName = constants.ResourceTypeImage + "." + testAccImageName
testAccImageDescription = "Terraform Harvester image acceptance test"
testAccImageDisplayName = "foo"

testAccImageURL = "http://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img"

testAccImageConfigTemplate = `
resource %s "%s" {
%s = "%s"
%s = "%s"
%s = "%s"
%s = "%s"
}
`
)

func buildImageConfig(name, description, displayName, url string) string {
return fmt.Sprintf(testAccImageConfigTemplate, constants.ResourceTypeImage, name,
constants.FieldCommonName, name,
constants.FieldCommonDescription, description,
constants.FieldImageDisplayName, displayName,
constants.FieldImageURL, url)
}

func TestAccImage_basic(t *testing.T) {
var (
image *harvsterv1.VirtualMachineImage
ctx = context.Background()
)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckImageDestroy(ctx),
Steps: []resource.TestStep{
{
Config: buildImageConfig(testAccImageName, testAccImageDescription, "", testAccImageURL),
ExpectError: regexp.MustCompile(fmt.Sprintf(`%s must not be empty`, constants.FieldImageDisplayName)),
},
{
Config: buildImageConfig(testAccImageName, testAccImageDescription, testAccImageDisplayName, ""),
ExpectError: regexp.MustCompile(fmt.Sprintf(`expected "%s" url to not be empty`, constants.FieldImageURL)),
},
{
Config: buildImageConfig(testAccImageName, testAccImageDescription, testAccImageDisplayName, testAccImageURL),
Check: resource.ComposeTestCheckFunc(
testAccImageExists(ctx, testAccImageResourceName, image),
resource.TestCheckResourceAttr(testAccImageResourceName, constants.FieldCommonName, testAccImageName),
resource.TestCheckResourceAttr(testAccImageResourceName, constants.FieldCommonDescription, testAccImageDescription),
resource.TestCheckResourceAttr(testAccImageResourceName, constants.FieldImageURL, testAccImageURL),
),
},
},
})
}

func testAccImageExists(ctx context.Context, n string, image *harvsterv1.VirtualMachineImage) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Resource %s not found. ", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("Resource %s ID not set. ", n)
}

id := rs.Primary.ID
c := testAccProvider.Meta().(*client.Client)

namespace, name, err := helper.IDParts(id)
if err != nil {
return err
}
foundImage, err := c.HarvesterClient.HarvesterhciV1beta1().VirtualMachineImages(namespace).Get(ctx, name, metav1.GetOptions{})
if err != nil {
return err
}
image = foundImage
return nil
}
}

func testAccCheckImageDestroy(ctx context.Context) resource.TestCheckFunc {
return func(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != constants.ResourceTypeImage {
continue
}

c := testAccProvider.Meta().(*client.Client)
namespace, name, err := helper.IDParts(rs.Primary.ID)
if err != nil {
return err
}

imageStateRefreshFunc := getResourceStateRefreshFunc(func() (interface{}, error) {
return c.HarvesterClient.HarvesterhciV1beta1().VirtualMachineImages(namespace).Get(ctx, name, metav1.GetOptions{})
})
stateConf := getStateChangeConf(imageStateRefreshFunc)
if _, err = stateConf.WaitForStateContext(ctx); err != nil {
return fmt.Errorf(
"[ERROR] waiting for image (%s) to be removed: %s", rs.Primary.ID, err)
}
}
return nil
}
}
Loading

0 comments on commit 420b467

Please sign in to comment.