235 lines
7.4 KiB
Go
235 lines
7.4 KiB
Go
// 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++
|
|
}
|
|
rows.Close()
|
|
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++
|
|
}
|
|
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)
|
|
}
|