Skip to content
This repository has been archived by the owner on Nov 1, 2024. It is now read-only.

Commit

Permalink
delete joinable view in bigquery when underlying dataset(nada) is del…
Browse files Browse the repository at this point in the history
…eted
  • Loading branch information
MengZhuNAV committed Nov 15, 2023
1 parent 86902c5 commit a8c828b
Show file tree
Hide file tree
Showing 10 changed files with 140 additions and 5 deletions.
28 changes: 28 additions & 0 deletions pkg/access/ensurer.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@ type Repo interface {
ListActiveAccessToDataset(ctx context.Context, datasetID uuid.UUID) ([]*models.Access, error)
GetOwnerGroupOfDataset(ctx context.Context, datasetID uuid.UUID) (string, error)
SetJoinableViewDeleted(ctx context.Context, id uuid.UUID) error
GetJoinableViewsToBeDeletedWithRefDatasource(ctx context.Context) ([]gensql.GetJoinableViewsToBeDeletedWithRefDatasourceRow, error)
}

type BigQuery interface {
DeleteJoinableDataset(ctx context.Context, datasetID string) error
DeleteJoinableView(ctx context.Context, joinableViewName, refProjectID, refDatasetID, refTableID string) error
}

type Revoker interface {
Expand Down Expand Up @@ -95,14 +97,38 @@ func (e *Ensurer) run(ctx context.Context) {
}
}

if err := e.ensureDeleteBQDatasourceForDeletedDataset(ctx); err != nil {
e.log.WithError(err).Error("ensuring delete bq datasource for deleted dataset")
}

if err := e.ensureJoinableViewAccesses(ctx); err != nil {
e.log.WithError(err).Error("ensuring joinable view accesses")
}
}

func (e *Ensurer) ensureDeleteBQDatasourceForDeletedDataset(ctx context.Context) error {
fmt.Println("remove deleted joinable view")
jvdatasources, err := e.repo.GetJoinableViewsToBeDeletedWithRefDatasource(ctx)
if err != nil {
return err
}
fmt.Println(jvdatasources)

for _, jvds := range jvdatasources {
err := e.bq.DeleteJoinableView(ctx, jvds.JoinableViewName, jvds.BqProjectID, jvds.BqDatasetID, jvds.BqTableID)
if err != nil {
e.log.WithError(err).Errorf("deleting joinable view with deleted pseudo-datasource %v %v.%v.%v", jvds.JoinableViewName, jvds.BqProjectID, jvds.BqDatasetID, jvds.BqTableID)
continue
}
}

return nil
}

func (e *Ensurer) ensureJoinableViewAccesses(ctx context.Context) error {
joinableViews, err := e.repo.GetJoinableViewsWithReference(ctx)
if err != nil {
e.log.WithError(err).Error("getting joinable views with reference")
return err
}

Expand All @@ -125,6 +151,7 @@ OUTER:
joinableViewName := bigquery.MakeJoinableViewName(jv.PseudoProjectID, jv.PseudoDataset, jv.PseudoTable)
datasetOwnerGroup, err := e.repo.GetOwnerGroupOfDataset(ctx, jv.PseudoViewID)
if err != nil {
e.log.WithError(err).Errorf("getting owner group of dataset: %v", jv.PseudoViewID)
return err
}
userGroups, err := e.googleGroups.Groups(ctx, &jv.Owner)
Expand All @@ -145,6 +172,7 @@ OUTER:

accesses, err := e.repo.ListActiveAccessToDataset(ctx, jv.PseudoViewID)
if err != nil {
e.log.WithError(err).Errorf("listing active access to dataset: %v", jv.PseudoViewID)
return err
}

Expand Down
8 changes: 8 additions & 0 deletions pkg/access/ensurer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ func (m *MockRepo) SetJoinableViewDeleted(ctx context.Context, joinableViewID uu
return nil
}

func (m *MockRepo) GetJoinableViewsToBeDeletedWithRefDatasource(ctx context.Context) ([]gensql.GetJoinableViewsToBeDeletedWithRefDatasourceRow, error) {
return nil, nil
}

type MockAM struct {
NGrant int
NRevoke int
Expand All @@ -104,3 +108,7 @@ func (b *MockBigQuery) DeleteJoinableDataset(ctx context.Context, datasetID stri
b.NDeleteDataset++
return nil
}

func (b *MockBigQuery) DeleteJoinableView(ctx context.Context, joinableViewName, refProjectID, refDatasetID, refTableID string) error {
return nil
}
17 changes: 17 additions & 0 deletions pkg/bigquery/bigquery.go
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,23 @@ func (c *Bigquery) insertSecretIfNotExists(ctx context.Context, secretDatasetID,
return nil
}

func (c *Bigquery) DeleteJoinableView(ctx context.Context, joinableViewName, refProjectID, refDatasetID, refTableID string) error {
client, err := bigquery.NewClient(ctx, c.centralDataProject)
if err != nil {
return fmt.Errorf("bigquery.NewClient: %v", err)
}
defer client.Close()

if err := client.Dataset(joinableViewName).Table(MakeJoinableViewName(refProjectID, refDatasetID, refTableID)).Delete(ctx); err != nil {
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
return nil
}
return err
}

return nil
}

func makeUserPrefix(user *auth.User) string {
emailFixDot := strings.ReplaceAll(user.Email, ".", "_")
emailFixAt := strings.ReplaceAll(emailFixDot, "@", "_")
Expand Down
4 changes: 4 additions & 0 deletions pkg/bigquery/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,7 @@ func (c *Mock) DeleteJoinableDataset(ctx context.Context, datasetID string) erro
func (c *Mock) MakeBigQueryUrlForJoinableViews(name, projectID, datasetID, tableID string) string {
return fmt.Sprintf("%v.%v.%v", "centralDataProject", name, fmt.Sprintf("%v_%v_%v", projectID, datasetID, tableID))
}

func (c *Mock) DeleteJoinableView(ctx context.Context, joinableViewName, refProjectID, refDatasetID, refTableID string) error {
return nil
}
63 changes: 60 additions & 3 deletions pkg/database/gensql/joinable_views.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pkg/database/gensql/models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pkg/database/gensql/querier.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions pkg/database/joinable_views.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ func (r *Repo) GetJoinableViewsWithReference(ctx context.Context) ([]gensql.GetJ
return r.querier.GetJoinableViewsWithReference(ctx)
}

func (r *Repo) GetJoinableViewsToBeDeletedWithRefDatasource(ctx context.Context) ([]gensql.GetJoinableViewsToBeDeletedWithRefDatasourceRow, error) {
return r.querier.GetJoinableViewsToBeDeletedWithRefDatasource(ctx)
}

func (r *Repo) GetJoinableViewWithAccessStatus(ctx context.Context, joinableViewID uuid.UUID, user *auth.User) (*JoinableViewInDetail, error) {
joinableViewDatasets, err := r.querier.GetJoinableViewWithDataset(ctx, joinableViewID)
if err != nil {
Expand Down
18 changes: 16 additions & 2 deletions pkg/database/queries/joinable_views.sql
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ FROM
JOIN joinable_views_datasource b ON a.id = b.joinable_view_id
JOIN datasource_bigquery c ON b.datasource_id = c.id
WHERE
a.deleted IS NULL;
a.deleted IS NULL AND b.deleted IS NULL;

-- name: SetJoinableViewDeleted :exec
UPDATE
Expand Down Expand Up @@ -98,4 +98,18 @@ FROM
)
INNER JOIN dataproducts dp ON datasets.dataproduct_id = dp.id
WHERE
jv.id = @id;
jv.id = @id;

-- name: GetJoinableViewsToBeDeletedWithRefDatasource :many
SELECT
jv.id as joinable_view_id,
jv.name as joinable_view_name,
bq.project_id as bq_project_id,
bq.dataset as bq_dataset_id,
bq.table_name as bq_table_id
FROM
joinable_views jv
JOIN joinable_views_datasource jvds ON jv.id = jvds.joinable_view_id
JOIN datasource_bigquery bq ON bq.id = jvds.datasource_id
WHERE
jvds.deleted IS NOT NULL;
1 change: 1 addition & 0 deletions pkg/graph/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type Bigquery interface {
CreateJoinableViewsForUser(ctx context.Context, name string, datasources []bq.JoinableViewDatasource) (string, string, map[uuid.UUID]string, error)
MakeBigQueryUrlForJoinableViews(name, projectID, datasetID, tableID string) string
DeleteJoinableDataset(ctx context.Context, datasetID string) error
DeleteJoinableView(ctx context.Context, joinableViewName, refProjectID, refDatasetID, refTableID string) error
}

type AccessManager interface {
Expand Down

0 comments on commit a8c828b

Please sign in to comment.