Skip to content

Commit ad93e95

Browse files
authored
Merge pull request #1418 from NASA-AMMOS/feat/hasura-events-view
Add Hasura Events Views
2 parents 5d4947a + 926f50d commit ad93e95

File tree

17 files changed

+469
-19
lines changed

17 files changed

+469
-19
lines changed

.github/workflows/pgcmp.yml

+8-3
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,12 @@ jobs:
120120
env:
121121
AERIE_USERNAME: "${{secrets.AERIE_USERNAME}}"
122122
AERIE_PASSWORD: "${{secrets.AERIE_PASSWORD}}"
123-
- name: Dump Databases
123+
- name: Clone PGCMP
124+
uses: actions/checkout@v4
125+
with:
126+
repository: cbbrowne/pgcmp
127+
path: pgcmp
128+
- name: Dump Migrated Database
124129
env:
125130
AERIE_USERNAME: "${{secrets.AERIE_USERNAME}}"
126131
AERIE_PASSWORD: "${{secrets.AERIE_PASSWORD}}"
@@ -193,7 +198,7 @@ jobs:
193198
with:
194199
repository: cbbrowne/pgcmp
195200
path: pgcmp
196-
- name: Dump Databases
201+
- name: Dump Current Database
197202
env:
198203
AERIE_USERNAME: "${{secrets.AERIE_USERNAME}}"
199204
AERIE_PASSWORD: "${{secrets.AERIE_PASSWORD}}"
@@ -224,7 +229,7 @@ jobs:
224229
env:
225230
AERIE_USERNAME: "${{secrets.AERIE_USERNAME}}"
226231
AERIE_PASSWORD: "${{secrets.AERIE_PASSWORD}}"
227-
- name: Dump Databases
232+
- name: Dump Migrated Database
228233
env:
229234
AERIE_USERNAME: "${{secrets.AERIE_USERNAME}}"
230235
AERIE_PASSWORD: "${{secrets.AERIE_PASSWORD}}"

deployment/aerie_db_migration.py

+15-8
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def step_by_step_migration(db_migration, apply):
8989
return
9090
input("Press Enter to continue...")
9191

92-
def bulk_migration(db_migration, apply):
92+
def bulk_migration(db_migration, apply, current_version):
9393
# Migrate the database
9494
exit_with = 0
9595
if apply:
@@ -98,10 +98,15 @@ def bulk_migration(db_migration, apply):
9898
if exit_code != 0:
9999
exit_with = 1
100100
else:
101-
os.system(f'hasura migrate apply --goto 1 --database-name {db_migration.db_name} --dry-run --log-level WARN &&'
102-
f'hasura migrate apply --down 1 --database-name {db_migration.db_name} --dry-run --log-level WARN')
103-
exit_code = os.system(f'hasura migrate apply --goto 1 --database-name {db_migration.db_name} &&'
104-
f'hasura migrate apply --down 1 --database-name {db_migration.db_name}')
101+
# Performing GOTO 1 when the database is at migration 1 will cause Hasura to attempt to reapply migration 1
102+
if current_version == 1:
103+
os.system(f'hasura migrate apply --down 1 --database-name {db_migration.db_name} --dry-run --log-level WARN')
104+
exit_code = os.system(f'hasura migrate apply --down 1 --database-name {db_migration.db_name}')
105+
else:
106+
os.system(f'hasura migrate apply --goto 1 --database-name {db_migration.db_name} --dry-run --log-level WARN &&'
107+
f'hasura migrate apply --down 1 --database-name {db_migration.db_name} --dry-run --log-level WARN')
108+
exit_code = os.system(f'hasura migrate apply --goto 1 --database-name {db_migration.db_name} &&'
109+
f'hasura migrate apply --down 1 --database-name {db_migration.db_name}')
105110
if exit_code != 0:
106111
exit_with = 1
107112

@@ -128,7 +133,9 @@ def mark_current_version(username, password, netloc):
128133

129134
# Mark everything up to that as applied
130135
for i in range(0, current_schema+1):
131-
os.system('hasura migrate apply --skip-execution --version '+str(i)+' --database-name aerie >/dev/null 2>&1')
136+
os.system('hasura migrate apply --skip-execution --version '+str(i)+' --database-name Aerie >/dev/null 2>&1')
137+
138+
return current_schema
132139

133140
def main():
134141
# Create a cli parser
@@ -227,7 +234,7 @@ def main():
227234
os.chdir(HASURA_PATH)
228235

229236
# Mark all migrations previously applied to the databases to be updated as such
230-
mark_current_version(username, password, args.network_location)
237+
current_version = mark_current_version(username, password, args.network_location)
231238

232239
clear_screen()
233240
print(f'\n###############################'
@@ -238,7 +245,7 @@ def main():
238245
# Go step-by-step through the migrations available for the selected database
239246
step_by_step_migration(migration, args.apply)
240247
else:
241-
bulk_migration(migration, args.apply)
248+
bulk_migration(migration, args.apply, current_version)
242249

243250
if __name__ == "__main__":
244251
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
table:
2+
name: refresh_activity_type_logs
3+
schema: hasura
4+
configuration:
5+
custom_name: "refresh_activity_type_logs"
6+
object_relationships:
7+
- name: model
8+
using:
9+
manual_configuration:
10+
remote_table:
11+
name: mission_model
12+
schema: merlin
13+
column_mapping:
14+
model_id: id
15+
select_permissions:
16+
- role: aerie_admin
17+
permission:
18+
columns: '*'
19+
filter: {}
20+
allow_aggregations: true
21+
- role: user
22+
permission:
23+
columns: '*'
24+
filter: {}
25+
allow_aggregations: true
26+
- role: viewer
27+
permission:
28+
columns: '*'
29+
filter: {}
30+
allow_aggregations: true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
table:
2+
name: refresh_model_parameter_logs
3+
schema: hasura
4+
configuration:
5+
custom_name: "refresh_model_parameter_logs"
6+
object_relationships:
7+
- name: model
8+
using:
9+
manual_configuration:
10+
remote_table:
11+
name: mission_model
12+
schema: merlin
13+
column_mapping:
14+
model_id: id
15+
select_permissions:
16+
- role: aerie_admin
17+
permission:
18+
columns: '*'
19+
filter: {}
20+
allow_aggregations: true
21+
- role: user
22+
permission:
23+
columns: '*'
24+
filter: {}
25+
allow_aggregations: true
26+
- role: viewer
27+
permission:
28+
columns: '*'
29+
filter: {}
30+
allow_aggregations: true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
table:
2+
name: refresh_resource_type_logs
3+
schema: hasura
4+
configuration:
5+
custom_name: "refresh_resource_type_logs"
6+
object_relationships:
7+
- name: model
8+
using:
9+
manual_configuration:
10+
remote_table:
11+
name: mission_model
12+
schema: merlin
13+
column_mapping:
14+
model_id: id
15+
select_permissions:
16+
- role: aerie_admin
17+
permission:
18+
columns: '*'
19+
filter: {}
20+
allow_aggregations: true
21+
- role: user
22+
permission:
23+
columns: '*'
24+
filter: {}
25+
allow_aggregations: true
26+
- role: viewer
27+
permission:
28+
columns: '*'
29+
filter: {}
30+
allow_aggregations: true

deployment/hasura/metadata/databases/tables/merlin/mission_model.yaml

+24
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,30 @@ array_relationships:
5757
table:
5858
name: scheduling_model_specification_goals
5959
schema: scheduler
60+
- name: refresh_activity_type_logs
61+
using:
62+
manual_configuration:
63+
remote_table:
64+
name: refresh_activity_type_logs
65+
schema: hasura
66+
column_mapping:
67+
id: model_id
68+
- name: refresh_model_parameter_logs
69+
using:
70+
manual_configuration:
71+
remote_table:
72+
name: refresh_model_parameter_logs
73+
schema: hasura
74+
column_mapping:
75+
id: model_id
76+
- name: refresh_resource_type_logs
77+
using:
78+
manual_configuration:
79+
remote_table:
80+
name: refresh_resource_type_logs
81+
schema: hasura
82+
column_mapping:
83+
id: model_id
6084
select_permissions:
6185
- role: aerie_admin
6286
permission:

deployment/hasura/metadata/databases/tables/tables.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646
- "!include hasura/get_conflicting_activities_return_value.yaml"
4747
- "!include hasura/get_non_conflicting_activities_return_value.yaml"
4848
- "!include hasura/get_plan_history_return_value.yaml"
49+
- "!include hasura/refresh_activity_type_logs.yaml"
50+
- "!include hasura/refresh_model_parameter_logs.yaml"
51+
- "!include hasura/refresh_resource_types_logs.yaml"
4952
- "!include hasura/resource_at_start_offset_return_value.yaml"
5053
- "!include hasura/withdraw_merge_request_return_value.yaml"
5154

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
drop view hasura.refresh_resource_type_logs;
2+
drop view hasura.refresh_model_parameter_logs;
3+
drop view hasura.refresh_activity_type_logs;
4+
5+
drop function hasura.get_event_logs(_trigger_name text);
6+
7+
call migrations.mark_migration_rolled_back('1');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
create function hasura.get_event_logs(_trigger_name text)
2+
returns table (
3+
model_id int,
4+
model_name text,
5+
model_version text,
6+
triggering_user text,
7+
delivered boolean,
8+
success boolean,
9+
tries int,
10+
created_at timestamp,
11+
next_retry_at timestamp,
12+
status int,
13+
error jsonb,
14+
error_message text,
15+
error_type text
16+
)
17+
stable
18+
security invoker
19+
language plpgsql as $$
20+
begin
21+
return query (
22+
select
23+
(el.payload->'data'->'new'->>'id')::int as model_id,
24+
el.payload->'data'->'new'->>'name' as model_name,
25+
el.payload->'data'->'new'->>'version' as model_version,
26+
el.payload->'session_variables'->>'x-hasura-user-id' as triggering_user,
27+
el.delivered,
28+
eil.status is not distinct from 200 as success, -- is not distinct from to catch `null`
29+
el.tries,
30+
el.created_at,
31+
el.next_retry_at,
32+
eil.status,
33+
(eil.response -> 'data'->> 'message')::jsonb as error,
34+
(eil.response -> 'data'->> 'message')::jsonb->>'message' as error_message,
35+
(eil.response -> 'data'->> 'message')::jsonb->>'type' as error_type
36+
from hdb_catalog.event_log el
37+
join hdb_catalog.event_invocation_logs eil on el.id = eil.event_id
38+
where trigger_name = _trigger_name);
39+
end;
40+
$$;
41+
comment on function hasura.get_event_logs(_trigger_name text) is e''
42+
'Get the logs for every run of a Hasura event with the specified trigger name.';
43+
44+
create view hasura.refresh_activity_type_logs as
45+
select * from hasura.get_event_logs('refreshActivityTypes');
46+
comment on view hasura.refresh_activity_type_logs is e''
47+
'View containing logs for every run of the Hasura event `refreshActivityTypes`.';
48+
49+
create view hasura.refresh_model_parameter_logs as
50+
select * from hasura.get_event_logs('refreshModelParameters');
51+
comment on view hasura.refresh_model_parameter_logs is e''
52+
'View containing logs for every run of the Hasura event `refreshModelParameters`.';
53+
54+
create view hasura.refresh_resource_type_logs as
55+
select * from hasura.get_event_logs('refreshResourceTypes');
56+
comment on view hasura.refresh_resource_type_logs is e''
57+
'View containing logs for every run of the Hasura event `refreshResourceTypes`.';
58+
59+
call migrations.mark_migration_applied('1');

deployment/postgres-init-db/sql/applied_migrations.sql

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ This file denotes which migrations occur "before" this version of the schema.
33
*/
44

55
call migrations.mark_migration_applied('0');
6+
call migrations.mark_migration_applied('1');

deployment/postgres-init-db/sql/init_hasura.sql

+3
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@ begin;
1313
\ir functions/hasura/plan_branching_functions.sql
1414
\ir functions/hasura/plan_merge_functions.sql
1515
\ir functions/hasura/snapshot_functions.sql
16+
17+
-- Event Views
18+
\ir views/hasura/hasura_event_logs.sql
1619
end;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
create function hasura.get_event_logs(_trigger_name text)
2+
returns table (
3+
model_id int,
4+
model_name text,
5+
model_version text,
6+
triggering_user text,
7+
delivered boolean,
8+
success boolean,
9+
tries int,
10+
created_at timestamp,
11+
next_retry_at timestamp,
12+
status int,
13+
error jsonb,
14+
error_message text,
15+
error_type text
16+
)
17+
stable
18+
security invoker
19+
language plpgsql as $$
20+
begin
21+
return query (
22+
select
23+
(el.payload->'data'->'new'->>'id')::int as model_id,
24+
el.payload->'data'->'new'->>'name' as model_name,
25+
el.payload->'data'->'new'->>'version' as model_version,
26+
el.payload->'session_variables'->>'x-hasura-user-id' as triggering_user,
27+
el.delivered,
28+
eil.status is not distinct from 200 as success, -- is not distinct from to catch `null`
29+
el.tries,
30+
el.created_at,
31+
el.next_retry_at,
32+
eil.status,
33+
(eil.response -> 'data'->> 'message')::jsonb as error,
34+
(eil.response -> 'data'->> 'message')::jsonb->>'message' as error_message,
35+
(eil.response -> 'data'->> 'message')::jsonb->>'type' as error_type
36+
from hdb_catalog.event_log el
37+
join hdb_catalog.event_invocation_logs eil on el.id = eil.event_id
38+
where trigger_name = _trigger_name);
39+
end;
40+
$$;
41+
comment on function hasura.get_event_logs(_trigger_name text) is e''
42+
'Get the logs for every run of a Hasura event with the specified trigger name.';
43+
44+
create view hasura.refresh_activity_type_logs as
45+
select * from hasura.get_event_logs('refreshActivityTypes');
46+
comment on view hasura.refresh_activity_type_logs is e''
47+
'View containing logs for every run of the Hasura event `refreshActivityTypes`.';
48+
49+
create view hasura.refresh_model_parameter_logs as
50+
select * from hasura.get_event_logs('refreshModelParameters');
51+
comment on view hasura.refresh_model_parameter_logs is e''
52+
'View containing logs for every run of the Hasura event `refreshModelParameters`.';
53+
54+
create view hasura.refresh_resource_type_logs as
55+
select * from hasura.get_event_logs('refreshResourceTypes');
56+
comment on view hasura.refresh_resource_type_logs is e''
57+
'View containing logs for every run of the Hasura event `refreshResourceTypes`.';
58+
59+
60+

0 commit comments

Comments
 (0)