Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ var handwrittenDatasources = map[string]*schema.Resource{
"google_dataplex_data_quality_rules": dataplex.DataSourceDataplexDataQualityRules(),
"google_dataproc_metastore_service": dataprocmetastore.DataSourceDataprocMetastoreService(),
"google_datastream_static_ips": datastream.DataSourceGoogleDatastreamStaticIps(),
"google_discovery_engine_data_store": discoveryengine.DataSourceGoogleDiscoveryEngineDataStore(),
"google_discovery_engine_data_stores": discoveryengine.DataSourceGoogleDiscoveryEngineDataStores(),
"google_dns_keys": dns.DataSourceDNSKeys(),
"google_dns_managed_zone": dns.DataSourceDnsManagedZone(),
"google_dns_managed_zones": dns.DataSourceDnsManagedZones(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package discoveryengine

import (
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
)

func DataSourceGoogleDiscoveryEngineDataStore() *schema.Resource {
dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceDiscoveryEngineDataStore().Schema)

tpgresource.AddOptionalFieldsToSchema(dsSchema, "project", "location", "data_store_id", "display_name")
dsSchema["location"].Default = "global"

return &schema.Resource{
Read: dataSourceGoogleDiscoveryEngineDataStoreRead,
Schema: dsSchema,
}
}

func dataSourceGoogleDiscoveryEngineDataStoreRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}

project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for DataStore: %s", err)
}

location := d.Get("location").(string)

billingProject := project
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}

dataStoreId, hasId := d.GetOk("data_store_id")
displayName, hasName := d.GetOk("display_name")

if hasId == hasName {
return fmt.Errorf("Exactly one of 'data_store_id' or 'display_name' must be provided")
}

var res map[string]interface{}

if hasId {
url, err := tpgresource.ReplaceVars(d, config, "{{DiscoveryEngineBasePath}}projects/{{project}}/locations/{{location}}/collections/default_collection/dataStores/{{data_store_id}}")
if err != nil {
return err
}

res, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "GET",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
})
if err != nil {
return fmt.Errorf("Error reading DataStore %s/%s/%s: %s", project, location, dataStoreId, err)
}
} else {
// List all data stores and filter by display_name
listURL, err := tpgresource.ReplaceVars(d, config, "{{DiscoveryEngineBasePath}}projects/{{project}}/locations/{{location}}/collections/default_collection/dataStores")
if err != nil {
return err
}

var matches []map[string]interface{}
params := make(map[string]string)

for {
pageURL, err := transport_tpg.AddQueryParams(listURL, params)
if err != nil {
return err
}

listRes, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "GET",
Project: billingProject,
RawURL: pageURL,
UserAgent: userAgent,
})
if err != nil {
return fmt.Errorf("Error listing DataStores: %s", err)
}

if items, ok := listRes["dataStores"].([]interface{}); ok {
for _, item := range items {
ds := item.(map[string]interface{})
if ds["displayName"] == displayName {
matches = append(matches, ds)
}
}
}

pToken, ok := listRes["nextPageToken"]
if ok && pToken != nil && pToken.(string) != "" {
params["pageToken"] = pToken.(string)
} else {
break
}
}

if len(matches) == 0 {
return fmt.Errorf("No data store found with display name %q in project %q, location %q", displayName, project, location)
}
if len(matches) > 1 {
var ids []string
for _, m := range matches {
ids = append(ids, tpgresource.GetResourceNameFromSelfLink(m["name"].(string)))
}
return fmt.Errorf("Multiple data stores found with display name %q (IDs: %v). Use 'data_store_id' instead", displayName, ids)
}

res = matches[0]
}

resolvedId := tpgresource.GetResourceNameFromSelfLink(res["name"].(string))

if err := d.Set("project", project); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("data_store_id", resolvedId); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("name", flattenDiscoveryEngineDataStoreName(res["name"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("display_name", flattenDiscoveryEngineDataStoreDisplayName(res["displayName"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("industry_vertical", flattenDiscoveryEngineDataStoreIndustryVertical(res["industryVertical"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("solution_types", flattenDiscoveryEngineDataStoreSolutionTypes(res["solutionTypes"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("default_schema_id", flattenDiscoveryEngineDataStoreDefaultSchemaId(res["defaultSchemaId"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("content_config", flattenDiscoveryEngineDataStoreContentConfig(res["contentConfig"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("advanced_site_search_config", flattenDiscoveryEngineDataStoreAdvancedSiteSearchConfig(res["advancedSiteSearchConfig"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("document_processing_config", flattenDiscoveryEngineDataStoreDocumentProcessingConfig(res["documentProcessingConfig"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}
if err := d.Set("create_time", flattenDiscoveryEngineDataStoreCreateTime(res["createTime"], d, config)); err != nil {
return fmt.Errorf("Error reading DataStore: %s", err)
}

d.SetId(fmt.Sprintf("projects/%s/locations/%s/collections/default_collection/dataStores/%s", project, location, resolvedId))

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package discoveryengine_test

import (
"testing"

"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-provider-google/google/acctest"
)

func TestAccDataSourceGoogleDiscoveryEngineDataStore_basic(t *testing.T) {
t.Parallel()

context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
}

acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckDiscoveryEngineDataStoreDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccDataSourceGoogleDiscoveryEngineDataStore_basic(context),
Check: resource.ComposeTestCheckFunc(
acctest.CheckDataSourceStateMatchesResourceStateWithIgnores(
"data.google_discovery_engine_data_store.ds",
"google_discovery_engine_data_store.res",
[]string{
"create_advanced_site_search",
"skip_default_schema_creation",
},
),
),
},
},
})
}

func TestAccDataSourceGoogleDiscoveryEngineDataStore_byDisplayName(t *testing.T) {
t.Parallel()

context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
}

acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckDiscoveryEngineDataStoreDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccDataSourceGoogleDiscoveryEngineDataStore_byDisplayName(context),
Check: resource.ComposeTestCheckFunc(
acctest.CheckDataSourceStateMatchesResourceStateWithIgnores(
"data.google_discovery_engine_data_store.ds",
"google_discovery_engine_data_store.res",
[]string{
"create_advanced_site_search",
"skip_default_schema_creation",
},
),
),
},
},
})
}

func testAccDataSourceGoogleDiscoveryEngineDataStore_byDisplayName(context map[string]interface{}) string {
return acctest.Nprintf(`
resource "google_discovery_engine_data_store" "res" {
location = "global"
data_store_id = "tf-test-ds-name%{random_suffix}"
display_name = "tf-test-ds-byname%{random_suffix}"
industry_vertical = "GENERIC"
content_config = "NO_CONTENT"
solution_types = ["SOLUTION_TYPE_SEARCH"]
create_advanced_site_search = false
skip_default_schema_creation = false
}

data "google_discovery_engine_data_store" "ds" {
location = google_discovery_engine_data_store.res.location
display_name = google_discovery_engine_data_store.res.display_name
}
`, context)
}

func testAccDataSourceGoogleDiscoveryEngineDataStore_basic(context map[string]interface{}) string {
return acctest.Nprintf(`
resource "google_discovery_engine_data_store" "res" {
location = "global"
data_store_id = "tf-test-ds-id%{random_suffix}"
display_name = "tf-test-ds-datasource"
industry_vertical = "GENERIC"
content_config = "NO_CONTENT"
solution_types = ["SOLUTION_TYPE_SEARCH"]
create_advanced_site_search = false
skip_default_schema_creation = false
}

data "google_discovery_engine_data_store" "ds" {
location = google_discovery_engine_data_store.res.location
data_store_id = google_discovery_engine_data_store.res.data_store_id
}
`, context)
}
Loading
Loading