diff --git a/vsphere/helper_test.go b/vsphere/helper_test.go index beb520616..0fc317359 100644 --- a/vsphere/helper_test.go +++ b/vsphere/helper_test.go @@ -242,3 +242,35 @@ func testObjectHasTags(s *terraform.State, client *tags.RestClient, obj object.R return nil } + +// testGetDatastore gets the datastore at the supplied full address. This +// function works for multiple datastore resources (example: +// vsphere_nas_datastore and vsphere_vmfs_datastore), hence the need for the +// full resource address including the resource type. +func testGetDatastore(s *terraform.State, resAddr string) (*object.Datastore, error) { + vars, err := testClientVariablesForResource(s, resAddr) + if err != nil { + return nil, err + } + return datastoreFromID(vars.client, vars.resourceID) +} + +// testAccResourceVSphereDatastoreCheckTags is a check to ensure that the +// supplied datastore has had the tags that have been created with the supplied +// tag resource name attached. +// +// The full datastore resource address is needed as this functions across +// multiple datastore resource types. +func testAccResourceVSphereDatastoreCheckTags(dsResAddr, tagResName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + ds, err := testGetDatastore(s, dsResAddr) + if err != nil { + return err + } + tagsClient, err := testAccProvider.Meta().(*VSphereClient).TagsClient() + if err != nil { + return err + } + return testObjectHasTags(s, tagsClient, ds, tagResName) + } +} diff --git a/vsphere/resource_vsphere_nas_datastore.go b/vsphere/resource_vsphere_nas_datastore.go index eb2644322..38d1f8d4f 100644 --- a/vsphere/resource_vsphere_nas_datastore.go +++ b/vsphere/resource_vsphere_nas_datastore.go @@ -36,6 +36,9 @@ func resourceVSphereNasDatastore() *schema.Resource { mergeSchema(s, schemaHostNasVolumeSpec()) mergeSchema(s, schemaDatastoreSummary()) + // Add tags schema + s[vSphereTagAttributeKey] = tagsSchema() + return &schema.Resource{ Create: resourceVSphereNasDatastoreCreate, Read: resourceVSphereNasDatastoreRead, @@ -50,6 +53,14 @@ func resourceVSphereNasDatastore() *schema.Resource { func resourceVSphereNasDatastoreCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*VSphereClient).vimClient + + // Load up the tags client, which will validate a proper vCenter before + // attempting to proceed if we have tags defined. + tagsClient, err := tagsClientIfDefined(d, meta) + if err != nil { + return err + } + hosts := sliceInterfacesToStrings(d.Get("host_system_ids").(*schema.Set).List()) p := &nasDatastoreMountProcessor{ client: client, @@ -73,6 +84,13 @@ func resourceVSphereNasDatastoreCreate(d *schema.ResourceData, meta interface{}) } } + // Apply any pending tags now + if tagsClient != nil { + if err := processTagDiff(tagsClient, d, ds); err != nil { + return err + } + } + // Done return resourceVSphereNasDatastoreRead(d, meta) } @@ -113,11 +131,26 @@ func resourceVSphereNasDatastoreRead(d *schema.ResourceData, meta interface{}) e return err } + // Read tags if we have the ability to do so + if tagsClient, _ := meta.(*VSphereClient).TagsClient(); tagsClient != nil { + if err := readTagsForResoruce(tagsClient, ds, d); err != nil { + return err + } + } + return nil } func resourceVSphereNasDatastoreUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*VSphereClient).vimClient + + // Load up the tags client, which will validate a proper vCenter before + // attempting to proceed if we have tags defined. + tagsClient, err := tagsClientIfDefined(d, meta) + if err != nil { + return err + } + id := d.Id() ds, err := datastoreFromID(client, id) if err != nil { @@ -139,6 +172,13 @@ func resourceVSphereNasDatastoreUpdate(d *schema.ResourceData, meta interface{}) } } + // Apply any pending tags now + if tagsClient != nil { + if err := processTagDiff(tagsClient, d, ds); err != nil { + return err + } + } + // Process mount/unmount operations. o, n := d.GetChange("host_system_ids") diff --git a/vsphere/resource_vsphere_nas_datastore_test.go b/vsphere/resource_vsphere_nas_datastore_test.go index 4e0d577d0..4f45d1e91 100644 --- a/vsphere/resource_vsphere_nas_datastore_test.go +++ b/vsphere/resource_vsphere_nas_datastore_test.go @@ -183,6 +183,53 @@ func TestAccResourceVSphereNasDatastore(t *testing.T) { }, }, }, + { + "single tag", + resource.TestCase{ + PreCheck: func() { + testAccPreCheck(tp) + testAccResourceVSphereNasDatastorePreCheck(tp) + }, + Providers: testAccProviders, + CheckDestroy: testAccResourceVSphereNasDatastoreExists(false), + Steps: []resource.TestStep{ + { + Config: testAccResourceVSphereNasDatastoreConfigBasicTags(), + Check: resource.ComposeTestCheckFunc( + testAccResourceVSphereNasDatastoreExists(true), + testAccResourceVSphereDatastoreCheckTags("vsphere_nas_datastore.datastore", "terraform-test-tag"), + ), + }, + }, + }, + }, + { + "modify tags", + resource.TestCase{ + PreCheck: func() { + testAccPreCheck(tp) + testAccResourceVSphereNasDatastorePreCheck(tp) + }, + Providers: testAccProviders, + CheckDestroy: testAccResourceVSphereNasDatastoreExists(false), + Steps: []resource.TestStep{ + { + Config: testAccResourceVSphereNasDatastoreConfigBasicTags(), + Check: resource.ComposeTestCheckFunc( + testAccResourceVSphereNasDatastoreExists(true), + testAccResourceVSphereDatastoreCheckTags("vsphere_nas_datastore.datastore", "terraform-test-tag"), + ), + }, + { + Config: testAccResourceVSphereNasDatastoreConfigMultiTags(), + Check: resource.ComposeTestCheckFunc( + testAccResourceVSphereNasDatastoreExists(true), + testAccResourceVSphereDatastoreCheckTags("vsphere_nas_datastore.datastore", "terraform-test-tags-alt"), + ), + }, + }, + }, + }, { "import", resource.TestCase{ @@ -241,12 +288,7 @@ func testAccResourceVSphereNasDatastorePreCheck(t *testing.T) { func testAccResourceVSphereNasDatastoreExists(expected bool) resource.TestCheckFunc { return func(s *terraform.State) error { - vars, err := testClientVariablesForResource(s, "vsphere_nas_datastore.datastore") - if err != nil { - return err - } - - _, err = datastoreFromID(vars.client, vars.resourceID) + ds, err := testGetDatastore(s, "vsphere_nas_datastore.datastore") if err != nil { if isManagedObjectNotFoundError(err) && expected == false { // Expected missing @@ -255,7 +297,7 @@ func testAccResourceVSphereNasDatastoreExists(expected bool) resource.TestCheckF return err } if !expected { - return fmt.Errorf("expected datastore %s to be missing", vars.resourceID) + return fmt.Errorf("expected datastore %q to be missing", ds.Reference().Value) } return nil } @@ -263,12 +305,7 @@ func testAccResourceVSphereNasDatastoreExists(expected bool) resource.TestCheckF func testAccResourceVSphereNasDatastoreHasName(expected string) resource.TestCheckFunc { return func(s *terraform.State) error { - vars, err := testClientVariablesForResource(s, "vsphere_nas_datastore.datastore") - if err != nil { - return err - } - - ds, err := datastoreFromID(vars.client, vars.resourceID) + ds, err := testGetDatastore(s, "vsphere_nas_datastore.datastore") if err != nil { return err } @@ -288,12 +325,7 @@ func testAccResourceVSphereNasDatastoreHasName(expected string) resource.TestChe func testAccResourceVSphereNasDatastoreMatchInventoryPath(expected string) resource.TestCheckFunc { return func(s *terraform.State) error { - vars, err := testClientVariablesForResource(s, "vsphere_nas_datastore.datastore") - if err != nil { - return err - } - - ds, err := datastoreFromID(vars.client, vars.resourceID) + ds, err := testGetDatastore(s, "vsphere_nas_datastore.datastore") if err != nil { return err } @@ -452,3 +484,112 @@ resource "vsphere_nas_datastore" "datastore" { } `, os.Getenv("VSPHERE_NAS_HOST"), os.Getenv("VSPHERE_NFS_PATH"), os.Getenv("VSPHERE_DS_FOLDER"), os.Getenv("VSPHERE_DATACENTER"), os.Getenv("VSPHERE_ESXI_HOST")) } + +func testAccResourceVSphereNasDatastoreConfigBasicTags() string { + return fmt.Sprintf(` +variable "nfs_host" { + type = "string" + default = "%s" +} + +variable "nfs_path" { + type = "string" + default = "%s" +} + +data "vsphere_datacenter" "datacenter" { + name = "%s" +} + +data "vsphere_host" "esxi_host" { + name = "%s" + datacenter_id = "${data.vsphere_datacenter.datacenter.id}" +} + +resource "vsphere_tag_category" "terraform-test-category" { + name = "terraform-test-tag-category" + cardinality = "MULTIPLE" + + associable_types = [ + "Datastore", + ] +} + +resource "vsphere_tag" "terraform-test-tag" { + name = "terraform-test-tag" + category_id = "${vsphere_tag_category.terraform-test-category.id}" +} + +resource "vsphere_nas_datastore" "datastore" { + name = "terraform-test-nas" + host_system_ids = ["${data.vsphere_host.esxi_host.id}"] + + type = "NFS" + remote_hosts = ["${var.nfs_host}"] + remote_path = "${var.nfs_path}" + + tags = ["${vsphere_tag.terraform-test-tag.id}"] +} +`, os.Getenv("VSPHERE_NAS_HOST"), os.Getenv("VSPHERE_NFS_PATH"), os.Getenv("VSPHERE_DATACENTER"), os.Getenv("VSPHERE_ESXI_HOST")) +} + +func testAccResourceVSphereNasDatastoreConfigMultiTags() string { + return fmt.Sprintf(` +variable "nfs_host" { + type = "string" + default = "%s" +} + +variable "nfs_path" { + type = "string" + default = "%s" +} + +variable "extra_tags" { + default = [ + "terraform-test-thing1", + "terraform-test-thing2", + ] +} + +data "vsphere_datacenter" "datacenter" { + name = "%s" +} + +data "vsphere_host" "esxi_host" { + name = "%s" + datacenter_id = "${data.vsphere_datacenter.datacenter.id}" +} + +resource "vsphere_tag_category" "terraform-test-category" { + name = "terraform-test-tag-category" + cardinality = "MULTIPLE" + + associable_types = [ + "Datastore", + ] +} + +resource "vsphere_tag" "terraform-test-tag" { + name = "terraform-test-tag" + category_id = "${vsphere_tag_category.terraform-test-category.id}" +} + +resource "vsphere_tag" "terraform-test-tags-alt" { + count = "${length(var.extra_tags)}" + name = "${var.extra_tags[count.index]}" + category_id = "${vsphere_tag_category.terraform-test-category.id}" +} + +resource "vsphere_nas_datastore" "datastore" { + name = "terraform-test-nas" + host_system_ids = ["${data.vsphere_host.esxi_host.id}"] + + type = "NFS" + remote_hosts = ["${var.nfs_host}"] + remote_path = "${var.nfs_path}" + + tags = ["${vsphere_tag.terraform-test-tags-alt.*.id}"] +} +`, os.Getenv("VSPHERE_NAS_HOST"), os.Getenv("VSPHERE_NFS_PATH"), os.Getenv("VSPHERE_DATACENTER"), os.Getenv("VSPHERE_ESXI_HOST")) +} diff --git a/vsphere/resource_vsphere_vmfs_datastore.go b/vsphere/resource_vsphere_vmfs_datastore.go index bf47e9bab..482a96152 100644 --- a/vsphere/resource_vsphere_vmfs_datastore.go +++ b/vsphere/resource_vsphere_vmfs_datastore.go @@ -83,6 +83,10 @@ func resourceVSphereVmfsDatastore() *schema.Resource { }, } mergeSchema(s, schemaDatastoreSummary()) + + // Add tags schema + s[vSphereTagAttributeKey] = tagsSchema() + return &schema.Resource{ Create: resourceVSphereVmfsDatastoreCreate, Read: resourceVSphereVmfsDatastoreRead, @@ -97,6 +101,14 @@ func resourceVSphereVmfsDatastore() *schema.Resource { func resourceVSphereVmfsDatastoreCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*VSphereClient).vimClient + + // Load up the tags client, which will validate a proper vCenter before + // attempting to proceed if we have tags defined. + tagsClient, err := tagsClientIfDefined(d, meta) + if err != nil { + return err + } + hsID := d.Get("host_system_id").(string) dss, err := hostDatastoreSystemFromHostSystemID(client, hsID) if err != nil { @@ -134,6 +146,13 @@ func resourceVSphereVmfsDatastoreCreate(d *schema.ResourceData, meta interface{} } } + // Apply any pending tags now + if tagsClient != nil { + if err := processTagDiff(tagsClient, d, ds); err != nil { + return err + } + } + // Now add any remaining disks. for _, disk := range disks[1:] { spec, err := diskSpecForExtend(dss, ds, disk.(string)) @@ -197,11 +216,26 @@ func resourceVSphereVmfsDatastoreRead(d *schema.ResourceData, meta interface{}) return err } + // Read tags if we have the ability to do so + if tagsClient, _ := meta.(*VSphereClient).TagsClient(); tagsClient != nil { + if err := readTagsForResoruce(tagsClient, ds, d); err != nil { + return err + } + } + return nil } func resourceVSphereVmfsDatastoreUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*VSphereClient).vimClient + + // Load up the tags client, which will validate a proper vCenter before + // attempting to proceed if we have tags defined. + tagsClient, err := tagsClientIfDefined(d, meta) + if err != nil { + return err + } + hsID := d.Get("host_system_id").(string) dss, err := hostDatastoreSystemFromHostSystemID(client, hsID) if err != nil { @@ -229,6 +263,13 @@ func resourceVSphereVmfsDatastoreUpdate(d *schema.ResourceData, meta interface{} } } + // Apply any pending tags now + if tagsClient != nil { + if err := processTagDiff(tagsClient, d, ds); err != nil { + return err + } + } + // Veto this update if it means a disk was removed. Shrinking // datastores/removing extents is not supported. old, new := d.GetChange("disks") diff --git a/vsphere/resource_vsphere_vmfs_datastore_test.go b/vsphere/resource_vsphere_vmfs_datastore_test.go index 57df9b25e..31bf69cc2 100644 --- a/vsphere/resource_vsphere_vmfs_datastore_test.go +++ b/vsphere/resource_vsphere_vmfs_datastore_test.go @@ -177,32 +177,86 @@ func TestAccResourceVSphereVmfsDatastore(t *testing.T) { }, }, }, - // TODO: Re-enable this after ImportStateIdFunc is merged and we can vendor it cleanly. - // { - // "import", - // resource.TestCase{ - // PreCheck: func() { - // testAccPreCheck(tp) - // testAccResourceVSphereVmfsDatastorePreCheck(tp) - // }, - // Providers: testAccProviders, - // CheckDestroy: testAccResourceVSphereVmfsDatastoreExists(false), - // Steps: []resource.TestStep{ - // { - // Config: testAccResourceVSphereVmfsDatastoreConfigStaticSingle(), - // Check: resource.ComposeTestCheckFunc( - // testAccResourceVSphereVmfsDatastoreExists(true), - // ), - // }, - // { - // Config: testAccResourceVSphereVmfsDatastoreConfigStaticSingle(), - // ImportState: true, - // ResourceName: "vsphere_vmfs_datastore.datastore", - // ImportStateVerify: true, - // }, - // }, - // }, - // }, + { + "single tag", + resource.TestCase{ + PreCheck: func() { + testAccPreCheck(tp) + testAccResourceVSphereVmfsDatastorePreCheck(tp) + }, + Providers: testAccProviders, + CheckDestroy: testAccResourceVSphereVmfsDatastoreExists(false), + Steps: []resource.TestStep{ + { + Config: testAccResourceVSphereVmfsDatastoreConfigTags(), + Check: resource.ComposeTestCheckFunc( + testAccResourceVSphereVmfsDatastoreExists(true), + testAccResourceVSphereDatastoreCheckTags("vsphere_vmfs_datastore.datastore", "terraform-test-tag"), + ), + }, + }, + }, + }, + { + "modify tags", + resource.TestCase{ + PreCheck: func() { + testAccPreCheck(tp) + testAccResourceVSphereVmfsDatastorePreCheck(tp) + }, + Providers: testAccProviders, + CheckDestroy: testAccResourceVSphereVmfsDatastoreExists(false), + Steps: []resource.TestStep{ + { + Config: testAccResourceVSphereVmfsDatastoreConfigTags(), + Check: resource.ComposeTestCheckFunc( + testAccResourceVSphereVmfsDatastoreExists(true), + testAccResourceVSphereDatastoreCheckTags("vsphere_vmfs_datastore.datastore", "terraform-test-tag"), + ), + }, + { + Config: testAccResourceVSphereVmfsDatastoreConfigMultiTags(), + Check: resource.ComposeTestCheckFunc( + testAccResourceVSphereVmfsDatastoreExists(true), + testAccResourceVSphereDatastoreCheckTags("vsphere_vmfs_datastore.datastore", "terraform-test-tags-alt"), + ), + }, + }, + }, + }, + { + "import", + resource.TestCase{ + PreCheck: func() { + testAccPreCheck(tp) + testAccResourceVSphereVmfsDatastorePreCheck(tp) + }, + Providers: testAccProviders, + CheckDestroy: testAccResourceVSphereVmfsDatastoreExists(false), + Steps: []resource.TestStep{ + { + Config: testAccResourceVSphereVmfsDatastoreConfigStaticSingle(), + Check: resource.ComposeTestCheckFunc( + testAccResourceVSphereVmfsDatastoreExists(true), + ), + }, + { + Config: testAccResourceVSphereVmfsDatastoreConfigStaticSingle(), + ImportState: true, + ImportStateIdFunc: func(s *terraform.State) (string, error) { + vars, err := testClientVariablesForResource(s, "vsphere_vmfs_datastore.datastore") + if err != nil { + return "", err + } + + return fmt.Sprintf("%s:%s", vars.resourceID, vars.resourceAttributes["host_system_id"]), nil + }, + ResourceName: "vsphere_vmfs_datastore.datastore", + ImportStateVerify: true, + }, + }, + }, + }, } for _, tc := range testAccResourceVSphereVmfsDatastoreCases { @@ -236,12 +290,7 @@ func testAccResourceVSphereVmfsDatastorePreCheck(t *testing.T) { func testAccResourceVSphereVmfsDatastoreExists(expected bool) resource.TestCheckFunc { return func(s *terraform.State) error { - vars, err := testClientVariablesForResource(s, "vsphere_vmfs_datastore.datastore") - if err != nil { - return err - } - - _, err = datastoreFromID(vars.client, vars.resourceID) + ds, err := testGetDatastore(s, "vsphere_vmfs_datastore.datastore") if err != nil { if isManagedObjectNotFoundError(err) && expected == false { // Expected missing @@ -250,7 +299,7 @@ func testAccResourceVSphereVmfsDatastoreExists(expected bool) resource.TestCheck return err } if !expected { - return fmt.Errorf("expected datastore %s to be missing", vars.resourceID) + return fmt.Errorf("expected datastore %q to be missing", ds.Reference().Value) } return nil } @@ -258,12 +307,7 @@ func testAccResourceVSphereVmfsDatastoreExists(expected bool) resource.TestCheck func testAccResourceVSphereVmfsDatastoreHasName(expected string) resource.TestCheckFunc { return func(s *terraform.State) error { - vars, err := testClientVariablesForResource(s, "vsphere_vmfs_datastore.datastore") - if err != nil { - return err - } - - ds, err := datastoreFromID(vars.client, vars.resourceID) + ds, err := testGetDatastore(s, "vsphere_vmfs_datastore.datastore") if err != nil { return err } @@ -283,12 +327,7 @@ func testAccResourceVSphereVmfsDatastoreHasName(expected string) resource.TestCh func testAccResourceVSphereVmfsDatastoreMatchInventoryPath(expected string) resource.TestCheckFunc { return func(s *terraform.State) error { - vars, err := testClientVariablesForResource(s, "vsphere_vmfs_datastore.datastore") - if err != nil { - return err - } - - ds, err := datastoreFromID(vars.client, vars.resourceID) + ds, err := testGetDatastore(s, "vsphere_vmfs_datastore.datastore") if err != nil { return err } @@ -461,3 +500,102 @@ resource "vsphere_vmfs_datastore" "datastore" { } `, os.Getenv("VSPHERE_DS_VMFS_DISK0"), os.Getenv("VSPHERE_DS_FOLDER"), os.Getenv("VSPHERE_DATACENTER"), os.Getenv("VSPHERE_ESXI_HOST")) } + +func testAccResourceVSphereVmfsDatastoreConfigTags() string { + return fmt.Sprintf(` +variable "disk0" { + type = "string" + default = "%s" +} + +data "vsphere_datacenter" "datacenter" { + name = "%s" +} + +data "vsphere_host" "esxi_host" { + name = "%s" + datacenter_id = "${data.vsphere_datacenter.datacenter.id}" +} + +resource "vsphere_tag_category" "terraform-test-category" { + name = "terraform-test-tag-category" + cardinality = "MULTIPLE" + + associable_types = [ + "Datastore", + ] +} + +resource "vsphere_tag" "terraform-test-tag" { + name = "terraform-test-tag" + category_id = "${vsphere_tag_category.terraform-test-category.id}" +} + +resource "vsphere_vmfs_datastore" "datastore" { + name = "terraform-test" + host_system_id = "${data.vsphere_host.esxi_host.id}" + + disks = [ + "${var.disk0}", + ] + + tags = ["${vsphere_tag.terraform-test-tag.id}"] +} +`, os.Getenv("VSPHERE_DS_VMFS_DISK0"), os.Getenv("VSPHERE_DATACENTER"), os.Getenv("VSPHERE_ESXI_HOST")) +} + +func testAccResourceVSphereVmfsDatastoreConfigMultiTags() string { + return fmt.Sprintf(` +variable "disk0" { + type = "string" + default = "%s" +} + +variable "extra_tags" { + default = [ + "terraform-test-thing1", + "terraform-test-thing2", + ] +} + +data "vsphere_datacenter" "datacenter" { + name = "%s" +} + +data "vsphere_host" "esxi_host" { + name = "%s" + datacenter_id = "${data.vsphere_datacenter.datacenter.id}" +} + +resource "vsphere_tag_category" "terraform-test-category" { + name = "terraform-test-tag-category" + cardinality = "MULTIPLE" + + associable_types = [ + "Datastore", + ] +} + +resource "vsphere_tag" "terraform-test-tag" { + name = "terraform-test-tag" + category_id = "${vsphere_tag_category.terraform-test-category.id}" +} + +resource "vsphere_tag" "terraform-test-tags-alt" { + count = "${length(var.extra_tags)}" + name = "${var.extra_tags[count.index]}" + category_id = "${vsphere_tag_category.terraform-test-category.id}" +} + +resource "vsphere_vmfs_datastore" "datastore" { + name = "terraform-test" + host_system_id = "${data.vsphere_host.esxi_host.id}" + + disks = [ + "${var.disk0}", + ] + + tags = ["${vsphere_tag.terraform-test-tags-alt.*.id}"] +} +`, os.Getenv("VSPHERE_DS_VMFS_DISK0"), os.Getenv("VSPHERE_DATACENTER"), os.Getenv("VSPHERE_ESXI_HOST")) +} diff --git a/website/docs/r/nas_datastore.html.markdown b/website/docs/r/nas_datastore.html.markdown index ea8ee450d..922db6135 100644 --- a/website/docs/r/nas_datastore.html.markdown +++ b/website/docs/r/nas_datastore.html.markdown @@ -80,6 +80,14 @@ The following arguments are supported: * `security_type` - (String, optional, forces new resource) The security type to use when using NFS v4.1. Can be one of `AUTH_SYS`, `SEC_KRB5`, or `SEC_KRB5I`. +* `tags` - (List of strings, optional) The IDs of any tags to attach to this + resource. See [here][docs-applying-tags] for a reference on how to apply + tags. + +[docs-applying-tags]: /docs/providers/vsphere/r/tag.html#using-tags-in-a-supported-resource + +~> **NOTE:** Tagging support is unsupported on direct ESXi connections and +requires vCenter 6.0 or higher. ## Attribute Reference diff --git a/website/docs/r/vmfs_datastore.html.markdown b/website/docs/r/vmfs_datastore.html.markdown index d8a7ce513..ac36b4862 100644 --- a/website/docs/r/vmfs_datastore.html.markdown +++ b/website/docs/r/vmfs_datastore.html.markdown @@ -132,6 +132,15 @@ The following arguments are supported: datastore folder located at `/dc1/datastore/foo/bar`, with the final inventory path being `/dc1/datastore/foo/bar/terraform-test`. * `disks` - (List of strings, required) The disks to use with the datastore. +* `tags` - (List of strings, optional) The IDs of any tags to attach to this + resource. See [here][docs-applying-tags] for a reference on how to apply + tags. + +[docs-applying-tags]: /docs/providers/vsphere/r/tag.html#using-tags-in-a-supported-resource + +~> **NOTE:** Tagging support is unsupported on direct ESXi connections and +requires vCenter 6.0 or higher. + ## Attribute Reference