You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/internal/db/schema/migrations/oss/postgres_82_02_test.go

238 lines
7.5 KiB

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package oss_test
import (
"context"
"database/sql"
"testing"
"github.com/hashicorp/boundary/internal/db"
"github.com/hashicorp/boundary/internal/db/common"
"github.com/hashicorp/boundary/internal/db/schema/migrations/oss"
"github.com/hashicorp/boundary/testing/dbtest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestMigrationHook8202(t *testing.T) {
t.Parallel()
ctx := context.Background()
dialect := dbtest.Postgres
c, u, _, err := dbtest.StartUsingTemplate(dialect, dbtest.WithTemplate(dbtest.Template1))
require.NoError(t, err)
t.Cleanup(func() {
require.NoError(t, c())
})
d, err := common.SqlOpen(dialect, u)
require.NoError(t, err)
// get a connection
dbType, err := db.StringToDbType(dialect)
require.NoError(t, err)
conn, err := db.Open(ctx, dbType, u)
require.NoError(t, err)
rw := db.New(conn)
oss.ApplyMigration(t, ctx, d, 82001) // TODO: this will need to be updated when the migration has been numbered
// Insert test data into the database.
populateMigration82002(t, rw)
// now apply migration 82/002
oss.ApplyMigration(t, ctx, d, 82002) // TODO: this will need to be updated when the migration has been numbered
// session recording sr_________1 should now have target org id o_test__82002
rows, err := rw.Query(ctx, "select target_org_id from recording_session where public_id = @public_id;", []any{sql.Named("public_id", "sr_________1")})
require.NoError(t, err)
count := 0
var targetOrgId *string
for rows.Next() {
require.NoError(t, rows.Scan(&targetOrgId))
count++
}
require.NoError(t, rows.Err())
rows.Close()
require.NoError(t, rows.Err())
assert.Equal(t, 1, count)
assert.Equal(t, "o_test__82002", *targetOrgId)
// session recording sr_________2 should have null target org id
rows, err = rw.Query(ctx, "select target_org_id from recording_session where public_id = @public_id;", []any{sql.Named("public_id", "sr_________2")})
require.NoError(t, err)
defer rows.Close()
count = 0
for rows.Next() {
require.NoError(t, rows.Scan(&targetOrgId))
count++
}
require.NoError(t, rows.Err())
assert.Equal(t, 1, count)
assert.Nil(t, targetOrgId)
}
func populateMigration82002(t *testing.T, rw *db.Db) {
t.Helper()
require := require.New(t)
ctx := context.Background()
var (
err error
query string
)
query = `
insert into iam_scope
(parent_id, type, public_id, name)
values
('global', 'org', 'o_test__82002', 'Testing Session Recording Target Org Ids'),
('global', 'org', 'o_test2_82002', 'Second test org for Session Recording Target Org Ids');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into iam_scope
(parent_id, type, public_id, name)
values
('o_test__82002', 'project', 'p_test__82002', 'testing 82002 Project A'),
('o_test2_82002', 'project', 'p_test2_82002', 'testing 82002 Project B');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into plugin
(scope_id, public_id, name)
values
('global', 'pl__plg___sb', 'Storage Bucket Plugin');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into plugin_storage_supported
(public_id)
values
('pl__plg___sb');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into storage_plugin_storage_bucket
(plugin_id, scope_id, public_id, bucket_name, worker_filter, secrets_hmac)
values
('pl__plg___sb', 'global', 'sb____global', 'Global Storage Bucket', 'test worker filter', '\xdeadbeef');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
// yes, I copied many of these from the colors persona, I am not ashamed
query = `
insert into iam_user
(scope_id, public_id, name)
values
('o_test__82002', 'u______clare', 'Clare'),
('o_test2_82002', 'u______clara', 'Clara');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into kms_root_key
(scope_id, private_id)
values
('o_test__82002', 'krk___colors'),
('o_test2_82002', 'krk__colors2');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into kms_root_key_version
(root_key_id, private_id, key)
values
('krk___colors', 'krkv__colors', '_______color1'::bytea),
('krk__colors2', 'krkv_colors2', '_______color2'::bytea);`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into kms_data_key
(root_key_id, private_id, purpose)
values
('krk___colors', 'kdk___colors', 'database'),
('krk__colors2', 'kdk__colors2', 'database');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into kms_data_key_version
(root_key_version_id, data_key_id, private_id, key)
values
('krkv__colors', 'kdk___colors', 'kdkv__colors', '_______color3'::bytea),
('krkv_colors2', 'kdk__colors2', 'kdkv_colors2', '_______color4'::bytea);`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into auth_password_conf
(password_method_id, private_id)
values
('apm___colors', 'apmc__colors'),
('apm__colors2', 'apmc_colors2');
-- Add password auth method to organizations
insert into auth_password_method
(scope_id, public_id, password_conf_id, name)
values
('o_test__82002', 'apm___colors', 'apmc__colors', 'Colors Auth Password'),
('o_test2_82002', 'apm__colors2', 'apmc_colors2', 'Colors 2 Auth Password');
insert into auth_password_account
(auth_method_id, public_id, login_name)
values
('apm___colors', 'apa____clare', 'clare'),
('apm__colors2', 'apa____clara', 'clara');
update auth_account set iam_user_id = 'u______clare' where public_id = 'apa____clare';
update auth_account set iam_user_id = 'u______clara' where public_id = 'apa____clara';
insert into auth_token
(key_id, auth_account_id, public_id, token)
values
('kdkv__colors', 'apa____clare', 'tok____clare', 'tok____clare'::bytea),
('kdkv_colors2', 'apa____clara', 'tok____clara', 'tok____clara'::bytea);`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
// Add Test Session Recording
query = `
insert into target_ssh
(project_id, public_id, name, enable_session_recording, storage_bucket_id)
values
('p_test__82002', 'tssh_test__82002', 'Test SSH Target', true, 'sb____global'),
('p_test2_82002', 'tssh_test2_82002', 'Test2 SSH Target', true, 'sb____global');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into session
(project_id, target_id, public_id, user_id, auth_token_id, certificate, endpoint)
values
('p_test__82002', 'tssh_test__82002', 's_test__82002', 'u______clare', 'tok____clare', 'abc'::bytea, 'ep1'),
('p_test2_82002', 'tssh_test2_82002', 's_test2_82002', 'u______clara', 'tok____clara', 'abc'::bytea, 'ep1');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
query = `
insert into recording_session
(public_id, storage_bucket_id, session_id)
values
('sr_________1', 'sb____global', 's_test__82002'),
('sr_________2', 'sb____global', 's_test2_82002');`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
// delete the second org so we can confirm missing orgs are still null after migration
query = `
delete from iam_scope where public_id = 'o_test2_82002';`
_, err = rw.Exec(ctx, query, nil)
require.NoError(err)
}