github.com/jrasell/terraform@v0.6.17-0.20160523115548-2652f5232949/builtin/providers/vsphere/resource_vsphere_file_test.go (about)

     1  package vsphere
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  	"github.com/vmware/govmomi"
    12  	"github.com/vmware/govmomi/find"
    13  	"github.com/vmware/govmomi/object"
    14  	"golang.org/x/net/context"
    15  )
    16  
    17  // Basic file creation
    18  func TestAccVSphereFile_basic(t *testing.T) {
    19  	testVmdkFileData := []byte("# Disk DescriptorFile\n")
    20  	testVmdkFile := "/tmp/tf_test.vmdk"
    21  	err := ioutil.WriteFile(testVmdkFile, testVmdkFileData, 0644)
    22  	if err != nil {
    23  		t.Errorf("error %s", err)
    24  		return
    25  	}
    26  
    27  	datacenter := os.Getenv("VSPHERE_DATACENTER")
    28  	datastore := os.Getenv("VSPHERE_DATASTORE")
    29  	testMethod := "basic"
    30  	resourceName := "vsphere_file." + testMethod
    31  	destinationFile := "tf_file_test.vmdk"
    32  	sourceFile := testVmdkFile
    33  
    34  	resource.Test(t, resource.TestCase{
    35  		PreCheck:     func() { testAccPreCheck(t) },
    36  		Providers:    testAccProviders,
    37  		CheckDestroy: testAccCheckVSphereFileDestroy,
    38  		Steps: []resource.TestStep{
    39  			{
    40  				Config: fmt.Sprintf(
    41  					testAccCheckVSphereFileConfig,
    42  					testMethod,
    43  					datacenter,
    44  					datastore,
    45  					sourceFile,
    46  					destinationFile,
    47  				),
    48  				Check: resource.ComposeTestCheckFunc(
    49  					testAccCheckVSphereFileExists(resourceName, destinationFile, true),
    50  					resource.TestCheckResourceAttr(resourceName, "destination_file", destinationFile),
    51  				),
    52  			},
    53  		},
    54  	})
    55  	os.Remove(testVmdkFile)
    56  }
    57  
    58  // file creation followed by a rename of file (update)
    59  func TestAccVSphereFile_renamePostCreation(t *testing.T) {
    60  	testVmdkFileData := []byte("# Disk DescriptorFile\n")
    61  	testVmdkFile := "/tmp/tf_test.vmdk"
    62  	err := ioutil.WriteFile(testVmdkFile, testVmdkFileData, 0644)
    63  	if err != nil {
    64  		t.Errorf("error %s", err)
    65  		return
    66  	}
    67  
    68  	datacenter := os.Getenv("VSPHERE_DATACENTER")
    69  	datastore := os.Getenv("VSPHERE_DATASTORE")
    70  	testMethod := "basic"
    71  	resourceName := "vsphere_file." + testMethod
    72  	destinationFile := "tf_test_file.vmdk"
    73  	destinationFileMoved := "tf_test_file_moved.vmdk"
    74  	sourceFile := testVmdkFile
    75  
    76  	resource.Test(t, resource.TestCase{
    77  		PreCheck:     func() { testAccPreCheck(t) },
    78  		Providers:    testAccProviders,
    79  		CheckDestroy: testAccCheckVSphereFolderDestroy,
    80  		Steps: []resource.TestStep{
    81  			{
    82  				Config: fmt.Sprintf(
    83  					testAccCheckVSphereFileConfig,
    84  					testMethod,
    85  					datacenter,
    86  					datastore,
    87  					sourceFile,
    88  					destinationFile,
    89  				),
    90  				Check: resource.ComposeTestCheckFunc(
    91  					testAccCheckVSphereFileExists(resourceName, destinationFile, true),
    92  					testAccCheckVSphereFileExists(resourceName, destinationFileMoved, false),
    93  					resource.TestCheckResourceAttr(resourceName, "destination_file", destinationFile),
    94  				),
    95  			},
    96  			{
    97  				Config: fmt.Sprintf(
    98  					testAccCheckVSphereFileConfig,
    99  					testMethod,
   100  					datacenter,
   101  					datastore,
   102  					sourceFile,
   103  					destinationFileMoved,
   104  				),
   105  				Check: resource.ComposeTestCheckFunc(
   106  					testAccCheckVSphereFileExists(resourceName, destinationFile, false),
   107  					testAccCheckVSphereFileExists(resourceName, destinationFileMoved, true),
   108  					resource.TestCheckResourceAttr(resourceName, "destination_file", destinationFileMoved),
   109  				),
   110  			},
   111  		},
   112  	})
   113  	os.Remove(testVmdkFile)
   114  }
   115  
   116  func testAccCheckVSphereFileDestroy(s *terraform.State) error {
   117  	client := testAccProvider.Meta().(*govmomi.Client)
   118  	finder := find.NewFinder(client.Client, true)
   119  
   120  	for _, rs := range s.RootModule().Resources {
   121  		if rs.Type != "vsphere_file" {
   122  			continue
   123  		}
   124  
   125  		dc, err := finder.Datacenter(context.TODO(), rs.Primary.Attributes["datacenter"])
   126  		if err != nil {
   127  			return fmt.Errorf("error %s", err)
   128  		}
   129  
   130  		finder = finder.SetDatacenter(dc)
   131  
   132  		ds, err := getDatastore(finder, rs.Primary.Attributes["datastore"])
   133  		if err != nil {
   134  			return fmt.Errorf("error %s", err)
   135  		}
   136  
   137  		_, err = ds.Stat(context.TODO(), rs.Primary.Attributes["destination_file"])
   138  		if err != nil {
   139  			switch e := err.(type) {
   140  			case object.DatastoreNoSuchFileError:
   141  				fmt.Printf("Expected error received: %s\n", e.Error())
   142  				return nil
   143  			default:
   144  				return err
   145  			}
   146  		} else {
   147  			return fmt.Errorf("File %s still exists", rs.Primary.Attributes["destination_file"])
   148  		}
   149  	}
   150  
   151  	return nil
   152  }
   153  
   154  func testAccCheckVSphereFileExists(n string, df string, exists bool) resource.TestCheckFunc {
   155  	return func(s *terraform.State) error {
   156  		rs, ok := s.RootModule().Resources[n]
   157  		if !ok {
   158  			return fmt.Errorf("Resource not found: %s", n)
   159  		}
   160  
   161  		if rs.Primary.ID == "" {
   162  			return fmt.Errorf("No ID is set")
   163  		}
   164  
   165  		client := testAccProvider.Meta().(*govmomi.Client)
   166  		finder := find.NewFinder(client.Client, true)
   167  
   168  		dc, err := finder.Datacenter(context.TODO(), rs.Primary.Attributes["datacenter"])
   169  		if err != nil {
   170  			return fmt.Errorf("error %s", err)
   171  		}
   172  		finder = finder.SetDatacenter(dc)
   173  
   174  		ds, err := getDatastore(finder, rs.Primary.Attributes["datastore"])
   175  		if err != nil {
   176  			return fmt.Errorf("error %s", err)
   177  		}
   178  
   179  		_, err = ds.Stat(context.TODO(), df)
   180  		if err != nil {
   181  			switch e := err.(type) {
   182  			case object.DatastoreNoSuchFileError:
   183  				if exists {
   184  					return fmt.Errorf("File does not exist: %s", e.Error())
   185  				}
   186  				fmt.Printf("Expected error received: %s\n", e.Error())
   187  				return nil
   188  			default:
   189  				return err
   190  			}
   191  		}
   192  		return nil
   193  	}
   194  }
   195  
   196  const testAccCheckVSphereFileConfig = `
   197  resource "vsphere_file" "%s" {
   198  	datacenter = "%s"
   199  	datastore = "%s"
   200  	source_file = "%s"
   201  	destination_file = "%s"
   202  }
   203  `