From 3a75f243688a0cf874dcad1cf6902b3cb1ba2b7a Mon Sep 17 00:00:00 2001 From: Sebastian Rosander Date: Wed, 25 Dec 2019 02:21:07 +0800 Subject: [PATCH 1/7] First commit --- .../resource_arm_cosmosdb_gremlin_database.go | 251 ++++++++++++++++++ ...urce_arm_cosmosdb_gremlin_database_test.go | 143 ++++++++++ 2 files changed, 394 insertions(+) create mode 100644 azurerm/resource_arm_cosmosdb_gremlin_database.go create mode 100644 azurerm/resource_arm_cosmosdb_gremlin_database_test.go diff --git a/azurerm/resource_arm_cosmosdb_gremlin_database.go b/azurerm/resource_arm_cosmosdb_gremlin_database.go new file mode 100644 index 000000000000..7410fb246b7b --- /dev/null +++ b/azurerm/resource_arm_cosmosdb_gremlin_database.go @@ -0,0 +1,251 @@ +package azurerm + +import ( + "fmt" + "log" + "strconv" + "time" + + "github.com/Azure/azure-sdk-for-go/services/cosmos-db/mgmt/2015-04-08/documentdb" + "github.com/hashicorp/go-azure-helpers/response" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/features" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func resourceArmCosmosGremlinDatabase() *schema.Resource { + return &schema.Resource{ + Create: resourceArmCosmosGremlinDatabaseCreate, + Update: resourceArmCosmosGremlinDatabaseUpdate, + Read: resourceArmCosmosGremlinDatabaseRead, + Delete: resourceArmCosmosGremlinDatabaseDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Read: schema.DefaultTimeout(5 * time.Minute), + Update: schema.DefaultTimeout(30 * time.Minute), + Delete: schema.DefaultTimeout(30 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.CosmosEntityName, + }, + + "resource_group_name": azure.SchemaResourceGroupName(), + + "account_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.CosmosAccountName, + }, + + "throughput": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + ValidateFunc: validate.CosmosThroughput, + }, + }, + } +} + +func resourceArmCosmosGremlinDatabaseCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d) + defer cancel() + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + account := d.Get("account_name").(string) + + if features.ShouldResourcesBeImported() { + existing, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + if !utils.ResponseWasNotFound(existing.Response) { + return fmt.Errorf("Error checking for presence of creating Gremlin Database %s (Account %s): %+v", name, account, err) + } + } else { + id, err := azure.CosmosGetIDFromResponse(existing.Response) + if err != nil { + return fmt.Errorf("Error generating import ID for Cosmos Gremlin Database '%s' (Account %s)", name, account) + } + + return tf.ImportAsExistsError("azurerm_cosmosdb_gremlin_database", id) + } + } + + db := documentdb.GremlinDatabaseCreateUpdateParameters{ + GremlinDatabaseCreateUpdateProperties: &documentdb.GremlinDatabaseCreateUpdateProperties{ + Resource: &documentdb.GremlinDatabaseResource{ + ID: &name, + }, + Options: map[string]*string{}, + }, + } + + if throughput, hasThroughput := d.GetOk("throughput"); hasThroughput { + db.GremlinDatabaseCreateUpdateProperties.Options = map[string]*string{ + "throughput": utils.String(strconv.Itoa(throughput.(int))), + } + } + + future, err := client.CreateUpdateGremlinDatabase(ctx, resourceGroup, account, name, db) + if err != nil { + return fmt.Errorf("Error issuing create/update request for Gremlin Database %s (Account %s): %+v", name, account, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting on create/update future for Cosmos Gremlin Database %s (Account %s): %+v", name, account, err) + } + + resp, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + return fmt.Errorf("Error making get request for Cosmos Gremlin Database %s (Account %s) ID: %v", name, account, err) + } + + id, err := azure.CosmosGetIDFromResponse(resp.Response) + if err != nil { + return fmt.Errorf("Error retrieving the ID for Cosmos Gremlin Database '%s' (Account %s) ID: %v", name, account, err) + } + d.SetId(id) + + return resourceArmCosmosGremlinDatabaseRead(d, meta) +} + +func resourceArmCosmosGremlinDatabaseUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseCosmosDatabaseID(d.Id()) + if err != nil { + return err + } + + db := documentdb.GremlinDatabaseCreateUpdateParameters{ + GremlinDatabaseCreateUpdateProperties: &documentdb.GremlinDatabaseCreateUpdateProperties{ + Resource: &documentdb.GremlinDatabaseResource{ + ID: &id.Database, + }, + Options: map[string]*string{}, + }, + } + + future, err := client.CreateUpdateGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database, db) + if err != nil { + return fmt.Errorf("Error issuing create/update request for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting on create/update future for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + if d.HasChange("throughput") { + throughputParameters := documentdb.ThroughputUpdateParameters{ + ThroughputUpdateProperties: &documentdb.ThroughputUpdateProperties{ + Resource: &documentdb.ThroughputResource{ + Throughput: utils.Int32(int32(d.Get("throughput").(int))), + }, + }, + } + + throughputFuture, err := client.UpdateGremlinDatabaseThroughput(ctx, id.ResourceGroup, id.Account, id.Database, throughputParameters) + if err != nil { + if response.WasNotFound(throughputFuture.Response()) { + return fmt.Errorf("Error setting Throughput for Cosmos Gremlin Database %s (Account %s): %+v - "+ + "If the collection has not been created with and initial throughput, you cannot configure it later.", id.Database, id.Account, err) + } + } + + if err = throughputFuture.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting on ThroughputUpdate future for Cosmos Gremlin Database %s (Account %s, Database %s): %+v", id.Database, id.Account, id.Database, err) + } + } + + _, err = client.GetGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + return fmt.Errorf("Error making get request for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + return resourceArmCosmosGremlinDatabaseRead(d, meta) +} + +func resourceArmCosmosGremlinDatabaseRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseCosmosDatabaseID(d.Id()) + if err != nil { + return err + } + + resp, err := client.GetGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Error reading Cosmos Gremlin Database %s (Account %s) - removing from state", id.Database, id.Account) + d.SetId("") + return nil + } + + return fmt.Errorf("Error reading Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + d.Set("resource_group_name", id.ResourceGroup) + d.Set("account_name", id.Account) + if props := resp.GremlinDatabaseProperties; props != nil { + d.Set("name", props.ID) + } + + throughputResp, err := client.GetGremlinDatabaseThroughput(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + if !utils.ResponseWasNotFound(throughputResp.Response) { + return fmt.Errorf("Error reading Throughput on Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } else { + d.Set("throughput", nil) + } + } else { + d.Set("throughput", throughputResp.Throughput) + } + + return nil +} + +func resourceArmCosmosGremlinDatabaseDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseCosmosDatabaseID(d.Id()) + if err != nil { + return err + } + + future, err := client.DeleteGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error deleting Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + } + + err = future.WaitForCompletionRef(ctx, client.Client) + if err != nil { + return fmt.Errorf("Error waiting on delete future for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + return nil +} diff --git a/azurerm/resource_arm_cosmosdb_gremlin_database_test.go b/azurerm/resource_arm_cosmosdb_gremlin_database_test.go new file mode 100644 index 000000000000..d3b7a115955b --- /dev/null +++ b/azurerm/resource_arm_cosmosdb_gremlin_database_test.go @@ -0,0 +1,143 @@ +package azurerm + +import ( + "fmt" + "net/http" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func TestAccAzureRMCosmosGremlinDatabase_basic(t *testing.T) { + ri := tf.AccRandTimeInt() + resourceName := "azurerm_cosmosdb_gremlin_database.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMCosmosGremlinDatabase_basic(ri, acceptance.Location()), + Check: resource.ComposeAggregateTestCheckFunc( + testCheckAzureRMCosmosGremlinDatabaseExists(resourceName), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccAzureRMCosmosGremlinDatabase_complete(t *testing.T) { + ri := tf.AccRandTimeInt() + resourceName := "azurerm_cosmosdb_gremlin_database.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMCosmosGremlinDatabase_complete(ri, acceptance.Location()), + Check: resource.ComposeAggregateTestCheckFunc( + testCheckAzureRMCosmosGremlinDatabaseExists(resourceName), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testCheckAzureRMCosmosGremlinDatabaseDestroy(s *terraform.State) error { + client := acceptance.AzureProvider.Meta().(*clients.Client).Cosmos.DatabaseClient + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_cosmosdb_gremlin_database" { + continue + } + + name := rs.Primary.Attributes["name"] + account := rs.Primary.Attributes["account_name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + resp, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Error chacking destroy for Cosmos Gremlin Database %s (Account %s) still exists:\n%v", name, account, err) + } + } + + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Cosmos Gremlin Database %s (Account %s): still exist:\n%#v", name, account, resp) + } + } + + return nil +} + +func testCheckAzureRMCosmosGremlinDatabaseExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + client := acceptance.AzureProvider.Meta().(*clients.Client).Cosmos.DatabaseClient + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext + + // Ensure we have enough information in state to look up in API + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + account := rs.Primary.Attributes["account_name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + resp, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + return fmt.Errorf("Bad: Get on cosmosAccountsClient: %+v", err) + } + + if resp.StatusCode == http.StatusNotFound { + return fmt.Errorf("Bad: Cosmos database '%s' (Account: '%s') does not exist", name, account) + } + + return nil + } +} + +func testAccAzureRMCosmosGremlinDatabase_basic(rInt int, location string) string { + return fmt.Sprintf(` + %[1]s + + resource "azurerm_cosmosdb_gremlin_database" "test" { + name = "acctest-%[2]d" + resource_group_name = "${azurerm_cosmosdb_account.test.resource_group_name}" + account_name = "${azurerm_cosmosdb_account.test.name}" + } + `, testAccAzureRMCosmosDBAccount_capabilityGremlin(rInt, location), rInt) +} + +func testAccAzureRMCosmosGremlinDatabase_complete(rInt int, location string) string { + return fmt.Sprintf(` + %[1]s + + resource "azurerm_cosmosdb_gremlin_database" "test" { + name = "acctest-%[2]d" + resource_group_name = "${azurerm_cosmosdb_account.test.resource_group_name}" + account_name = "${azurerm_cosmosdb_account.test.name}" + throughput = 700 + } + `, testAccAzureRMCosmosDBAccount_capabilityGremlin(rInt, location), rInt) +} From e30d4285afac82505c85bbb03601f64bcb38df7e Mon Sep 17 00:00:00 2001 From: Sebastian Rosander Date: Wed, 25 Dec 2019 10:02:43 +0800 Subject: [PATCH 2/7] Added resource to provider and runned all passing test --- azurerm/provider.go | 1 + 1 file changed, 1 insertion(+) diff --git a/azurerm/provider.go b/azurerm/provider.go index d83effdfe1b5..077c6ab8777c 100644 --- a/azurerm/provider.go +++ b/azurerm/provider.go @@ -208,6 +208,7 @@ func Provider() terraform.ResourceProvider { "azurerm_cosmosdb_sql_container": resourceArmCosmosDbSQLContainer(), "azurerm_cosmosdb_sql_database": resourceArmCosmosDbSQLDatabase(), "azurerm_cosmosdb_table": resourceArmCosmosDbTable(), + "azurerm_cosmosdb_gremlin_database": resourceArmCosmosGremlinDatabase(), "azurerm_dashboard": resourceArmDashboard(), "azurerm_data_factory": resourceArmDataFactory(), "azurerm_data_factory_dataset_mysql": resourceArmDataFactoryDatasetMySQL(), From 45d57951e7fabafdc643bfe6138a63bcc4b6b445 Mon Sep 17 00:00:00 2001 From: Sebastian Rosander Date: Wed, 25 Dec 2019 21:49:00 +0800 Subject: [PATCH 3/7] Added documentation for cosmosdb_gremlin_database --- .../r/cosmosdb_gremlin_database.html.markdown | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 website/docs/r/cosmosdb_gremlin_database.html.markdown diff --git a/website/docs/r/cosmosdb_gremlin_database.html.markdown b/website/docs/r/cosmosdb_gremlin_database.html.markdown new file mode 100644 index 000000000000..8141c720b3b1 --- /dev/null +++ b/website/docs/r/cosmosdb_gremlin_database.html.markdown @@ -0,0 +1,55 @@ +--- +subcategory: "CosmosDB (DocumentDB)" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_cosmosdb_gremlin_database" +sidebar_current: "docs-azurerm-resource-cosmosdb-gremlin-database" +description: |- + Manages a Gremlin Database within a Cosmos DB Account. +--- + +# azurerm_cosmosdb_gremlin_database + +Manages a Gremlin Database within a Cosmos DB Account. + +## Example Usage + +```hcl +data "azurerm_cosmosdb_account" "example" { + name = "tfex-cosmosdb-account" + resource_group_name = "tfex-cosmosdb-account-rg" +} + +resource "azurerm_cosmosdb_gremlin_database" "example" { + name = "tfex-cosmos-gremlin-db" + resource_group_name = "${data.azurerm_cosmosdb_account.example.resource_group_name}" + account_name = "${data.azurerm_cosmosdb_account.example.name}" + throughput = 400 +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) Specifies the name of the Cosmos DB Gremlin Database. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group in which the Cosmos DB Gremlin Database is created. Changing this forces a new resource to be created. + +* `account_name` - (Required) The name of the CosmosDB Account to create the Gremlin Database within. Changing this forces a new resource to be created. + +* `throughput` - (Optional) The throughput of the Gremlin database (RU/s). Must be set in increments of `100`. The minimum value is `400`. This must be set upon database creation otherwise it cannot be updated without a manual terraform destroy-apply. + + +## Attributes Reference + +The following attributes are exported: + +* `id` - the Cosmos DB Gremlin Database ID. + +## Import + +Cosmos Mongo Database can be imported using the `resource id`, e.g. + +```shell +terraform import azurerm_cosmosdb_gremlin_database.db1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg1/providers/Microsoft.DocumentDB/databaseAccounts/account1/apis/gremlin/databases/db1 +``` From 26f4735771439a066076f32a961a5569225bba66 Mon Sep 17 00:00:00 2001 From: Sebastian Rosander Date: Wed, 25 Dec 2019 02:21:07 +0800 Subject: [PATCH 4/7] First commit --- .../resource_arm_cosmosdb_gremlin_database.go | 251 ++++++++++++++++++ ...urce_arm_cosmosdb_gremlin_database_test.go | 143 ++++++++++ 2 files changed, 394 insertions(+) create mode 100644 azurerm/resource_arm_cosmosdb_gremlin_database.go create mode 100644 azurerm/resource_arm_cosmosdb_gremlin_database_test.go diff --git a/azurerm/resource_arm_cosmosdb_gremlin_database.go b/azurerm/resource_arm_cosmosdb_gremlin_database.go new file mode 100644 index 000000000000..7410fb246b7b --- /dev/null +++ b/azurerm/resource_arm_cosmosdb_gremlin_database.go @@ -0,0 +1,251 @@ +package azurerm + +import ( + "fmt" + "log" + "strconv" + "time" + + "github.com/Azure/azure-sdk-for-go/services/cosmos-db/mgmt/2015-04-08/documentdb" + "github.com/hashicorp/go-azure-helpers/response" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/features" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func resourceArmCosmosGremlinDatabase() *schema.Resource { + return &schema.Resource{ + Create: resourceArmCosmosGremlinDatabaseCreate, + Update: resourceArmCosmosGremlinDatabaseUpdate, + Read: resourceArmCosmosGremlinDatabaseRead, + Delete: resourceArmCosmosGremlinDatabaseDelete, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Read: schema.DefaultTimeout(5 * time.Minute), + Update: schema.DefaultTimeout(30 * time.Minute), + Delete: schema.DefaultTimeout(30 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.CosmosEntityName, + }, + + "resource_group_name": azure.SchemaResourceGroupName(), + + "account_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.CosmosAccountName, + }, + + "throughput": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + ValidateFunc: validate.CosmosThroughput, + }, + }, + } +} + +func resourceArmCosmosGremlinDatabaseCreate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d) + defer cancel() + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + account := d.Get("account_name").(string) + + if features.ShouldResourcesBeImported() { + existing, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + if !utils.ResponseWasNotFound(existing.Response) { + return fmt.Errorf("Error checking for presence of creating Gremlin Database %s (Account %s): %+v", name, account, err) + } + } else { + id, err := azure.CosmosGetIDFromResponse(existing.Response) + if err != nil { + return fmt.Errorf("Error generating import ID for Cosmos Gremlin Database '%s' (Account %s)", name, account) + } + + return tf.ImportAsExistsError("azurerm_cosmosdb_gremlin_database", id) + } + } + + db := documentdb.GremlinDatabaseCreateUpdateParameters{ + GremlinDatabaseCreateUpdateProperties: &documentdb.GremlinDatabaseCreateUpdateProperties{ + Resource: &documentdb.GremlinDatabaseResource{ + ID: &name, + }, + Options: map[string]*string{}, + }, + } + + if throughput, hasThroughput := d.GetOk("throughput"); hasThroughput { + db.GremlinDatabaseCreateUpdateProperties.Options = map[string]*string{ + "throughput": utils.String(strconv.Itoa(throughput.(int))), + } + } + + future, err := client.CreateUpdateGremlinDatabase(ctx, resourceGroup, account, name, db) + if err != nil { + return fmt.Errorf("Error issuing create/update request for Gremlin Database %s (Account %s): %+v", name, account, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting on create/update future for Cosmos Gremlin Database %s (Account %s): %+v", name, account, err) + } + + resp, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + return fmt.Errorf("Error making get request for Cosmos Gremlin Database %s (Account %s) ID: %v", name, account, err) + } + + id, err := azure.CosmosGetIDFromResponse(resp.Response) + if err != nil { + return fmt.Errorf("Error retrieving the ID for Cosmos Gremlin Database '%s' (Account %s) ID: %v", name, account, err) + } + d.SetId(id) + + return resourceArmCosmosGremlinDatabaseRead(d, meta) +} + +func resourceArmCosmosGremlinDatabaseUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseCosmosDatabaseID(d.Id()) + if err != nil { + return err + } + + db := documentdb.GremlinDatabaseCreateUpdateParameters{ + GremlinDatabaseCreateUpdateProperties: &documentdb.GremlinDatabaseCreateUpdateProperties{ + Resource: &documentdb.GremlinDatabaseResource{ + ID: &id.Database, + }, + Options: map[string]*string{}, + }, + } + + future, err := client.CreateUpdateGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database, db) + if err != nil { + return fmt.Errorf("Error issuing create/update request for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting on create/update future for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + if d.HasChange("throughput") { + throughputParameters := documentdb.ThroughputUpdateParameters{ + ThroughputUpdateProperties: &documentdb.ThroughputUpdateProperties{ + Resource: &documentdb.ThroughputResource{ + Throughput: utils.Int32(int32(d.Get("throughput").(int))), + }, + }, + } + + throughputFuture, err := client.UpdateGremlinDatabaseThroughput(ctx, id.ResourceGroup, id.Account, id.Database, throughputParameters) + if err != nil { + if response.WasNotFound(throughputFuture.Response()) { + return fmt.Errorf("Error setting Throughput for Cosmos Gremlin Database %s (Account %s): %+v - "+ + "If the collection has not been created with and initial throughput, you cannot configure it later.", id.Database, id.Account, err) + } + } + + if err = throughputFuture.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("Error waiting on ThroughputUpdate future for Cosmos Gremlin Database %s (Account %s, Database %s): %+v", id.Database, id.Account, id.Database, err) + } + } + + _, err = client.GetGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + return fmt.Errorf("Error making get request for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + return resourceArmCosmosGremlinDatabaseRead(d, meta) +} + +func resourceArmCosmosGremlinDatabaseRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseCosmosDatabaseID(d.Id()) + if err != nil { + return err + } + + resp, err := client.GetGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] Error reading Cosmos Gremlin Database %s (Account %s) - removing from state", id.Database, id.Account) + d.SetId("") + return nil + } + + return fmt.Errorf("Error reading Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + d.Set("resource_group_name", id.ResourceGroup) + d.Set("account_name", id.Account) + if props := resp.GremlinDatabaseProperties; props != nil { + d.Set("name", props.ID) + } + + throughputResp, err := client.GetGremlinDatabaseThroughput(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + if !utils.ResponseWasNotFound(throughputResp.Response) { + return fmt.Errorf("Error reading Throughput on Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } else { + d.Set("throughput", nil) + } + } else { + d.Set("throughput", throughputResp.Throughput) + } + + return nil +} + +func resourceArmCosmosGremlinDatabaseDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.DatabaseClient + ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseCosmosDatabaseID(d.Id()) + if err != nil { + return err + } + + future, err := client.DeleteGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database) + if err != nil { + if !response.WasNotFound(future.Response()) { + return fmt.Errorf("Error deleting Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + } + + err = future.WaitForCompletionRef(ctx, client.Client) + if err != nil { + return fmt.Errorf("Error waiting on delete future for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) + } + + return nil +} diff --git a/azurerm/resource_arm_cosmosdb_gremlin_database_test.go b/azurerm/resource_arm_cosmosdb_gremlin_database_test.go new file mode 100644 index 000000000000..d3b7a115955b --- /dev/null +++ b/azurerm/resource_arm_cosmosdb_gremlin_database_test.go @@ -0,0 +1,143 @@ +package azurerm + +import ( + "fmt" + "net/http" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func TestAccAzureRMCosmosGremlinDatabase_basic(t *testing.T) { + ri := tf.AccRandTimeInt() + resourceName := "azurerm_cosmosdb_gremlin_database.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMCosmosGremlinDatabase_basic(ri, acceptance.Location()), + Check: resource.ComposeAggregateTestCheckFunc( + testCheckAzureRMCosmosGremlinDatabaseExists(resourceName), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccAzureRMCosmosGremlinDatabase_complete(t *testing.T) { + ri := tf.AccRandTimeInt() + resourceName := "azurerm_cosmosdb_gremlin_database.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMCosmosGremlinDatabase_complete(ri, acceptance.Location()), + Check: resource.ComposeAggregateTestCheckFunc( + testCheckAzureRMCosmosGremlinDatabaseExists(resourceName), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testCheckAzureRMCosmosGremlinDatabaseDestroy(s *terraform.State) error { + client := acceptance.AzureProvider.Meta().(*clients.Client).Cosmos.DatabaseClient + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_cosmosdb_gremlin_database" { + continue + } + + name := rs.Primary.Attributes["name"] + account := rs.Primary.Attributes["account_name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + resp, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: Error chacking destroy for Cosmos Gremlin Database %s (Account %s) still exists:\n%v", name, account, err) + } + } + + if !utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Cosmos Gremlin Database %s (Account %s): still exist:\n%#v", name, account, resp) + } + } + + return nil +} + +func testCheckAzureRMCosmosGremlinDatabaseExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + client := acceptance.AzureProvider.Meta().(*clients.Client).Cosmos.DatabaseClient + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext + + // Ensure we have enough information in state to look up in API + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Not found: %s", resourceName) + } + + name := rs.Primary.Attributes["name"] + account := rs.Primary.Attributes["account_name"] + resourceGroup := rs.Primary.Attributes["resource_group_name"] + + resp, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) + if err != nil { + return fmt.Errorf("Bad: Get on cosmosAccountsClient: %+v", err) + } + + if resp.StatusCode == http.StatusNotFound { + return fmt.Errorf("Bad: Cosmos database '%s' (Account: '%s') does not exist", name, account) + } + + return nil + } +} + +func testAccAzureRMCosmosGremlinDatabase_basic(rInt int, location string) string { + return fmt.Sprintf(` + %[1]s + + resource "azurerm_cosmosdb_gremlin_database" "test" { + name = "acctest-%[2]d" + resource_group_name = "${azurerm_cosmosdb_account.test.resource_group_name}" + account_name = "${azurerm_cosmosdb_account.test.name}" + } + `, testAccAzureRMCosmosDBAccount_capabilityGremlin(rInt, location), rInt) +} + +func testAccAzureRMCosmosGremlinDatabase_complete(rInt int, location string) string { + return fmt.Sprintf(` + %[1]s + + resource "azurerm_cosmosdb_gremlin_database" "test" { + name = "acctest-%[2]d" + resource_group_name = "${azurerm_cosmosdb_account.test.resource_group_name}" + account_name = "${azurerm_cosmosdb_account.test.name}" + throughput = 700 + } + `, testAccAzureRMCosmosDBAccount_capabilityGremlin(rInt, location), rInt) +} From b7e05a770f4028895f2e47edc43b5f7045023eec Mon Sep 17 00:00:00 2001 From: Sebastian Rosander Date: Wed, 25 Dec 2019 23:42:27 +0800 Subject: [PATCH 5/7] Rebase 'n' Fixes --- .../internal/services/cosmos/registration.go | 3 +- .../resource_arm_cosmosdb_gremlin_database.go | 2 +- ...urce_arm_cosmosdb_gremlin_database_test.go | 39 +++++++------------ 3 files changed, 17 insertions(+), 27 deletions(-) rename azurerm/{ => internal/services/cosmos}/resource_arm_cosmosdb_gremlin_database.go (99%) rename azurerm/{ => internal/services/cosmos/tests}/resource_arm_cosmosdb_gremlin_database_test.go (75%) diff --git a/azurerm/internal/services/cosmos/registration.go b/azurerm/internal/services/cosmos/registration.go index ee333431573f..36fe1c1af498 100644 --- a/azurerm/internal/services/cosmos/registration.go +++ b/azurerm/internal/services/cosmos/registration.go @@ -27,5 +27,6 @@ func (r Registration) SupportedResources() map[string]*schema.Resource { "azurerm_cosmosdb_mongo_database": resourceArmCosmosDbMongoDatabase(), "azurerm_cosmosdb_sql_container": resourceArmCosmosDbSQLContainer(), "azurerm_cosmosdb_sql_database": resourceArmCosmosDbSQLDatabase(), - "azurerm_cosmosdb_table": resourceArmCosmosDbTable()} + "azurerm_cosmosdb_table": resourceArmCosmosDbTable(), + "azurerm_cosmosdb_gremlin_database": resourceArmCosmosGremlinDatabase()} } diff --git a/azurerm/resource_arm_cosmosdb_gremlin_database.go b/azurerm/internal/services/cosmos/resource_arm_cosmosdb_gremlin_database.go similarity index 99% rename from azurerm/resource_arm_cosmosdb_gremlin_database.go rename to azurerm/internal/services/cosmos/resource_arm_cosmosdb_gremlin_database.go index 7410fb246b7b..631910b4cf7a 100644 --- a/azurerm/resource_arm_cosmosdb_gremlin_database.go +++ b/azurerm/internal/services/cosmos/resource_arm_cosmosdb_gremlin_database.go @@ -1,4 +1,4 @@ -package azurerm +package cosmos import ( "fmt" diff --git a/azurerm/resource_arm_cosmosdb_gremlin_database_test.go b/azurerm/internal/services/cosmos/tests/resource_arm_cosmosdb_gremlin_database_test.go similarity index 75% rename from azurerm/resource_arm_cosmosdb_gremlin_database_test.go rename to azurerm/internal/services/cosmos/tests/resource_arm_cosmosdb_gremlin_database_test.go index d3b7a115955b..e9cd77f8a14e 100644 --- a/azurerm/resource_arm_cosmosdb_gremlin_database_test.go +++ b/azurerm/internal/services/cosmos/tests/resource_arm_cosmosdb_gremlin_database_test.go @@ -1,4 +1,4 @@ -package azurerm +package tests import ( "fmt" @@ -7,15 +7,13 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) func TestAccAzureRMCosmosGremlinDatabase_basic(t *testing.T) { - ri := tf.AccRandTimeInt() - resourceName := "azurerm_cosmosdb_gremlin_database.test" + data := acceptance.BuildTestData(t, "azurerm_cosmosdb_gremlin_database", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, @@ -23,23 +21,18 @@ func TestAccAzureRMCosmosGremlinDatabase_basic(t *testing.T) { CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMCosmosGremlinDatabase_basic(ri, acceptance.Location()), + Config: testAccAzureRMCosmosGremlinDatabase_basic(data), Check: resource.ComposeAggregateTestCheckFunc( - testCheckAzureRMCosmosGremlinDatabaseExists(resourceName), + testCheckAzureRMCosmosGremlinDatabaseExists(data.ResourceName), ), }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, + data.ImportStep(), }, }) } func TestAccAzureRMCosmosGremlinDatabase_complete(t *testing.T) { - ri := tf.AccRandTimeInt() - resourceName := "azurerm_cosmosdb_gremlin_database.test" + data := acceptance.BuildTestData(t, "azurerm_cosmosdb_gremlin_database", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, @@ -47,16 +40,12 @@ func TestAccAzureRMCosmosGremlinDatabase_complete(t *testing.T) { CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMCosmosGremlinDatabase_complete(ri, acceptance.Location()), + Config: testAccAzureRMCosmosGremlinDatabase_complete(data), Check: resource.ComposeAggregateTestCheckFunc( - testCheckAzureRMCosmosGremlinDatabaseExists(resourceName), + testCheckAzureRMCosmosGremlinDatabaseExists(data.ResourceName), ), }, - { - ResourceName: resourceName, - ImportState: true, - ImportStateVerify: true, - }, + data.ImportStep(), }, }) } @@ -77,7 +66,7 @@ func testCheckAzureRMCosmosGremlinDatabaseDestroy(s *terraform.State) error { resp, err := client.GetGremlinDatabase(ctx, resourceGroup, account, name) if err != nil { if !utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: Error chacking destroy for Cosmos Gremlin Database %s (Account %s) still exists:\n%v", name, account, err) + return fmt.Errorf("Bad: Error checking destroy for Cosmos Gremlin Database %s (Account %s) still exists:\n%v", name, account, err) } } @@ -117,7 +106,7 @@ func testCheckAzureRMCosmosGremlinDatabaseExists(resourceName string) resource.T } } -func testAccAzureRMCosmosGremlinDatabase_basic(rInt int, location string) string { +func testAccAzureRMCosmosGremlinDatabase_basic(data acceptance.TestData) string { return fmt.Sprintf(` %[1]s @@ -126,10 +115,10 @@ func testAccAzureRMCosmosGremlinDatabase_basic(rInt int, location string) string resource_group_name = "${azurerm_cosmosdb_account.test.resource_group_name}" account_name = "${azurerm_cosmosdb_account.test.name}" } - `, testAccAzureRMCosmosDBAccount_capabilityGremlin(rInt, location), rInt) + `, testAccAzureRMCosmosDBAccount_capabilityGremlin(data), data.RandomInteger) } -func testAccAzureRMCosmosGremlinDatabase_complete(rInt int, location string) string { +func testAccAzureRMCosmosGremlinDatabase_complete(data acceptance.TestData) string { return fmt.Sprintf(` %[1]s @@ -139,5 +128,5 @@ func testAccAzureRMCosmosGremlinDatabase_complete(rInt int, location string) str account_name = "${azurerm_cosmosdb_account.test.name}" throughput = 700 } - `, testAccAzureRMCosmosDBAccount_capabilityGremlin(rInt, location), rInt) + `, testAccAzureRMCosmosDBAccount_capabilityGremlin(data), data.RandomInteger) } From 68dd98edf219576f4da62365e16f3b106ae810e8 Mon Sep 17 00:00:00 2001 From: Sebastian Rosander Date: Wed, 25 Dec 2019 21:49:00 +0800 Subject: [PATCH 6/7] Added documentation for cosmosdb_gremlin_database --- .../r/cosmosdb_gremlin_database.html.markdown | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 website/docs/r/cosmosdb_gremlin_database.html.markdown diff --git a/website/docs/r/cosmosdb_gremlin_database.html.markdown b/website/docs/r/cosmosdb_gremlin_database.html.markdown new file mode 100644 index 000000000000..8141c720b3b1 --- /dev/null +++ b/website/docs/r/cosmosdb_gremlin_database.html.markdown @@ -0,0 +1,55 @@ +--- +subcategory: "CosmosDB (DocumentDB)" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_cosmosdb_gremlin_database" +sidebar_current: "docs-azurerm-resource-cosmosdb-gremlin-database" +description: |- + Manages a Gremlin Database within a Cosmos DB Account. +--- + +# azurerm_cosmosdb_gremlin_database + +Manages a Gremlin Database within a Cosmos DB Account. + +## Example Usage + +```hcl +data "azurerm_cosmosdb_account" "example" { + name = "tfex-cosmosdb-account" + resource_group_name = "tfex-cosmosdb-account-rg" +} + +resource "azurerm_cosmosdb_gremlin_database" "example" { + name = "tfex-cosmos-gremlin-db" + resource_group_name = "${data.azurerm_cosmosdb_account.example.resource_group_name}" + account_name = "${data.azurerm_cosmosdb_account.example.name}" + throughput = 400 +} +``` + +## Argument Reference + +The following arguments are supported: + +* `name` - (Required) Specifies the name of the Cosmos DB Gremlin Database. Changing this forces a new resource to be created. + +* `resource_group_name` - (Required) The name of the resource group in which the Cosmos DB Gremlin Database is created. Changing this forces a new resource to be created. + +* `account_name` - (Required) The name of the CosmosDB Account to create the Gremlin Database within. Changing this forces a new resource to be created. + +* `throughput` - (Optional) The throughput of the Gremlin database (RU/s). Must be set in increments of `100`. The minimum value is `400`. This must be set upon database creation otherwise it cannot be updated without a manual terraform destroy-apply. + + +## Attributes Reference + +The following attributes are exported: + +* `id` - the Cosmos DB Gremlin Database ID. + +## Import + +Cosmos Mongo Database can be imported using the `resource id`, e.g. + +```shell +terraform import azurerm_cosmosdb_gremlin_database.db1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg1/providers/Microsoft.DocumentDB/databaseAccounts/account1/apis/gremlin/databases/db1 +``` From e6083e6191a2e82fcf4a6ba0d27671dfe0e0238f Mon Sep 17 00:00:00 2001 From: Sebastian Rosander Date: Thu, 26 Dec 2019 18:49:54 +0800 Subject: [PATCH 7/7] Updates from comments. --- .../internal/services/cosmos/registration.go | 4 +- .../resource_arm_cosmosdb_gremlin_database.go | 6 +- ...urce_arm_cosmosdb_gremlin_database_test.go | 57 +++++++++++++++++-- 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/azurerm/internal/services/cosmos/registration.go b/azurerm/internal/services/cosmos/registration.go index 36fe1c1af498..f6579c305d90 100644 --- a/azurerm/internal/services/cosmos/registration.go +++ b/azurerm/internal/services/cosmos/registration.go @@ -23,10 +23,10 @@ func (r Registration) SupportedResources() map[string]*schema.Resource { return map[string]*schema.Resource{ "azurerm_cosmosdb_account": resourceArmCosmosDbAccount(), "azurerm_cosmosdb_cassandra_keyspace": resourceArmCosmosDbCassandraKeyspace(), + "azurerm_cosmosdb_gremlin_database": resourceArmCosmosGremlinDatabase(), "azurerm_cosmosdb_mongo_collection": resourceArmCosmosDbMongoCollection(), "azurerm_cosmosdb_mongo_database": resourceArmCosmosDbMongoDatabase(), "azurerm_cosmosdb_sql_container": resourceArmCosmosDbSQLContainer(), "azurerm_cosmosdb_sql_database": resourceArmCosmosDbSQLDatabase(), - "azurerm_cosmosdb_table": resourceArmCosmosDbTable(), - "azurerm_cosmosdb_gremlin_database": resourceArmCosmosGremlinDatabase()} + "azurerm_cosmosdb_table": resourceArmCosmosDbTable()} } diff --git a/azurerm/internal/services/cosmos/resource_arm_cosmosdb_gremlin_database.go b/azurerm/internal/services/cosmos/resource_arm_cosmosdb_gremlin_database.go index 631910b4cf7a..bdabcaf2bb14 100644 --- a/azurerm/internal/services/cosmos/resource_arm_cosmosdb_gremlin_database.go +++ b/azurerm/internal/services/cosmos/resource_arm_cosmosdb_gremlin_database.go @@ -176,8 +176,7 @@ func resourceArmCosmosGremlinDatabaseUpdate(d *schema.ResourceData, meta interfa } } - _, err = client.GetGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database) - if err != nil { + if _, err = client.GetGremlinDatabase(ctx, id.ResourceGroup, id.Account, id.Database); err != nil { return fmt.Errorf("Error making get request for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) } @@ -242,8 +241,7 @@ func resourceArmCosmosGremlinDatabaseDelete(d *schema.ResourceData, meta interfa } } - err = future.WaitForCompletionRef(ctx, client.Client) - if err != nil { + if err = future.WaitForCompletionRef(ctx, client.Client); err != nil { return fmt.Errorf("Error waiting on delete future for Cosmos Gremlin Database %s (Account %s): %+v", id.Database, id.Account, err) } diff --git a/azurerm/internal/services/cosmos/tests/resource_arm_cosmosdb_gremlin_database_test.go b/azurerm/internal/services/cosmos/tests/resource_arm_cosmosdb_gremlin_database_test.go index e9cd77f8a14e..65fd940b64af 100644 --- a/azurerm/internal/services/cosmos/tests/resource_arm_cosmosdb_gremlin_database_test.go +++ b/azurerm/internal/services/cosmos/tests/resource_arm_cosmosdb_gremlin_database_test.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/terraform" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/features" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) @@ -31,6 +32,33 @@ func TestAccAzureRMCosmosGremlinDatabase_basic(t *testing.T) { }) } +func TestAccAzureRMCosmosGremlinDatabase_requiresImport(t *testing.T) { + if !features.ShouldResourcesBeImported() { + t.Skip("Skipping since resources aren't required to be imported") + return + } + + data := acceptance.BuildTestData(t, "azurerm_cosmosdb_gremlin_database", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMCosmosGremlinDatabase_basic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMCosmosGremlinDatabaseExists(data.ResourceName), + ), + }, + { + Config: testAccAzureRMCosmosDatabase_requiresImport(data), + ExpectError: acceptance.RequiresImportError("azurerm_cosmosdb_gremlin_database"), + }, + }, + }) +} + func TestAccAzureRMCosmosGremlinDatabase_complete(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_cosmosdb_gremlin_database", "test") @@ -40,9 +68,18 @@ func TestAccAzureRMCosmosGremlinDatabase_complete(t *testing.T) { CheckDestroy: testCheckAzureRMCosmosGremlinDatabaseDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMCosmosGremlinDatabase_complete(data), + Config: testAccAzureRMCosmosGremlinDatabase_complete(data, 700), + Check: resource.ComposeAggregateTestCheckFunc( + testCheckAzureRMCosmosGremlinDatabaseExists(data.ResourceName), + resource.TestCheckResourceAttr(data.ResourceName, "throughput", "700"), + ), + }, + data.ImportStep(), + { + Config: testAccAzureRMCosmosGremlinDatabase_complete(data, 1700), Check: resource.ComposeAggregateTestCheckFunc( testCheckAzureRMCosmosGremlinDatabaseExists(data.ResourceName), + resource.TestCheckResourceAttr(data.ResourceName, "throughput", "1700"), ), }, data.ImportStep(), @@ -118,7 +155,19 @@ func testAccAzureRMCosmosGremlinDatabase_basic(data acceptance.TestData) string `, testAccAzureRMCosmosDBAccount_capabilityGremlin(data), data.RandomInteger) } -func testAccAzureRMCosmosGremlinDatabase_complete(data acceptance.TestData) string { +func testAccAzureRMCosmosDatabase_requiresImport(data acceptance.TestData) string { + return fmt.Sprintf(` + %s + + resource "azurerm_cosmosdb_gremlin_database" "import" { + name = "${azurerm_cosmosdb_database.test.name}" + resource_group_name = "${azurerm_cosmosdb_database.test.name" + account_name = "${azurerm_cosmosdb_database.test.name}" + } + `, testAccAzureRMCosmosGremlinDatabase_basic(data)) +} + +func testAccAzureRMCosmosGremlinDatabase_complete(data acceptance.TestData, throughput int) string { return fmt.Sprintf(` %[1]s @@ -126,7 +175,7 @@ func testAccAzureRMCosmosGremlinDatabase_complete(data acceptance.TestData) stri name = "acctest-%[2]d" resource_group_name = "${azurerm_cosmosdb_account.test.resource_group_name}" account_name = "${azurerm_cosmosdb_account.test.name}" - throughput = 700 + throughput = %[3]d } - `, testAccAzureRMCosmosDBAccount_capabilityGremlin(data), data.RandomInteger) + `, testAccAzureRMCosmosDBAccount_capabilityGremlin(data), data.RandomInteger, throughput) }