-
Notifications
You must be signed in to change notification settings - Fork 185
Expand file tree
/
Copy pathpostgres_synced_table.go
More file actions
128 lines (110 loc) · 4.52 KB
/
Copy pathpostgres_synced_table.go
File metadata and controls
128 lines (110 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package dresources
import (
"context"
"strings"
"github.com/databricks/cli/bundle/config/resources"
"github.com/databricks/databricks-sdk-go"
sdktime "github.com/databricks/databricks-sdk-go/common/types/time"
"github.com/databricks/databricks-sdk-go/marshal"
"github.com/databricks/databricks-sdk-go/service/postgres"
)
// PostgresSyncedTableRemote is the return type for DoRead. It embeds
// SyncedTableSyncedTableSpec so that all paths in StateType are valid paths in
// RemoteType, enabling drift detection for spec fields once the backend echoes
// spec on GET.
type PostgresSyncedTableRemote struct {
postgres.SyncedTableSyncedTableSpec
SyncedTableId string `json:"synced_table_id,omitempty"`
Name string `json:"name,omitempty"`
Status *postgres.SyncedTableSyncedTableStatus `json:"status,omitempty"`
Uid string `json:"uid,omitempty"`
CreateTime *sdktime.Time `json:"create_time,omitempty"`
}
// Custom marshaler needed because embedded SyncedTableSyncedTableSpec has its own
// MarshalJSON which would otherwise take over and ignore the additional fields.
func (s *PostgresSyncedTableRemote) UnmarshalJSON(b []byte) error {
return marshal.Unmarshal(b, s)
}
func (s PostgresSyncedTableRemote) MarshalJSON() ([]byte, error) {
return marshal.Marshal(s)
}
type ResourcePostgresSyncedTable struct {
client *databricks.WorkspaceClient
}
type PostgresSyncedTableState = resources.PostgresSyncedTableConfig
func (*ResourcePostgresSyncedTable) New(client *databricks.WorkspaceClient) *ResourcePostgresSyncedTable {
return &ResourcePostgresSyncedTable{client: client}
}
func (*ResourcePostgresSyncedTable) PrepareState(input *resources.PostgresSyncedTable) *PostgresSyncedTableState {
return &PostgresSyncedTableState{
SyncedTableId: input.SyncedTableId,
SyncedTableSyncedTableSpec: input.SyncedTableSyncedTableSpec,
}
}
func (*ResourcePostgresSyncedTable) RemapState(remote *PostgresSyncedTableRemote) *PostgresSyncedTableState {
return &PostgresSyncedTableState{
SyncedTableId: remote.SyncedTableId,
SyncedTableSyncedTableSpec: remote.SyncedTableSyncedTableSpec,
}
}
// makePostgresSyncedTableRemote converts the SDK SyncedTable into the embedded
// remote shape. GET does not echo spec today (only status is returned); the
// embedded spec fields stay at their zero values, and resources.yml suppresses
// phantom drift via ignore_remote_changes with reason spec:input_only.
//
// The synced-table API doesn't expose the user-facing id as a named field. It
// only appears as the trailing component of remote.Name, so we strip the
// constant "synced_tables/" prefix.
func makePostgresSyncedTableRemote(syncedTable *postgres.SyncedTable) *PostgresSyncedTableRemote {
var spec postgres.SyncedTableSyncedTableSpec
if syncedTable.Spec != nil {
spec = *syncedTable.Spec
}
return &PostgresSyncedTableRemote{
SyncedTableSyncedTableSpec: spec,
SyncedTableId: strings.TrimPrefix(syncedTable.Name, "synced_tables/"),
Name: syncedTable.Name,
Status: syncedTable.Status,
Uid: syncedTable.Uid,
CreateTime: syncedTable.CreateTime,
}
}
func (r *ResourcePostgresSyncedTable) DoRead(ctx context.Context, id string) (*PostgresSyncedTableRemote, error) {
syncedTable, err := r.client.Postgres.GetSyncedTable(ctx, postgres.GetSyncedTableRequest{Name: id})
if err != nil {
return nil, err
}
return makePostgresSyncedTableRemote(syncedTable), nil
}
func (r *ResourcePostgresSyncedTable) DoCreate(ctx context.Context, config *PostgresSyncedTableState) (string, *PostgresSyncedTableRemote, error) {
waiter, err := r.client.Postgres.CreateSyncedTable(ctx, postgres.CreateSyncedTableRequest{
SyncedTableId: config.SyncedTableId,
SyncedTable: postgres.SyncedTable{
Spec: &config.SyncedTableSyncedTableSpec,
// Output-only fields.
CreateTime: nil,
Name: "",
Status: nil,
Uid: "",
ForceSendFields: nil,
},
})
if err != nil {
return "", nil, err
}
result, err := waiter.Wait(ctx)
if err != nil {
return "", nil, err
}
remote := makePostgresSyncedTableRemote(result)
return remote.Name, remote, nil
}
func (r *ResourcePostgresSyncedTable) DoDelete(ctx context.Context, id string, _ *PostgresSyncedTableState) error {
waiter, err := r.client.Postgres.DeleteSyncedTable(ctx, postgres.DeleteSyncedTableRequest{
Name: id,
})
if err != nil {
return err
}
return waiter.Wait(ctx)
}