github.com/sathiyas/terraform@v0.6.9-0.20151210233947-3330da00b997/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  `