Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions base/database/testing.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package database

import (
"app/base"
"app/base/inventory"
"app/base/models"
"app/base/utils"
"fmt"
Expand All @@ -13,6 +14,17 @@ import (
"github.com/stretchr/testify/assert"
)

const (
TestWorkspace1ID = "aaaaaaaa-0000-0000-0000-000000000001"
TestWorkspace2ID = "aaaaaaaa-0000-0000-0000-000000000002"
TestWorkspaceOtherID = "bbbbbbbb-0000-0000-0000-000000000003"
)

func TestWorkspacesGroup1() *inventory.Groups {
g := inventory.Groups{{ID: TestWorkspace1ID, Name: "group1"}}
return &g
}

func DebugWithCachesCheck(part string, fun func()) {
fun()
validAfter, err := CheckCachesValidRet()
Expand Down
8 changes: 4 additions & 4 deletions base/database/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ var (
)

var testCases = []map[int64]map[string]string{
{nGroup1: {utils.KeyGrouped: `{"[{\"id\":\"inventory-group-1\"}]"}`}},
{nGroup2: {utils.KeyGrouped: `{"[{\"id\":\"inventory-group-2\"}]"}`}},
{nGroup1 + nGroup2: {utils.KeyGrouped: `{"[{\"id\":\"inventory-group-1\"}]","[{\"id\":\"inventory-group-2\"}]"}`}},
{nGroup1: {utils.KeyGrouped: `{"[{\"id\":\"aaaaaaaa-0000-0000-0000-000000000001\"}]"}`}},
{nGroup2: {utils.KeyGrouped: `{"[{\"id\":\"aaaaaaaa-0000-0000-0000-000000000002\"}]"}`}},
{nGroup1 + nGroup2: {utils.KeyGrouped: `{"[{\"id\":\"aaaaaaaa-0000-0000-0000-000000000001\"}]","[{\"id\":\"aaaaaaaa-0000-0000-0000-000000000002\"}]"}`}}, //nolint:lll
{nGroup1 + nUngrouped: {
utils.KeyGrouped: `{"[{\"id\":\"inventory-group-1\"}]"}`,
utils.KeyGrouped: `{"[{\"id\":\"aaaaaaaa-0000-0000-0000-000000000001\"}]"}`,
utils.KeyUngrouped: "[]",
}},
{nUngrouped: {
Expand Down
10 changes: 10 additions & 0 deletions database_admin/migrations/156_simplify_workspaces.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
SELECT drop_table_partition_triggers('system_inventory_sync_workspace',
$$BEFORE INSERT OR UPDATE OF workspaces$$,
'system_inventory',
$$FOR EACH ROW EXECUTE PROCEDURE sync_system_inventory_workspace()$$);

DROP FUNCTION IF EXISTS sync_system_inventory_workspace();

ALTER TABLE system_inventory
DROP COLUMN IF EXISTS workspace_id,
DROP COLUMN IF EXISTS workspace_name;
28 changes: 28 additions & 0 deletions database_admin/migrations/156_simplify_workspaces.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
ALTER TABLE system_inventory
ADD COLUMN IF NOT EXISTS workspace_id UUID,
ADD COLUMN IF NOT EXISTS workspace_name TEXT CHECK (NOT empty(workspace_name));

CREATE OR REPLACE FUNCTION sync_system_inventory_workspace()
RETURNS TRIGGER AS
$$
BEGIN
IF NEW.workspaces IS NOT NULL
AND jsonb_typeof(NEW.workspaces) = 'array'
AND jsonb_array_length(NEW.workspaces) > 0
THEN
NEW.workspace_id := (NEW.workspaces->0->>'id')::UUID;
NEW.workspace_name := NEW.workspaces->0->>'name';
IF NEW.workspace_name IS NULL OR empty(NEW.workspace_name) THEN
RAISE EXCEPTION 'workspace_name must not be empty';
END IF;
ELSIF TG_OP = 'INSERT' THEN
RAISE EXCEPTION 'workspaces required';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

SELECT create_table_partition_triggers('system_inventory_sync_workspace',
$$BEFORE INSERT OR UPDATE OF workspaces$$,
'system_inventory',
$$FOR EACH ROW EXECUTE PROCEDURE sync_system_inventory_workspace()$$);
28 changes: 27 additions & 1 deletion database_admin/schema/create_schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS schema_migrations


INSERT INTO schema_migrations
VALUES (155, false);
VALUES (156, false);

-- ---------------------------------------------------------------------------
-- Functions
Expand Down Expand Up @@ -65,6 +65,25 @@ END;
$check_unchanged$
LANGUAGE 'plpgsql';

CREATE OR REPLACE FUNCTION sync_system_inventory_workspace()
RETURNS TRIGGER AS
$$
BEGIN
IF NEW.workspaces IS NOT NULL
AND jsonb_typeof(NEW.workspaces) = 'array'
AND jsonb_array_length(NEW.workspaces) > 0
THEN
NEW.workspace_id := (NEW.workspaces->0->>'id')::UUID;
NEW.workspace_name := NEW.workspaces->0->>'name';
IF NEW.workspace_name IS NULL OR empty(NEW.workspace_name) THEN
RAISE EXCEPTION 'workspace_name must not be empty';
END IF;
ELSIF TG_OP = 'INSERT' THEN
RAISE EXCEPTION 'workspaces required';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION on_system_update()
-- this trigger updates advisory_account_data when server changes its stale flag
Expand Down Expand Up @@ -593,6 +612,8 @@ CREATE TABLE IF NOT EXISTS system_inventory
mssql_workload BOOLEAN NOT NULL DEFAULT false,
mssql_workload_version TEXT CHECK (NOT empty(mssql_workload_version)),
workspaces JSONB,
workspace_id UUID,
workspace_name TEXT CHECK (NOT empty(workspace_name)),
PRIMARY KEY (rh_account_id, id),
UNIQUE (rh_account_id, inventory_id)
) PARTITION BY HASH (rh_account_id);
Expand Down Expand Up @@ -621,6 +642,11 @@ SELECT create_table_partition_triggers('system_inventory_on_update',
'system_inventory',
$$FOR EACH ROW EXECUTE PROCEDURE on_system_update()$$);

SELECT create_table_partition_triggers('system_inventory_sync_workspace',
$$BEFORE INSERT OR UPDATE OF workspaces$$,
'system_inventory',
$$FOR EACH ROW EXECUTE PROCEDURE sync_system_inventory_workspace()$$);

CREATE INDEX IF NOT EXISTS system_inventory_inventory_id_idx ON system_inventory (inventory_id);
CREATE INDEX IF NOT EXISTS system_inventory_tags_index ON system_inventory USING GIN (tags JSONB_PATH_OPS);
CREATE INDEX IF NOT EXISTS system_inventory_stale_timestamp_index ON system_inventory (stale_timestamp);
Expand Down
Loading
Loading