diff --git a/azurerm/internal/services/cosmos/client/client.go b/azurerm/internal/services/cosmos/client/client.go index 6440e654c1d9..72dec52fcf60 100644 --- a/azurerm/internal/services/cosmos/client/client.go +++ b/azurerm/internal/services/cosmos/client/client.go @@ -6,12 +6,13 @@ import ( ) type Client struct { - CassandraClient *documentdb.CassandraResourcesClient - DatabaseClient *documentdb.DatabaseAccountsClient - GremlinClient *documentdb.GremlinResourcesClient - MongoDbClient *documentdb.MongoDBResourcesClient - SqlClient *documentdb.SQLResourcesClient - TableClient *documentdb.TableResourcesClient + CassandraClient *documentdb.CassandraResourcesClient + DatabaseClient *documentdb.DatabaseAccountsClient + GremlinClient *documentdb.GremlinResourcesClient + MongoDbClient *documentdb.MongoDBResourcesClient + NotebookWorkspaceClient *documentdb.NotebookWorkspacesClient + SqlClient *documentdb.SQLResourcesClient + TableClient *documentdb.TableResourcesClient } func NewClient(o *common.ClientOptions) *Client { @@ -27,6 +28,9 @@ func NewClient(o *common.ClientOptions) *Client { mongoDbClient := documentdb.NewMongoDBResourcesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId) o.ConfigureClient(&mongoDbClient.Client, o.ResourceManagerAuthorizer) + notebookWorkspaceClient := documentdb.NewNotebookWorkspacesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId) + o.ConfigureClient(¬ebookWorkspaceClient.Client, o.ResourceManagerAuthorizer) + sqlClient := documentdb.NewSQLResourcesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId) o.ConfigureClient(&sqlClient.Client, o.ResourceManagerAuthorizer) @@ -34,11 +38,12 @@ func NewClient(o *common.ClientOptions) *Client { o.ConfigureClient(&tableClient.Client, o.ResourceManagerAuthorizer) return &Client{ - CassandraClient: &cassandraClient, - DatabaseClient: &databaseClient, - GremlinClient: &gremlinClient, - MongoDbClient: &mongoDbClient, - SqlClient: &sqlClient, - TableClient: &tableClient, + CassandraClient: &cassandraClient, + DatabaseClient: &databaseClient, + GremlinClient: &gremlinClient, + MongoDbClient: &mongoDbClient, + NotebookWorkspaceClient: ¬ebookWorkspaceClient, + SqlClient: &sqlClient, + TableClient: &tableClient, } } diff --git a/azurerm/internal/services/cosmos/cosmosdb_notebook_workspace_resource.go b/azurerm/internal/services/cosmos/cosmosdb_notebook_workspace_resource.go new file mode 100644 index 000000000000..7e210968ea25 --- /dev/null +++ b/azurerm/internal/services/cosmos/cosmosdb_notebook_workspace_resource.go @@ -0,0 +1,147 @@ +package cosmos + +import ( + "fmt" + "log" + "time" + + "github.com/Azure/azure-sdk-for-go/services/cosmos-db/mgmt/2021-01-15/documentdb" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "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/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/cosmos/parse" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/cosmos/validate" + azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func resourceCosmosDbNotebookWorkspace() *schema.Resource { + return &schema.Resource{ + Create: resourceCosmosDbNotebookWorkspaceCreate, + Read: resourceCosmosDbNotebookWorkspaceRead, + Delete: resourceCosmosDbNotebookWorkspaceDelete, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Read: schema.DefaultTimeout(5 * time.Minute), + Delete: schema.DefaultTimeout(30 * time.Minute), + }, + + Importer: azSchema.ValidateResourceIDPriorToImport(func(id string) error { + _, err := parse.NotebookWorkspaceID(id) + return err + }), + + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validation.StringInSlice([]string{ + "default", + }, false), + }, + + "resource_group_name": azure.SchemaResourceGroupName(), + + "account_name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.CosmosAccountName, + }, + + "server_endpoint": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} +func resourceCosmosDbNotebookWorkspaceCreate(d *schema.ResourceData, meta interface{}) error { + subscriptionId := meta.(*clients.Client).Account.SubscriptionId + client := meta.(*clients.Client).Cosmos.NotebookWorkspaceClient + ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) + defer cancel() + + name := d.Get("name").(string) + resourceGroup := d.Get("resource_group_name").(string) + accountName := d.Get("account_name").(string) + + id := parse.NewNotebookWorkspaceID(subscriptionId, resourceGroup, accountName, name) + + existing, err := client.Get(ctx, id.ResourceGroup, id.DatabaseAccountName) + if err != nil { + if !utils.ResponseWasNotFound(existing.Response) { + return fmt.Errorf("checking for existing CosmosDb NotebookWorkspace %q: %+v", id, err) + } + } + if !utils.ResponseWasNotFound(existing.Response) { + return tf.ImportAsExistsError("azurerm_cosmosdb_notebook_workspace", id.ID()) + } + + notebookCreateUpdateParameters := documentdb.NotebookWorkspaceCreateUpdateParameters{} + future, err := client.CreateOrUpdate(ctx, id.ResourceGroup, id.DatabaseAccountName, notebookCreateUpdateParameters) + if err != nil { + return fmt.Errorf("creating CosmosDb NotebookWorkspace %q: %+v", id, err) + } + + if err := future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("waiting for creation of the CosmosDb NotebookWorkspace %q: %+v", id, err) + } + + d.SetId(id.ID()) + return resourceCosmosDbNotebookWorkspaceRead(d, meta) +} + +func resourceCosmosDbNotebookWorkspaceRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.NotebookWorkspaceClient + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := parse.NotebookWorkspaceID(d.Id()) + if err != nil { + return err + } + + resp, err := client.Get(ctx, id.ResourceGroup, id.DatabaseAccountName) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + log.Printf("[INFO] CosmosDb NotebookWorkspace %q does not exist - removing from state", d.Id()) + d.SetId("") + return nil + } + return fmt.Errorf("retrieving CosmosDb NotebookWorkspace %q: %+v", id, err) + } + d.Set("name", id.Name) + d.Set("resource_group_name", id.ResourceGroup) + d.Set("account_name", id.DatabaseAccountName) + if props := resp.NotebookWorkspaceProperties; props != nil { + d.Set("server_endpoint", props.NotebookServerEndpoint) + } + return nil +} + +func resourceCosmosDbNotebookWorkspaceDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Cosmos.NotebookWorkspaceClient + ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := parse.NotebookWorkspaceID(d.Id()) + if err != nil { + return err + } + + future, err := client.Delete(ctx, id.ResourceGroup, id.DatabaseAccountName) + if err != nil { + return fmt.Errorf("deleting CosmosDb NotebookWorkspace %q: %+v", id, err) + } + + if err := future.WaitForCompletionRef(ctx, client.Client); err != nil { + return fmt.Errorf("waiting for deletion of the CosmosDb NotebookWorkspace %q: %+v", id, err) + } + return nil +} diff --git a/azurerm/internal/services/cosmos/cosmosdb_notebook_workspace_resource_test.go b/azurerm/internal/services/cosmos/cosmosdb_notebook_workspace_resource_test.go new file mode 100644 index 000000000000..efcb6c3cb31c --- /dev/null +++ b/azurerm/internal/services/cosmos/cosmosdb_notebook_workspace_resource_test.go @@ -0,0 +1,117 @@ +package cosmos_test + +import ( + "context" + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "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/acceptance/check" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/cosmos/parse" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +type CosmosDbNotebookWorkspaceResource struct{} + +func TestAccCosmosDbNotebookWorkspace_basic(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_cosmosdb_notebook_workspace", "test") + r := CosmosDbNotebookWorkspaceResource{} + data.ResourceTest(t, r, []resource.TestStep{ + { + Config: r.basic(data), + Check: resource.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.ImportStep(), + }) +} + +func TestAccCosmosDbNotebookWorkspace_requiresImport(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_cosmosdb_notebook_workspace", "test") + r := CosmosDbNotebookWorkspaceResource{} + data.ResourceTest(t, r, []resource.TestStep{ + { + Config: r.basic(data), + Check: resource.ComposeTestCheckFunc( + check.That(data.ResourceName).ExistsInAzure(r), + ), + }, + data.RequiresImportErrorStep(r.requiresImport), + }) +} + +func (r CosmosDbNotebookWorkspaceResource) Exists(ctx context.Context, client *clients.Client, state *terraform.InstanceState) (*bool, error) { + id, err := parse.NotebookWorkspaceID(state.ID) + if err != nil { + return nil, err + } + resp, err := client.Cosmos.NotebookWorkspaceClient.Get(ctx, id.ResourceGroup, id.DatabaseAccountName) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return utils.Bool(false), nil + } + return nil, fmt.Errorf("retrieving Cosmos NotebookWorkspace %q: %+v", id, err) + } + return utils.Bool(true), nil +} + +func (r CosmosDbNotebookWorkspaceResource) template(data acceptance.TestData) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} + +resource "azurerm_resource_group" "test" { + name = "acctest-cosmosdb-%d" + location = "%s" +} + +resource "azurerm_cosmosdb_account" "test" { + name = "acctest-ca-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + offer_type = "Standard" + kind = "GlobalDocumentDB" + + consistency_policy { + consistency_level = "BoundedStaleness" + } + + geo_location { + location = azurerm_resource_group.test.location + failover_priority = 0 + } +} + +`, data.RandomInteger, data.Locations.Primary, data.RandomInteger) +} + +func (r CosmosDbNotebookWorkspaceResource) basic(data acceptance.TestData) string { + template := r.template(data) + return fmt.Sprintf(` +%s + +resource "azurerm_cosmosdb_notebook_workspace" "test" { + name = "default" + resource_group_name = azurerm_resource_group.test.name + account_name = azurerm_cosmosdb_account.test.name +} +`, template) +} + +func (r CosmosDbNotebookWorkspaceResource) requiresImport(data acceptance.TestData) string { + config := r.basic(data) + return fmt.Sprintf(` +%s + +resource "azurerm_cosmosdb_notebook_workspace" "import" { + name = "default" + resource_group_name = azurerm_resource_group.test.name + account_name = azurerm_cosmosdb_account.test.name +} +`, config) +} diff --git a/azurerm/internal/services/cosmos/parse/notebook_workspace.go b/azurerm/internal/services/cosmos/parse/notebook_workspace.go new file mode 100644 index 000000000000..e00b53d7ed28 --- /dev/null +++ b/azurerm/internal/services/cosmos/parse/notebook_workspace.go @@ -0,0 +1,75 @@ +package parse + +// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten + +import ( + "fmt" + "strings" + + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" +) + +type NotebookWorkspaceId struct { + SubscriptionId string + ResourceGroup string + DatabaseAccountName string + Name string +} + +func NewNotebookWorkspaceID(subscriptionId, resourceGroup, databaseAccountName, name string) NotebookWorkspaceId { + return NotebookWorkspaceId{ + SubscriptionId: subscriptionId, + ResourceGroup: resourceGroup, + DatabaseAccountName: databaseAccountName, + Name: name, + } +} + +func (id NotebookWorkspaceId) String() string { + segments := []string{ + fmt.Sprintf("Name %q", id.Name), + fmt.Sprintf("Database Account Name %q", id.DatabaseAccountName), + fmt.Sprintf("Resource Group %q", id.ResourceGroup), + } + segmentsStr := strings.Join(segments, " / ") + return fmt.Sprintf("%s: (%s)", "Notebook Workspace", segmentsStr) +} + +func (id NotebookWorkspaceId) ID() string { + fmtString := "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.DocumentDB/databaseAccounts/%s/notebookWorkspaces/%s" + return fmt.Sprintf(fmtString, id.SubscriptionId, id.ResourceGroup, id.DatabaseAccountName, id.Name) +} + +// NotebookWorkspaceID parses a NotebookWorkspace ID into an NotebookWorkspaceId struct +func NotebookWorkspaceID(input string) (*NotebookWorkspaceId, error) { + id, err := azure.ParseAzureResourceID(input) + if err != nil { + return nil, err + } + + resourceId := NotebookWorkspaceId{ + SubscriptionId: id.SubscriptionID, + ResourceGroup: id.ResourceGroup, + } + + if resourceId.SubscriptionId == "" { + return nil, fmt.Errorf("ID was missing the 'subscriptions' element") + } + + if resourceId.ResourceGroup == "" { + return nil, fmt.Errorf("ID was missing the 'resourceGroups' element") + } + + if resourceId.DatabaseAccountName, err = id.PopSegment("databaseAccounts"); err != nil { + return nil, err + } + if resourceId.Name, err = id.PopSegment("notebookWorkspaces"); err != nil { + return nil, err + } + + if err := id.ValidateNoEmptySegments(input); err != nil { + return nil, err + } + + return &resourceId, nil +} diff --git a/azurerm/internal/services/cosmos/parse/notebook_workspace_test.go b/azurerm/internal/services/cosmos/parse/notebook_workspace_test.go new file mode 100644 index 000000000000..ad363514556e --- /dev/null +++ b/azurerm/internal/services/cosmos/parse/notebook_workspace_test.go @@ -0,0 +1,128 @@ +package parse + +// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten + +import ( + "testing" + + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/resourceid" +) + +var _ resourceid.Formatter = NotebookWorkspaceId{} + +func TestNotebookWorkspaceIDFormatter(t *testing.T) { + actual := NewNotebookWorkspaceID("12345678-1234-9876-4563-123456789012", "resourceGroup1", "account1", "notebookWorkspace1").ID() + expected := "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/notebookWorkspaces/notebookWorkspace1" + if actual != expected { + t.Fatalf("Expected %q but got %q", expected, actual) + } +} + +func TestNotebookWorkspaceID(t *testing.T) { + testData := []struct { + Input string + Error bool + Expected *NotebookWorkspaceId + }{ + + { + // empty + Input: "", + Error: true, + }, + + { + // missing SubscriptionId + Input: "/", + Error: true, + }, + + { + // missing value for SubscriptionId + Input: "/subscriptions/", + Error: true, + }, + + { + // missing ResourceGroup + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/", + Error: true, + }, + + { + // missing value for ResourceGroup + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/", + Error: true, + }, + + { + // missing DatabaseAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/", + Error: true, + }, + + { + // missing value for DatabaseAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/", + Error: true, + }, + + { + // missing Name + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/", + Error: true, + }, + + { + // missing value for Name + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/notebookWorkspaces/", + Error: true, + }, + + { + // valid + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/notebookWorkspaces/notebookWorkspace1", + Expected: &NotebookWorkspaceId{ + SubscriptionId: "12345678-1234-9876-4563-123456789012", + ResourceGroup: "resourceGroup1", + DatabaseAccountName: "account1", + Name: "notebookWorkspace1", + }, + }, + + { + // upper-cased + Input: "/SUBSCRIPTIONS/12345678-1234-9876-4563-123456789012/RESOURCEGROUPS/RESOURCEGROUP1/PROVIDERS/MICROSOFT.DOCUMENTDB/DATABASEACCOUNTS/ACCOUNT1/NOTEBOOKWORKSPACES/NOTEBOOKWORKSPACE1", + Error: true, + }, + } + + for _, v := range testData { + t.Logf("[DEBUG] Testing %q", v.Input) + + actual, err := NotebookWorkspaceID(v.Input) + if err != nil { + if v.Error { + continue + } + + t.Fatalf("Expect a value but got an error: %s", err) + } + if v.Error { + t.Fatal("Expect an error but didn't get one") + } + + if actual.SubscriptionId != v.Expected.SubscriptionId { + t.Fatalf("Expected %q but got %q for SubscriptionId", v.Expected.SubscriptionId, actual.SubscriptionId) + } + if actual.ResourceGroup != v.Expected.ResourceGroup { + t.Fatalf("Expected %q but got %q for ResourceGroup", v.Expected.ResourceGroup, actual.ResourceGroup) + } + if actual.DatabaseAccountName != v.Expected.DatabaseAccountName { + t.Fatalf("Expected %q but got %q for DatabaseAccountName", v.Expected.DatabaseAccountName, actual.DatabaseAccountName) + } + if actual.Name != v.Expected.Name { + t.Fatalf("Expected %q but got %q for Name", v.Expected.Name, actual.Name) + } + } +} diff --git a/azurerm/internal/services/cosmos/registration.go b/azurerm/internal/services/cosmos/registration.go index 2746ca7b0eca..a29bb1805b5f 100644 --- a/azurerm/internal/services/cosmos/registration.go +++ b/azurerm/internal/services/cosmos/registration.go @@ -35,6 +35,7 @@ func (r Registration) SupportedResources() map[string]*schema.Resource { "azurerm_cosmosdb_gremlin_graph": resourceCosmosDbGremlinGraph(), "azurerm_cosmosdb_mongo_collection": resourceCosmosDbMongoCollection(), "azurerm_cosmosdb_mongo_database": resourceCosmosDbMongoDatabase(), + "azurerm_cosmosdb_notebook_workspace": resourceCosmosDbNotebookWorkspace(), "azurerm_cosmosdb_sql_container": resourceCosmosDbSQLContainer(), "azurerm_cosmosdb_sql_database": resourceCosmosDbSQLDatabase(), "azurerm_cosmosdb_sql_stored_procedure": resourceCosmosDbSQLStoredProcedure(), diff --git a/azurerm/internal/services/cosmos/resourceids.go b/azurerm/internal/services/cosmos/resourceids.go index 085068f9cf59..af2a39ae35b5 100644 --- a/azurerm/internal/services/cosmos/resourceids.go +++ b/azurerm/internal/services/cosmos/resourceids.go @@ -7,6 +7,7 @@ package cosmos //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=GremlinGraph -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.DocumentDB/databaseAccounts/acc1/gremlinDatabases/database1/graphs/graph1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=MongodbCollection -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.DocumentDB/databaseAccounts/acc1/mongodbDatabases/db1/collections/coll1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=MongodbDatabase -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.DocumentDB/databaseAccounts/acc1/mongodbDatabases/db1 +//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=NotebookWorkspace -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/notebookWorkspaces/notebookWorkspace1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=SqlContainer -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.DocumentDB/databaseAccounts/acc1/sqlDatabases/db1/containers/container1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=SqlDatabase -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.DocumentDB/databaseAccounts/acc1/sqlDatabases/db1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=SqlStoredProcedure -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.DocumentDB/databaseAccounts/acc1/sqlDatabases/db1/containers/container1/storedProcedures/sproc1 diff --git a/azurerm/internal/services/cosmos/validate/notebook_workspace_id.go b/azurerm/internal/services/cosmos/validate/notebook_workspace_id.go new file mode 100644 index 000000000000..a10f64c99d09 --- /dev/null +++ b/azurerm/internal/services/cosmos/validate/notebook_workspace_id.go @@ -0,0 +1,23 @@ +package validate + +// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten + +import ( + "fmt" + + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/cosmos/parse" +) + +func NotebookWorkspaceID(input interface{}, key string) (warnings []string, errors []error) { + v, ok := input.(string) + if !ok { + errors = append(errors, fmt.Errorf("expected %q to be a string", key)) + return + } + + if _, err := parse.NotebookWorkspaceID(v); err != nil { + errors = append(errors, err) + } + + return +} diff --git a/azurerm/internal/services/cosmos/validate/notebook_workspace_id_test.go b/azurerm/internal/services/cosmos/validate/notebook_workspace_id_test.go new file mode 100644 index 000000000000..a654c5f98f59 --- /dev/null +++ b/azurerm/internal/services/cosmos/validate/notebook_workspace_id_test.go @@ -0,0 +1,88 @@ +package validate + +// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten + +import "testing" + +func TestNotebookWorkspaceID(t *testing.T) { + cases := []struct { + Input string + Valid bool + }{ + + { + // empty + Input: "", + Valid: false, + }, + + { + // missing SubscriptionId + Input: "/", + Valid: false, + }, + + { + // missing value for SubscriptionId + Input: "/subscriptions/", + Valid: false, + }, + + { + // missing ResourceGroup + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/", + Valid: false, + }, + + { + // missing value for ResourceGroup + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/", + Valid: false, + }, + + { + // missing DatabaseAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/", + Valid: false, + }, + + { + // missing value for DatabaseAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/", + Valid: false, + }, + + { + // missing Name + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/", + Valid: false, + }, + + { + // missing value for Name + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/notebookWorkspaces/", + Valid: false, + }, + + { + // valid + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resourceGroup1/providers/Microsoft.DocumentDB/databaseAccounts/account1/notebookWorkspaces/notebookWorkspace1", + Valid: true, + }, + + { + // upper-cased + Input: "/SUBSCRIPTIONS/12345678-1234-9876-4563-123456789012/RESOURCEGROUPS/RESOURCEGROUP1/PROVIDERS/MICROSOFT.DOCUMENTDB/DATABASEACCOUNTS/ACCOUNT1/NOTEBOOKWORKSPACES/NOTEBOOKWORKSPACE1", + Valid: false, + }, + } + for _, tc := range cases { + t.Logf("[DEBUG] Testing Value %s", tc.Input) + _, errors := NotebookWorkspaceID(tc.Input, "test") + valid := len(errors) == 0 + + if tc.Valid != valid { + t.Fatalf("Expected %t but got %t", tc.Valid, valid) + } + } +} diff --git a/website/docs/r/cosmosdb_notebook_workspace.html.markdown b/website/docs/r/cosmosdb_notebook_workspace.html.markdown new file mode 100644 index 000000000000..9c37221f5405 --- /dev/null +++ b/website/docs/r/cosmosdb_notebook_workspace.html.markdown @@ -0,0 +1,76 @@ +--- +subcategory: "CosmosDB (DocumentDB)" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_cosmosdb_notebook_workspace" +description: |- + Manages an SQL Notebook Workspace. +--- + +# azurerm_cosmosdb_notebook_workspace + +Manages an SQL Notebook Workspace. + +## Example Usage + +```hcl +resource "azurerm_resource_group" "example" { + name = "example-resources" + location = "West Europe" +} + +resource "azurerm_cosmosdb_account" "example" { + name = "example-cosmosdb-account" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + offer_type = "Standard" + kind = "GlobalDocumentDB" + + consistency_policy { + consistency_level = "BoundedStaleness" + } + + geo_location { + location = azurerm_resource_group.example.location + failover_priority = 0 + } +} + +resource "azurerm_cosmosdb_notebook_workspace" "example" { + name = "default" + resource_group_name = azurerm_cosmosdb_account.example.resource_group_name + account_name = azurerm_cosmosdb_account.example.name +} +``` + +## Arguments Reference + +The following arguments are supported: +* `name` - (Required) The name which should be used for this SQL Notebook Workspace. Possible value is `default`. Changing this forces a new SQL Notebook Workspace to be created. + +* `resource_group_name` - (Required) The name of the Resource Group where the SQL Notebook Workspace should exist. Changing this forces a new SQL Notebook Workspace to be created. + +* `account_name` - (Required) The name of the Cosmos DB Account to create the SQL Notebook Workspace within. Changing this forces a new SQL Notebook Workspace to be created. + +## Attributes Reference + +In addition to the Arguments listed above - the following Attributes are exported: + +* `id` - The ID of the SQL Notebook Workspace. + +* `server_endpoint` - Specifies the endpoint of Notebook server. + +## Timeouts + +The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) for certain actions: + +* `create` - (Defaults to 30 minutes) Used when creating the =SQL Notebook Workspace. +* `read` - (Defaults to 5 minutes) Used when retrieving the =SQL Notebook Workspace. +* `delete` - (Defaults to 30 minutes) Used when deleting the =SQL Notebook Workspace. + +## Import + +=SQL Notebook Workspaces can be imported using the `resource id`, e.g. + +```shell +terraform import azurerm_cosmosdb_notebook_workspace.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1/providers/Microsoft.DocumentDB/databaseAccounts/account1/notebookWorkspaces/notebookWorkspace1 +```