-
Notifications
You must be signed in to change notification settings - Fork 39
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: futuretea <Hang.Yu@suse.com>
- Loading branch information
1 parent
e350da6
commit 420b467
Showing
7 changed files
with
807 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} |
Oops, something went wrong.