github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/vsphere/resource_vsphere_folder_test.go (about)

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