github.com/shvar/terraform@v0.6.9-0.20151215234924-3365cd2231df/builtin/providers/vsphere/resource_vsphere_folder_test.go (about) 1 package vsphere 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 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 top-level folder creation 18 func TestAccVSphereFolder_basic(t *testing.T) { 19 var f folder 20 datacenter := os.Getenv("VSPHERE_DATACENTER") 21 testMethod := "basic" 22 resourceName := "vsphere_folder." + testMethod 23 path := "tf_test_basic" 24 25 resource.Test(t, resource.TestCase{ 26 PreCheck: func() { testAccPreCheck(t) }, 27 Providers: testAccProviders, 28 CheckDestroy: testAccCheckVSphereFolderDestroy, 29 Steps: []resource.TestStep{ 30 resource.TestStep{ 31 Config: fmt.Sprintf( 32 testAccCheckVSphereFolderConfig, 33 testMethod, 34 path, 35 datacenter, 36 ), 37 Check: resource.ComposeTestCheckFunc( 38 testAccCheckVSphereFolderExists(resourceName, &f), 39 resource.TestCheckResourceAttr( 40 resourceName, "path", path), 41 resource.TestCheckResourceAttr( 42 resourceName, "existing_path", ""), 43 ), 44 }, 45 }, 46 }) 47 } 48 49 func TestAccVSphereFolder_nested(t *testing.T) { 50 51 var f folder 52 datacenter := os.Getenv("VSPHERE_DATACENTER") 53 testMethod := "nested" 54 resourceName := "vsphere_folder." + testMethod 55 path := "tf_test_nested/tf_test_folder" 56 57 resource.Test(t, resource.TestCase{ 58 PreCheck: func() { testAccPreCheck(t) }, 59 Providers: testAccProviders, 60 CheckDestroy: testAccCheckVSphereFolderDestroy, 61 Steps: []resource.TestStep{ 62 resource.TestStep{ 63 Config: fmt.Sprintf( 64 testAccCheckVSphereFolderConfig, 65 testMethod, 66 path, 67 datacenter, 68 ), 69 Check: resource.ComposeTestCheckFunc( 70 testAccCheckVSphereFolderExists(resourceName, &f), 71 resource.TestCheckResourceAttr( 72 resourceName, "path", path), 73 resource.TestCheckResourceAttr( 74 resourceName, "existing_path", ""), 75 ), 76 }, 77 }, 78 }) 79 } 80 81 func TestAccVSphereFolder_dontDeleteExisting(t *testing.T) { 82 83 var f folder 84 datacenter := os.Getenv("VSPHERE_DATACENTER") 85 testMethod := "dontDeleteExisting" 86 resourceName := "vsphere_folder." + testMethod 87 existingPath := "tf_test_dontDeleteExisting/tf_existing" 88 path := existingPath + "/tf_nested/tf_test" 89 90 resource.Test(t, resource.TestCase{ 91 PreCheck: func() { testAccPreCheck(t) }, 92 Providers: testAccProviders, 93 CheckDestroy: resource.ComposeTestCheckFunc( 94 assertVSphereFolderExists(datacenter, existingPath), 95 removeVSphereFolder(datacenter, existingPath, ""), 96 ), 97 Steps: []resource.TestStep{ 98 resource.TestStep{ 99 PreConfig: func() { 100 createVSphereFolder(datacenter, existingPath) 101 }, 102 Config: fmt.Sprintf( 103 testAccCheckVSphereFolderConfig, 104 testMethod, 105 path, 106 datacenter, 107 ), 108 Check: resource.ComposeTestCheckFunc( 109 testAccCheckVSphereFolderExistingPathExists(resourceName, &f), 110 resource.TestCheckResourceAttr( 111 resourceName, "path", path), 112 resource.TestCheckResourceAttr( 113 resourceName, "existing_path", existingPath), 114 ), 115 }, 116 }, 117 }) 118 } 119 120 func testAccCheckVSphereFolderDestroy(s *terraform.State) error { 121 client := testAccProvider.Meta().(*govmomi.Client) 122 finder := find.NewFinder(client.Client, true) 123 124 for _, rs := range s.RootModule().Resources { 125 if rs.Type != "vsphere_folder" { 126 continue 127 } 128 129 dc, err := finder.Datacenter(context.TODO(), rs.Primary.Attributes["datacenter"]) 130 if err != nil { 131 return fmt.Errorf("error %s", err) 132 } 133 134 dcFolders, err := dc.Folders(context.TODO()) 135 if err != nil { 136 return fmt.Errorf("error %s", err) 137 } 138 139 _, err = object.NewSearchIndex(client.Client).FindChild(context.TODO(), dcFolders.VmFolder, rs.Primary.Attributes["path"]) 140 if err == nil { 141 return fmt.Errorf("Record still exists") 142 } 143 } 144 145 return nil 146 } 147 148 func testAccCheckVSphereFolderExists(n string, f *folder) resource.TestCheckFunc { 149 return func(s *terraform.State) error { 150 rs, ok := s.RootModule().Resources[n] 151 if !ok { 152 return fmt.Errorf("Resource not found: %s", n) 153 } 154 155 if rs.Primary.ID == "" { 156 return fmt.Errorf("No ID is set") 157 } 158 159 client := testAccProvider.Meta().(*govmomi.Client) 160 finder := find.NewFinder(client.Client, true) 161 162 dc, err := finder.Datacenter(context.TODO(), rs.Primary.Attributes["datacenter"]) 163 if err != nil { 164 return fmt.Errorf("error %s", err) 165 } 166 167 dcFolders, err := dc.Folders(context.TODO()) 168 if err != nil { 169 return fmt.Errorf("error %s", err) 170 } 171 172 _, err = object.NewSearchIndex(client.Client).FindChild(context.TODO(), dcFolders.VmFolder, rs.Primary.Attributes["path"]) 173 174 175 *f = folder{ 176 path: rs.Primary.Attributes["path"], 177 } 178 179 return nil 180 } 181 } 182 183 func testAccCheckVSphereFolderExistingPathExists(n string, f *folder) resource.TestCheckFunc { 184 return func(s *terraform.State) error { 185 rs, ok := s.RootModule().Resources[n] 186 if !ok { 187 return fmt.Errorf("Resource %s not found in %#v", n, s.RootModule().Resources) 188 } 189 190 if rs.Primary.ID == "" { 191 return fmt.Errorf("No ID is set") 192 } 193 194 client := testAccProvider.Meta().(*govmomi.Client) 195 finder := find.NewFinder(client.Client, true) 196 197 dc, err := finder.Datacenter(context.TODO(), rs.Primary.Attributes["datacenter"]) 198 if err != nil { 199 return fmt.Errorf("error %s", err) 200 } 201 202 dcFolders, err := dc.Folders(context.TODO()) 203 if err != nil { 204 return fmt.Errorf("error %s", err) 205 } 206 207 _, err = object.NewSearchIndex(client.Client).FindChild(context.TODO(), dcFolders.VmFolder, rs.Primary.Attributes["existing_path"]) 208 209 210 *f = folder{ 211 path: rs.Primary.Attributes["path"], 212 } 213 214 return nil 215 } 216 } 217 218 func assertVSphereFolderExists(datacenter string, folder_name string) resource.TestCheckFunc { 219 220 return func(s *terraform.State) error { 221 client := testAccProvider.Meta().(*govmomi.Client) 222 folder, err := object.NewSearchIndex(client.Client).FindByInventoryPath( 223 context.TODO(), fmt.Sprintf("%v/vm/%v", datacenter, folder_name)) 224 if err != nil { 225 return fmt.Errorf("Error: %s", err) 226 } else if folder == nil { 227 return fmt.Errorf("Folder %s does not exist!", folder_name) 228 } 229 230 return nil 231 } 232 } 233 234 func createVSphereFolder(datacenter string, folder_name string) error { 235 236 client := testAccProvider.Meta().(*govmomi.Client) 237 238 f := folder{path: folder_name, datacenter: datacenter,} 239 240 folder, err := object.NewSearchIndex(client.Client).FindByInventoryPath( 241 context.TODO(), fmt.Sprintf("%v/vm/%v", datacenter, folder_name)) 242 if err != nil { 243 return fmt.Errorf("error %s", err) 244 } 245 246 if folder == nil { 247 createFolder(client, &f) 248 } else { 249 return fmt.Errorf("Folder %s already exists", folder_name) 250 } 251 252 return nil 253 } 254 255 func removeVSphereFolder(datacenter string, folder_name string, existing_path string) resource.TestCheckFunc { 256 257 f := folder{path: folder_name, datacenter: datacenter, existingPath: existing_path,} 258 259 return func(s *terraform.State) error { 260 261 client := testAccProvider.Meta().(*govmomi.Client) 262 // finder := find.NewFinder(client.Client, true) 263 264 folder, _ := object.NewSearchIndex(client.Client).FindByInventoryPath( 265 context.TODO(), fmt.Sprintf("%v/vm/%v", datacenter, folder_name)) 266 if folder != nil { 267 deleteFolder(client, &f) 268 } 269 270 return nil 271 } 272 } 273 274 const testAccCheckVSphereFolderConfig = ` 275 resource "vsphere_folder" "%s" { 276 path = "%s" 277 datacenter = "%s" 278 } 279 `