internal/db: add migration for static credential table

The static credential table is used rather than the credential
table as all credentials returned by ListCredentials are static
at this time.
This commit is contained in:
Johan Brandhorst-Satzkorn committed 2024-01-05 07:43:20 -08:00
1 parent a470f4c0c3
commit 497c158b9d
3 files changed
+103

No files matched your search

@@ -97,6 +97,7 @@ begin;
-- insert_credential_static_subtype() is a before insert trigger
-- function for subtypes of credential_static
-- Replaces the insert_credential_static_subtype function defined in 10/03_credential.up.sql
-- Replaced in 79/03_credential_static_base_table_updates.up.sql
create or replace function insert_credential_static_subtype() returns trigger
as $$
begin
@@ -0,0 +1,69 @@
-- Copyright (c) HashiCorp, Inc.
-- SPDX-License-Identifier: BUSL-1.1
begin;
-- Add create_time and update_time to credential_static table.
alter table credential_static add column create_time wt_timestamp;
alter table credential_static add column update_time wt_timestamp;
-- Update rows with current values
update credential_static
set create_time = csj.create_time, update_time = csj.update_time
from credential_static as cs
left join credential_static_json_credential as csj on cs.public_id = csj.public_id;
update credential_static
set create_time = cssshpk.create_time, update_time = cssshpk.update_time
from credential_static as cs
left join credential_static_ssh_private_key_credential as cssshpk on cs.public_id = cssshpk.public_id;
update credential_static
set create_time = csupw.create_time, update_time = csupw.update_time
from credential_static as cs
left join credential_static_username_password_credential as csupw on cs.public_id = csupw.public_id;
-- Replace the insert trigger to also set the create_time
-- Replaces the insert_credential_static_subtype function defined in 46/01_credentials.up.sql
create or replace function insert_credential_static_subtype() returns trigger
as $$
begin
select project_id into new.project_id
from credential_store
where credential_store.public_id = new.store_id;
insert into credential_static
(public_id, store_id, project_id, create_time)
values
(new.public_id, new.store_id, new.project_id, new.create_time);
return new;
end;
$$ language plpgsql;
-- Add trigger to update the new update_time column on every subtype update.
create function update_credential_static_table_update_time() returns trigger
as $$
begin
update credential_static set update_time = now() where public_id = new.public_id;
return new;
end;
$$ language plpgsql;
comment on function update_credential_static_table_update_time() is
'update_credential_static_table_update_time is used to automatically update the update_time '
'of the base table whenever one of the subtype tables are updated';
-- Add triggers to subtype tables
create trigger update_credential_static_table_update_time before update on credential_static_json_credential
for each row execute procedure update_credential_static_table_update_time();
create trigger update_credential_static_table_update_time before update on credential_static_ssh_private_key_credential
for each row execute procedure update_credential_static_table_update_time();
create trigger update_credential_static_table_update_time before update on credential_static_username_password_credential
for each row execute procedure update_credential_static_table_update_time();
-- Add new indexes for the create and update time queries.
create index credential_static_create_time_public_id_idx
on credential_static (create_time desc, public_id asc);
create index credential_static_update_time_public_id_idx
on credential_static (update_time desc, public_id asc);
analyze credential_static;
commit;
@@ -0,0 +1,33 @@
-- Copyright (c) HashiCorp, Inc.
-- SPDX-License-Identifier: BUSL-1.1
begin;
select plan(10);
-- Verify the trigger functions exist and are declared properly
select has_function('update_credential_static_table_update_time');
select volatility_is('update_credential_static_table_update_time', 'volatile');
select isnt_strict('update_credential_static_table_update_time');
select has_trigger('credential_static_json_credential', 'update_credential_static_table_update_time');
select has_trigger('credential_static_ssh_private_key_credential', 'update_credential_static_table_update_time');
select has_trigger('credential_static_username_password_credential', 'update_credential_static_table_update_time');
select has_index('credential_static', 'credential_static_create_time_public_id_idx', array['create_time', 'public_id']);
select has_index('credential_static', 'credential_static_update_time_public_id_idx', array['update_time', 'public_id']);
-- To test that the trigger that sets the create_time of the base table
-- when an insert into a subtype table happens works, we check that the
-- create time of the entries in both tables match
prepare credential_static_create_time as select create_time from credential_static where public_id='csj__bcolors';
prepare credential_static_json_credential_create_time as select create_time from credential_static_json_credential where public_id='csj__bcolors';
select results_eq('credential_static_create_time','credential_static_json_credential_create_time');
-- To test the trigger that updates the update_time of the base table,
-- we update one of the existing creds and check that the base table
-- entry has the same update_time as the subtype one.
update credential_static_json_credential set name='Blue black json cred' where public_id='csj__bcolors';
prepare credential_static_update_time as select update_time from credential_static where public_id='csj__bcolors';
prepare credential_static_json_credential_update_time as select update_time from credential_static_json_credential where public_id='csj__bcolors';
select results_eq('credential_static_update_time','credential_static_json_credential_update_time');
select * from finish();
rollback;