-
Notifications
You must be signed in to change notification settings - Fork 7
/
connection_aws_privatelink.go
106 lines (90 loc) · 3.05 KB
/
connection_aws_privatelink.go
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
package materialize
import (
"database/sql"
"fmt"
"strings"
"github.com/jmoiron/sqlx"
)
type ConnectionAwsPrivatelinkBuilder struct {
Connection
privateLinkServiceName string
privateLinkAvailabilityZones []string
validate bool
}
func NewConnectionAwsPrivatelinkBuilder(conn *sqlx.DB, obj MaterializeObject) *ConnectionAwsPrivatelinkBuilder {
b := Builder{conn, BaseConnection}
return &ConnectionAwsPrivatelinkBuilder{
Connection: Connection{b, obj.Name, obj.SchemaName, obj.DatabaseName},
}
}
func (b *ConnectionAwsPrivatelinkBuilder) PrivateLinkServiceName(privateLinkServiceName string) *ConnectionAwsPrivatelinkBuilder {
b.privateLinkServiceName = privateLinkServiceName
return b
}
func (b *ConnectionAwsPrivatelinkBuilder) PrivateLinkAvailabilityZones(privateLinkAvailabilityZones []string) *ConnectionAwsPrivatelinkBuilder {
b.privateLinkAvailabilityZones = privateLinkAvailabilityZones
return b
}
func (b *ConnectionAwsPrivatelinkBuilder) Validate(validate bool) *ConnectionAwsPrivatelinkBuilder {
b.validate = validate
return b
}
func (b *ConnectionAwsPrivatelinkBuilder) Create() error {
q := strings.Builder{}
q.WriteString(fmt.Sprintf(`CREATE CONNECTION %s TO AWS PRIVATELINK (`, b.QualifiedName()))
q.WriteString(fmt.Sprintf(`SERVICE NAME %s,`, QuoteString(b.privateLinkServiceName)))
q.WriteString(`AVAILABILITY ZONES (`)
for i, az := range b.privateLinkAvailabilityZones {
if i > 0 {
q.WriteString(`, `)
}
q.WriteString(QuoteString(az))
}
q.WriteString(`))`)
if !b.validate {
q.WriteString(` WITH (VALIDATE = false)`)
}
q.WriteString(`;`)
return b.ddl.exec(q.String())
}
type ConnectionAwsPrivatelinkParams struct {
ConnectionId sql.NullString `db:"id"`
ConnectionName sql.NullString `db:"connection_name"`
SchemaName sql.NullString `db:"schema_name"`
DatabaseName sql.NullString `db:"database_name"`
Comment sql.NullString `db:"comment"`
Principal sql.NullString `db:"principal"`
OwnerName sql.NullString `db:"owner_name"`
}
var connectionAwsPrivatelinkQuery = NewBaseQuery(`
SELECT
mz_connections.id,
mz_connections.name AS connection_name,
mz_schemas.name AS schema_name,
mz_databases.name AS database_name,
mz_aws_privatelink_connections.principal,
comments.comment AS comment,
mz_roles.name AS owner_name
FROM mz_connections
JOIN mz_schemas
ON mz_connections.schema_id = mz_schemas.id
JOIN mz_databases
ON mz_schemas.database_id = mz_databases.id
LEFT JOIN mz_aws_privatelink_connections
ON mz_connections.id = mz_aws_privatelink_connections.id
JOIN mz_roles
ON mz_connections.owner_id = mz_roles.id
LEFT JOIN (
SELECT id, comment
FROM mz_internal.mz_comments
WHERE object_type = 'connection'
) comments
ON mz_connections.id = comments.id`)
func ScanConnectionAwsPrivatelink(conn *sqlx.DB, id string) (ConnectionAwsPrivatelinkParams, error) {
q := connectionAwsPrivatelinkQuery.QueryPredicate(map[string]string{"mz_connections.id": id})
var c ConnectionAwsPrivatelinkParams
if err := conn.Get(&c, q); err != nil {
return c, err
}
return c, nil
}