Skip to content

Commit c3b853d

Browse files
authored
fix: list all databases in the project (#87)
* chore: use set for unordered collection * chore: update doc * fix: list all databases in the project * chore: update * fix: lint
1 parent 859a90a commit c3b853d

File tree

9 files changed

+44
-21
lines changed

9 files changed

+44
-21
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.9
1+
1.0.10

api/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ type Client interface {
5656
// GetDatabase gets the database by instance resource id and the database name.
5757
GetDatabase(ctx context.Context, databaseName string) (*v1pb.Database, error)
5858
// ListDatabase list the databases.
59-
ListDatabase(ctx context.Context, instanceID, filter string) (*v1pb.ListDatabasesResponse, error)
59+
ListDatabase(ctx context.Context, instanceID, filter string) ([]*v1pb.Database, error)
6060
// UpdateDatabase patches the database.
6161
UpdateDatabase(ctx context.Context, patch *v1pb.Database, updateMasks []string) (*v1pb.Database, error)
6262
// BatchUpdateDatabases batch updates databases.

client/database.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,37 @@ func (c *client) GetDatabase(ctx context.Context, databaseName string) (*v1pb.Da
2626
return &res, nil
2727
}
2828

29-
// ListDatabase list the databases.
30-
func (c *client) ListDatabase(ctx context.Context, instanceID, filter string) (*v1pb.ListDatabasesResponse, error) {
31-
requestURL := fmt.Sprintf("%s/%s/instances/%s/databases", c.url, c.version, instanceID)
32-
if filter != "" {
33-
requestURL = fmt.Sprintf("%s?filter=%s", requestURL, url.QueryEscape(filter))
34-
}
29+
// ListDatabase list all databases.
30+
func (c *client) ListDatabase(ctx context.Context, instanceID, filter string) ([]*v1pb.Database, error) {
31+
res := []*v1pb.Database{}
32+
pageToken := ""
33+
34+
for {
35+
resp, err := c.listDatabasePerPage(ctx, instanceID, filter, pageToken, 500)
36+
if err != nil {
37+
return nil, err
38+
}
39+
res = append(res, resp.Databases...)
40+
pageToken = resp.NextPageToken
41+
if pageToken == "" {
42+
break
43+
}
44+
}
45+
46+
return res, nil
47+
}
48+
49+
// listDatabasePerPage list the databases.
50+
func (c *client) listDatabasePerPage(ctx context.Context, instanceID, filter, pageToken string, pageSize int) (*v1pb.ListDatabasesResponse, error) {
51+
requestURL := fmt.Sprintf(
52+
"%s/%s/instances/%s/databases?filter=%s&page_size=%d&page_token=%s",
53+
c.url,
54+
c.version,
55+
instanceID,
56+
url.QueryEscape(filter),
57+
pageSize,
58+
pageToken,
59+
)
3560

3661
req, err := http.NewRequestWithContext(ctx, "GET", requestURL, nil)
3762
if err != nil {

docs/resources/project.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ Optional:
6969
Optional:
7070

7171
- `database` (String) The accessible database full name in instances/{instance resource id}/databases/{database name} format
72-
- `expire_timestamp` (String) The expiration timestamp in YYYY-MM-DDThh:mm:ss.000Z format
72+
- `expire_timestamp` (String) The expiration timestamp in YYYY-MM-DDThh:mm:ssZ format
7373
- `row_limit` (Number) The export row limit for exporter role
7474
- `schema` (String) The accessible schema in the database
7575
- `tables` (Set of String) The accessible table list

examples/setup/project.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ resource "bytebase_project" "sample_project" {
2727
database = "instances/test-sample-instance/databases/employee"
2828
tables = ["dept_emp", "dept_manager"]
2929
row_limit = 10000
30-
expire_timestamp = "2027-03-09T16:17:49.637Z"
30+
expire_timestamp = "2027-03-09T16:17:49Z"
3131
}
3232
}
3333
}

provider/data_source_project.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ func getProjectMembersSchema(computed bool) *schema.Schema {
191191
Type: schema.TypeString,
192192
Computed: computed,
193193
Optional: true,
194-
Description: "The expiration timestamp in YYYY-MM-DDThh:mm:ss.000Z format",
194+
Description: "The expiration timestamp in YYYY-MM-DDThh:mm:ssZ format",
195195
},
196196
},
197197
},
@@ -300,7 +300,7 @@ func setProject(
300300
project *v1pb.Project,
301301
) diag.Diagnostics {
302302
filter := fmt.Sprintf(`project == "%s"`, project.Name)
303-
listDBResponse, err := client.ListDatabase(ctx, "-", filter)
303+
databases, err := client.ListDatabase(ctx, "-", filter)
304304
if err != nil {
305305
return diag.FromErr(err)
306306
}
@@ -353,7 +353,7 @@ func setProject(
353353
return diag.Errorf("cannot set postgres_database_tenant_mode for project: %s", err.Error())
354354
}
355355

356-
databaseList := flattenDatabaseList(listDBResponse.Databases)
356+
databaseList := flattenDatabaseList(databases)
357357
if err := d.Set("databases", schema.NewSet(databaseHash, databaseList)); err != nil {
358358
return diag.Errorf("cannot set databases for project: %s", err.Error())
359359
}

provider/data_source_project_list.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,12 @@ func dataSourceProjectListRead(ctx context.Context, d *schema.ResourceData, m in
125125
proj["postgres_database_tenant_mode"] = project.PostgresDatabaseTenantMode
126126

127127
filter := fmt.Sprintf(`project == "%s"`, project.Name)
128-
response, err := c.ListDatabase(ctx, "-", filter)
128+
databases, err := c.ListDatabase(ctx, "-", filter)
129129
if err != nil {
130130
return diag.FromErr(err)
131131
}
132132

133-
proj["databases"] = flattenDatabaseList(response.Databases)
133+
proj["databases"] = flattenDatabaseList(databases)
134134

135135
iamPolicy, err := c.GetProjectIAMPolicy(ctx, project.Name)
136136
if err != nil {

provider/internal/mock_client.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ func (c *mockClient) GetDatabase(_ context.Context, databaseName string) (*v1pb.
375375
}
376376

377377
// ListDatabase list the databases.
378-
func (c *mockClient) ListDatabase(_ context.Context, instaceID, filter string) (*v1pb.ListDatabasesResponse, error) {
378+
func (c *mockClient) ListDatabase(_ context.Context, instaceID, filter string) ([]*v1pb.Database, error) {
379379
projectID := "-"
380380
if strings.HasPrefix(filter, "project == ") {
381381
projectID = strings.Split(filter, "project == ")[1]
@@ -391,9 +391,7 @@ func (c *mockClient) ListDatabase(_ context.Context, instaceID, filter string) (
391391
databases = append(databases, db)
392392
}
393393

394-
return &v1pb.ListDatabasesResponse{
395-
Databases: databases,
396-
}, nil
394+
return databases, nil
397395
}
398396

399397
// UpdateDatabase patches the database.

provider/resource_project.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,12 +367,12 @@ func resourceProjectDelete(ctx context.Context, d *schema.ResourceData, m interf
367367

368368
func updateDatabasesInProject(ctx context.Context, d *schema.ResourceData, client api.Client, projectName string) diag.Diagnostics {
369369
filter := fmt.Sprintf(`project == "%s"`, projectName)
370-
listDB, err := client.ListDatabase(ctx, "-", filter)
370+
databases, err := client.ListDatabase(ctx, "-", filter)
371371
if err != nil {
372372
return diag.Errorf("failed to list database with error: %v", err)
373373
}
374374
existedDBMap := map[string]*v1pb.Database{}
375-
for _, db := range listDB.Databases {
375+
for _, db := range databases {
376376
existedDBMap[db.Name] = db
377377
}
378378

0 commit comments

Comments
 (0)