Skip to content

Commit 36669d3

Browse files
committed
Tidying and add docs
1 parent a2644bc commit 36669d3

File tree

3 files changed

+148
-109
lines changed

3 files changed

+148
-109
lines changed

postgresql/resource_postgresql_event_trigger.go

Lines changed: 73 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const (
2121
eventTriggerDatabaseAttr = "database"
2222
eventTriggerSchemaAttr = "schema"
2323
eventTriggerOwnerAttr = "owner"
24-
eventTriggerEnabledAttr = "enabled"
24+
eventTriggerStatusAttr = "status"
2525
)
2626

2727
func resourcePostgreSQLEventTrigger() *schema.Resource {
@@ -102,7 +102,7 @@ func resourcePostgreSQLEventTrigger() *schema.Resource {
102102
ForceNew: true,
103103
Description: "Schema where the function is located. If not specified, the provider default schema is used.",
104104
},
105-
eventTriggerEnabledAttr: {
105+
eventTriggerStatusAttr: {
106106
Type: schema.TypeString,
107107
Optional: true,
108108
Default: "enable",
@@ -129,87 +129,9 @@ func resourcePostgreSQLEventTrigger() *schema.Resource {
129129
}
130130

131131
func resourcePostgreSQLEventTriggerCreate(db *DBConnection, d *schema.ResourceData) error {
132-
if err := createEventTrigger(db, d); err != nil {
133-
return err
134-
}
135-
136-
d.SetId(d.Get(eventTriggerNameAttr).(string))
137-
138-
return nil
139-
}
140-
141-
func resourcePostgreSQLEventTriggerUpdate(db *DBConnection, d *schema.ResourceData) error {
142-
if err := updateEventTrigger(db, d); err != nil {
143-
return err
144-
}
145-
146-
d.SetId(d.Get(eventTriggerNameAttr).(string))
147-
148-
return nil
149-
}
150-
151-
func resourcePostgreSQLEventTriggerDelete(db *DBConnection, d *schema.ResourceData) error {
152-
if err := deleteEventTrigger(db, d); err != nil {
153-
return err
154-
}
155-
156-
d.SetId(d.Get(eventTriggerNameAttr).(string))
157-
158-
return nil
159-
}
160-
161-
func resourcePostgreSQLEventTriggerRead(db *DBConnection, d *schema.ResourceData) error {
162-
return readEventTrigger(db, d)
163-
}
164-
165-
func resourcePostgreSQLEventTriggerExists(db *DBConnection, d *schema.ResourceData) (bool, error) {
166-
database, eventTriggerName, err := getDBEventTriggerName(d, db.client.databaseName)
167-
if err != nil {
168-
return false, err
169-
}
170-
171-
// Check if the database exists
172-
exists, err := dbExists(db, database)
173-
if err != nil || !exists {
174-
return false, err
175-
}
176-
177-
txn, err := startTransaction(db.client, database)
178-
if err != nil {
179-
return false, err
180-
}
181-
defer deferredRollback(txn)
182-
183-
err = txn.QueryRow("SELECT evtname FROM pg_event_trigger WHERE evtname=$1", eventTriggerName).Scan(&eventTriggerName)
184-
switch {
185-
case err == sql.ErrNoRows:
186-
return false, nil
187-
case err != nil:
188-
return false, fmt.Errorf("Error reading schema: %w", err)
189-
}
190-
191-
return true, nil
192-
}
193-
194-
func getDBEventTriggerName(d *schema.ResourceData, databaseName string) (string, string, error) {
195-
database := getDatabase(d, databaseName)
196132
eventTriggerName := d.Get(eventTriggerNameAttr).(string)
133+
d.SetId(eventTriggerName)
197134

198-
// When importing, we have to parse the ID to find event trigger and database names.
199-
if eventTriggerName == "" {
200-
parsed := strings.Split(d.Id(), ".")
201-
if len(parsed) != 2 {
202-
return "", "", fmt.Errorf("schema ID %s has not the expected format 'database.event_trigger': %v", d.Id(), parsed)
203-
}
204-
database = parsed[0]
205-
eventTriggerName = parsed[1]
206-
}
207-
208-
return database, eventTriggerName, nil
209-
}
210-
211-
func createEventTrigger(db *DBConnection, d *schema.ResourceData) error {
212-
eventTriggerName := d.Get(eventTriggerNameAttr).(string)
213135
b := bytes.NewBufferString("CREATE EVENT TRIGGER ")
214136
fmt.Fprint(b, pq.QuoteIdentifier(eventTriggerName))
215137

@@ -252,7 +174,7 @@ func createEventTrigger(db *DBConnection, d *schema.ResourceData) error {
252174
b = bytes.NewBufferString("ALTER EVENT TRIGGER ")
253175
fmt.Fprint(b, pq.QuoteIdentifier(eventTriggerName))
254176

255-
eventTriggerEnabled := d.Get(eventTriggerEnabledAttr).(string)
177+
eventTriggerEnabled := d.Get(eventTriggerStatusAttr).(string)
256178
fmt.Fprint(b, " ", eventTriggerEnabled)
257179

258180
statusSql := b.String()
@@ -290,14 +212,15 @@ func createEventTrigger(db *DBConnection, d *schema.ResourceData) error {
290212
return nil
291213
}
292214

293-
func updateEventTrigger(db *DBConnection, d *schema.ResourceData) error {
215+
func resourcePostgreSQLEventTriggerUpdate(db *DBConnection, d *schema.ResourceData) error {
294216
eventTriggerName := d.Get(eventTriggerNameAttr).(string)
217+
d.SetId(eventTriggerName)
295218

296219
// Enable or disable the event trigger
297220
b := bytes.NewBufferString("ALTER EVENT TRIGGER ")
298221
fmt.Fprint(b, pq.QuoteIdentifier(eventTriggerName))
299222

300-
eventTriggerEnabled := d.Get(eventTriggerEnabledAttr).(string)
223+
eventTriggerEnabled := d.Get(eventTriggerStatusAttr).(string)
301224
fmt.Fprint(b, " ", eventTriggerEnabled)
302225

303226
statusSql := b.String()
@@ -330,8 +253,10 @@ func updateEventTrigger(db *DBConnection, d *schema.ResourceData) error {
330253
return nil
331254
}
332255

333-
func deleteEventTrigger(db *DBConnection, d *schema.ResourceData) error {
256+
func resourcePostgreSQLEventTriggerDelete(db *DBConnection, d *schema.ResourceData) error {
334257
eventTriggerName := d.Get(eventTriggerNameAttr).(string)
258+
d.SetId(eventTriggerName)
259+
335260
b := bytes.NewBufferString("DROP EVENT TRIGGER ")
336261
fmt.Fprint(b, pq.QuoteIdentifier(eventTriggerName))
337262

@@ -354,7 +279,7 @@ func deleteEventTrigger(db *DBConnection, d *schema.ResourceData) error {
354279
return nil
355280
}
356281

357-
func readEventTrigger(db *DBConnection, d *schema.ResourceData) error {
282+
func resourcePostgreSQLEventTriggerRead(db *DBConnection, d *schema.ResourceData) error {
358283
database, eventTriggerName, err := getDBEventTriggerName(d, db.client.databaseName)
359284
if err != nil {
360285
return err
@@ -367,16 +292,15 @@ func readEventTrigger(db *DBConnection, d *schema.ResourceData) error {
367292
`JOIN pg_catalog.pg_namespace on pg_catalog.pg_proc.pronamespace = pg_catalog.pg_namespace.oid ` +
368293
`WHERE evtname=$1`
369294

370-
var name, on, owner, function, schema string
371-
var enabled string
295+
var name, on, owner, function, schema, status string
372296
var tags []string
373297

374298
values := []interface{}{
375299
&name,
376300
&on,
377301
&function,
378302
&schema,
379-
&enabled,
303+
&status,
380304
(*pq.StringArray)(&tags),
381305
&owner,
382306
}
@@ -401,34 +325,29 @@ func readEventTrigger(db *DBConnection, d *schema.ResourceData) error {
401325
}
402326

403327
d.SetId(name)
404-
d.Set("name", name)
405-
d.Set("on", on)
406-
d.Set("function", function)
407-
d.Set("owner", owner)
408-
d.Set("database", database)
409-
d.Set("schema", schema)
410-
411-
switch enabled {
328+
d.Set(eventTriggerNameAttr, name)
329+
d.Set(eventTriggerOnAttr, on)
330+
d.Set(eventTriggerFunctionAttr, function)
331+
d.Set(eventTriggerOwnerAttr, owner)
332+
d.Set(eventTriggerDatabaseAttr, database)
333+
d.Set(eventTriggerSchemaAttr, schema)
334+
335+
switch status {
412336
case "D":
413-
d.Set("enabled", "disable")
337+
d.Set(eventTriggerStatusAttr, "disable")
414338
case "O":
415-
d.Set("enabled", "enable")
339+
d.Set(eventTriggerStatusAttr, "enable")
416340
case "R":
417-
d.Set("enabled", "enable_replica")
341+
d.Set(eventTriggerStatusAttr, "enable_replica")
418342
case "A":
419-
d.Set("enabled", "enable_always")
343+
d.Set(eventTriggerStatusAttr, "enable_always")
420344
}
421345

422-
// TODO: maybe it's better to add a struct
423-
// with types instead of an interface{}?
424346
var filters []interface{}
425347

426348
if len(tags) > 0 {
427349
var values []string
428-
429-
for _, tag := range tags {
430-
values = append(values, tag)
431-
}
350+
values = append(values, tags...)
432351

433352
filter := map[string]interface{}{
434353
"variable": "TAG",
@@ -438,7 +357,53 @@ func readEventTrigger(db *DBConnection, d *schema.ResourceData) error {
438357
filters = append(filters, filter)
439358
}
440359

441-
d.Set("filter", filters)
360+
d.Set(eventTriggerFilterAttr, filters)
442361

443362
return nil
444363
}
364+
365+
func resourcePostgreSQLEventTriggerExists(db *DBConnection, d *schema.ResourceData) (bool, error) {
366+
database, eventTriggerName, err := getDBEventTriggerName(d, db.client.databaseName)
367+
if err != nil {
368+
return false, err
369+
}
370+
371+
// Check if the database exists
372+
exists, err := dbExists(db, database)
373+
if err != nil || !exists {
374+
return false, err
375+
}
376+
377+
txn, err := startTransaction(db.client, database)
378+
if err != nil {
379+
return false, err
380+
}
381+
defer deferredRollback(txn)
382+
383+
err = txn.QueryRow("SELECT evtname FROM pg_event_trigger WHERE evtname=$1", eventTriggerName).Scan(&eventTriggerName)
384+
switch {
385+
case err == sql.ErrNoRows:
386+
return false, nil
387+
case err != nil:
388+
return false, fmt.Errorf("error reading schema: %w", err)
389+
}
390+
391+
return true, nil
392+
}
393+
394+
func getDBEventTriggerName(d *schema.ResourceData, databaseName string) (string, string, error) {
395+
database := getDatabase(d, databaseName)
396+
eventTriggerName := d.Get(eventTriggerNameAttr).(string)
397+
398+
// When importing, we have to parse the ID to find event trigger and database names.
399+
if eventTriggerName == "" {
400+
parsed := strings.Split(d.Id(), ".")
401+
if len(parsed) != 2 {
402+
return "", "", fmt.Errorf("schema ID %s has not the expected format 'database.event_trigger': %v", d.Id(), parsed)
403+
}
404+
database = parsed[0]
405+
eventTriggerName = parsed[1]
406+
}
407+
408+
return database, eventTriggerName, nil
409+
}

postgresql/resource_postgresql_event_trigger_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ resource "postgresql_event_trigger" "event_trigger" {
139139
function = postgresql_function.function.name
140140
on = "ddl_command_end"
141141
owner = "postgres"
142-
enabled = "enable"
142+
status = "enable"
143143
144144
filter {
145145
variable = "TAG"
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
layout: "postgresql"
3+
page_title: "PostgreSQL: postgresql_event_trigger"
4+
sidebar_current: "docs-postgresql-resource-postgresql_event_trigger"
5+
description: |-
6+
Creates and manages an event trigger on a PostgreSQL server.
7+
---
8+
9+
# postgresql\_event_trigger
10+
11+
The ``postgresql_event_trigger`` resource creates and manages [event trigger
12+
objects](https://www.postgresql.org/docs/current/static/event-triggers.html)
13+
within a PostgreSQL server instance.
14+
15+
## Usage
16+
17+
```hcl
18+
resource "postgresql_function" "function" {
19+
name = "test_function"
20+
21+
returns = "event_trigger"
22+
language = "plpgsql"
23+
body = <<-EOF
24+
BEGIN
25+
RAISE EXCEPTION 'command % is disabled', tg_tag;
26+
END;
27+
EOF
28+
}
29+
30+
resource "postgresql_event_trigger" "event_trigger" {
31+
name = "event_trigger_test"
32+
function = postgresql_function.function.name
33+
on = "ddl_command_start"
34+
owner = "postgres"
35+
36+
filter {
37+
variable = "TAG"
38+
values = [
39+
"DROP TABLE"
40+
]
41+
}
42+
}
43+
```
44+
45+
## Argument Reference
46+
47+
* `name` - (Required) The name of the event trigger.
48+
49+
* `on` - (Required) The name of the on event the trigger will listen to. The allowed names are "ddl_command_start", "ddl_command_end", "sql_drop" or "table_rewrite".
50+
51+
* `function` - (Required) A function that is declared as taking no argument and returning type event_trigger.
52+
53+
* `filter` - (Optional) Lists of filter variables to restrict the firing of the trigger. Currently the only supported filter_variable is TAG.
54+
* `variable` - (Required) The name of a variable used to filter events. Currently the only supported value is TAG.
55+
* `values` - (Required) The name of the filter variable name. For TAG, this means a list of command tags (e.g., 'DROP FUNCTION').
56+
57+
* `database` - (Optional) The database where the event trigger is located.
58+
If not specified, the function is created in the current database.
59+
60+
* `schema` - (Optional) Schema where the function is located.
61+
If not specified, the function is created in the current schema.
62+
63+
* `status` - (Optional) These configure the firing of event triggers. The allowed names are "disable", "enable", "enable_replica" or "enable_always". Default is "enable".
64+
65+
* `owner` - (Required) The user name of the owner of the event trigger. You can't use 'current_role', 'current_user' or 'session_user' in order to avoid drifts.
66+
67+
## Import Example
68+
69+
It is possible to import a `postgresql_event_trigger` resource with the following
70+
command:
71+
72+
```
73+
$ terraform import postgresql_event_trigger.event_trigger_test "database.event_trigger"
74+
```

0 commit comments

Comments
 (0)