github.com/pmcatominey/terraform@v0.7.0-rc2.0.20160708105029-1401a52a5cc5/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 `