diff --git a/VERSION b/VERSION index e5a4a5e..437d26b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.9 \ No newline at end of file +1.0.10 \ No newline at end of file diff --git a/api/client.go b/api/client.go index a1e0227..605f04b 100644 --- a/api/client.go +++ b/api/client.go @@ -56,7 +56,7 @@ type Client interface { // GetDatabase gets the database by instance resource id and the database name. GetDatabase(ctx context.Context, databaseName string) (*v1pb.Database, error) // ListDatabase list the databases. - ListDatabase(ctx context.Context, instanceID, filter string) (*v1pb.ListDatabasesResponse, error) + ListDatabase(ctx context.Context, instanceID, filter string) ([]*v1pb.Database, error) // UpdateDatabase patches the database. UpdateDatabase(ctx context.Context, patch *v1pb.Database, updateMasks []string) (*v1pb.Database, error) // BatchUpdateDatabases batch updates databases. diff --git a/client/database.go b/client/database.go index e3e95a4..e0becc4 100644 --- a/client/database.go +++ b/client/database.go @@ -26,12 +26,37 @@ func (c *client) GetDatabase(ctx context.Context, databaseName string) (*v1pb.Da return &res, nil } -// ListDatabase list the databases. -func (c *client) ListDatabase(ctx context.Context, instanceID, filter string) (*v1pb.ListDatabasesResponse, error) { - requestURL := fmt.Sprintf("%s/%s/instances/%s/databases", c.url, c.version, instanceID) - if filter != "" { - requestURL = fmt.Sprintf("%s?filter=%s", requestURL, url.QueryEscape(filter)) - } +// ListDatabase list all databases. +func (c *client) ListDatabase(ctx context.Context, instanceID, filter string) ([]*v1pb.Database, error) { + res := []*v1pb.Database{} + pageToken := "" + + for { + resp, err := c.listDatabasePerPage(ctx, instanceID, filter, pageToken, 500) + if err != nil { + return nil, err + } + res = append(res, resp.Databases...) + pageToken = resp.NextPageToken + if pageToken == "" { + break + } + } + + return res, nil +} + +// listDatabasePerPage list the databases. +func (c *client) listDatabasePerPage(ctx context.Context, instanceID, filter, pageToken string, pageSize int) (*v1pb.ListDatabasesResponse, error) { + requestURL := fmt.Sprintf( + "%s/%s/instances/%s/databases?filter=%s&page_size=%d&page_token=%s", + c.url, + c.version, + instanceID, + url.QueryEscape(filter), + pageSize, + pageToken, + ) req, err := http.NewRequestWithContext(ctx, "GET", requestURL, nil) if err != nil { diff --git a/docs/resources/project.md b/docs/resources/project.md index 3689bdb..6264da0 100644 --- a/docs/resources/project.md +++ b/docs/resources/project.md @@ -69,7 +69,7 @@ Optional: Optional: - `database` (String) The accessible database full name in instances/{instance resource id}/databases/{database name} format -- `expire_timestamp` (String) The expiration timestamp in YYYY-MM-DDThh:mm:ss.000Z format +- `expire_timestamp` (String) The expiration timestamp in YYYY-MM-DDThh:mm:ssZ format - `row_limit` (Number) The export row limit for exporter role - `schema` (String) The accessible schema in the database - `tables` (Set of String) The accessible table list diff --git a/examples/setup/project.tf b/examples/setup/project.tf index 287fc99..3eb5bdd 100644 --- a/examples/setup/project.tf +++ b/examples/setup/project.tf @@ -27,7 +27,7 @@ resource "bytebase_project" "sample_project" { database = "instances/test-sample-instance/databases/employee" tables = ["dept_emp", "dept_manager"] row_limit = 10000 - expire_timestamp = "2027-03-09T16:17:49.637Z" + expire_timestamp = "2027-03-09T16:17:49Z" } } } diff --git a/provider/data_source_project.go b/provider/data_source_project.go index db884e9..03be430 100644 --- a/provider/data_source_project.go +++ b/provider/data_source_project.go @@ -191,7 +191,7 @@ func getProjectMembersSchema(computed bool) *schema.Schema { Type: schema.TypeString, Computed: computed, Optional: true, - Description: "The expiration timestamp in YYYY-MM-DDThh:mm:ss.000Z format", + Description: "The expiration timestamp in YYYY-MM-DDThh:mm:ssZ format", }, }, }, @@ -300,7 +300,7 @@ func setProject( project *v1pb.Project, ) diag.Diagnostics { filter := fmt.Sprintf(`project == "%s"`, project.Name) - listDBResponse, err := client.ListDatabase(ctx, "-", filter) + databases, err := client.ListDatabase(ctx, "-", filter) if err != nil { return diag.FromErr(err) } @@ -353,7 +353,7 @@ func setProject( return diag.Errorf("cannot set postgres_database_tenant_mode for project: %s", err.Error()) } - databaseList := flattenDatabaseList(listDBResponse.Databases) + databaseList := flattenDatabaseList(databases) if err := d.Set("databases", schema.NewSet(databaseHash, databaseList)); err != nil { return diag.Errorf("cannot set databases for project: %s", err.Error()) } diff --git a/provider/data_source_project_list.go b/provider/data_source_project_list.go index fce5bc3..2e86eb1 100644 --- a/provider/data_source_project_list.go +++ b/provider/data_source_project_list.go @@ -125,12 +125,12 @@ func dataSourceProjectListRead(ctx context.Context, d *schema.ResourceData, m in proj["postgres_database_tenant_mode"] = project.PostgresDatabaseTenantMode filter := fmt.Sprintf(`project == "%s"`, project.Name) - response, err := c.ListDatabase(ctx, "-", filter) + databases, err := c.ListDatabase(ctx, "-", filter) if err != nil { return diag.FromErr(err) } - proj["databases"] = flattenDatabaseList(response.Databases) + proj["databases"] = flattenDatabaseList(databases) iamPolicy, err := c.GetProjectIAMPolicy(ctx, project.Name) if err != nil { diff --git a/provider/internal/mock_client.go b/provider/internal/mock_client.go index b54ceaf..005471c 100644 --- a/provider/internal/mock_client.go +++ b/provider/internal/mock_client.go @@ -375,7 +375,7 @@ func (c *mockClient) GetDatabase(_ context.Context, databaseName string) (*v1pb. } // ListDatabase list the databases. -func (c *mockClient) ListDatabase(_ context.Context, instaceID, filter string) (*v1pb.ListDatabasesResponse, error) { +func (c *mockClient) ListDatabase(_ context.Context, instaceID, filter string) ([]*v1pb.Database, error) { projectID := "-" if strings.HasPrefix(filter, "project == ") { projectID = strings.Split(filter, "project == ")[1] @@ -391,9 +391,7 @@ func (c *mockClient) ListDatabase(_ context.Context, instaceID, filter string) ( databases = append(databases, db) } - return &v1pb.ListDatabasesResponse{ - Databases: databases, - }, nil + return databases, nil } // UpdateDatabase patches the database. diff --git a/provider/resource_project.go b/provider/resource_project.go index 2b9f82a..f6a1a8f 100644 --- a/provider/resource_project.go +++ b/provider/resource_project.go @@ -367,12 +367,12 @@ func resourceProjectDelete(ctx context.Context, d *schema.ResourceData, m interf func updateDatabasesInProject(ctx context.Context, d *schema.ResourceData, client api.Client, projectName string) diag.Diagnostics { filter := fmt.Sprintf(`project == "%s"`, projectName) - listDB, err := client.ListDatabase(ctx, "-", filter) + databases, err := client.ListDatabase(ctx, "-", filter) if err != nil { return diag.Errorf("failed to list database with error: %v", err) } existedDBMap := map[string]*v1pb.Database{} - for _, db := range listDB.Databases { + for _, db := range databases { existedDBMap[db.Name] = db }