|
| 1 | +-- Fixture for app_custom_path_cross_workspace regression test. |
| 2 | +-- Two workspaces sharing the same admin user, so the same logical app |
| 3 | +-- (same `path`) can be deployed to both — exercising the instance-global |
| 4 | +-- custom_path uniqueness behavior (CLOUD_HOSTED unset and |
| 5 | +-- app_workspaced_route off, the default for dedicated instances). |
| 6 | + |
| 7 | +INSERT INTO workspace |
| 8 | + (id, name, owner) |
| 9 | + VALUES ('test-workspace', 'test-workspace', 'test-user'); |
| 10 | + |
| 11 | +INSERT INTO usr(workspace_id, email, username, is_admin, role) VALUES |
| 12 | + ('test-workspace', 'test@windmill.dev', 'test-user', true, 'Admin'); |
| 13 | + |
| 14 | +INSERT INTO workspace_key(workspace_id, kind, key) VALUES |
| 15 | + ('test-workspace', 'cloud', 'test-key'); |
| 16 | + |
| 17 | +INSERT INTO workspace_settings (workspace_id) VALUES |
| 18 | + ('test-workspace'); |
| 19 | + |
| 20 | +INSERT INTO group_ (workspace_id, name, summary, extra_perms) VALUES |
| 21 | + ('test-workspace', 'all', 'All users', '{}'); |
| 22 | + |
| 23 | +INSERT INTO password(email, password_hash, login_type, super_admin, verified, name, username) |
| 24 | + VALUES ('test@windmill.dev', 'not-a-real-hash', 'password', true, true, 'Test User', 'test-user'); |
| 25 | + |
| 26 | +-- Second workspace, same admin user. Lets us deploy the same app path to |
| 27 | +-- two workspaces, which is what triggered the custom_path conflict. |
| 28 | +INSERT INTO workspace (id, name, owner) VALUES |
| 29 | + ('test-workspace-2', 'test-workspace-2', 'test-user'); |
| 30 | + |
| 31 | +INSERT INTO usr(workspace_id, email, username, is_admin, role) VALUES |
| 32 | + ('test-workspace-2', 'test@windmill.dev', 'test-user', true, 'Admin'); |
| 33 | + |
| 34 | +INSERT INTO workspace_key(workspace_id, kind, key) VALUES |
| 35 | + ('test-workspace-2', 'cloud', 'test-key-2'); |
| 36 | + |
| 37 | +INSERT INTO workspace_settings (workspace_id) VALUES |
| 38 | + ('test-workspace-2'); |
| 39 | + |
| 40 | +INSERT INTO group_ (workspace_id, name, summary, extra_perms) VALUES |
| 41 | + ('test-workspace-2', 'all', 'All users', '{}'); |
| 42 | + |
| 43 | +-- super_admin token so custom_path edits pass require_admin in both workspaces. |
| 44 | +INSERT INTO token(token_hash, token_prefix, token, email, label, super_admin) |
| 45 | +VALUES (encode(sha256('SECRET_TOKEN'::bytea), 'hex'), 'SECRET_TOK', 'SECRET_TOKEN', 'test@windmill.dev', 'test token', true); |
| 46 | + |
| 47 | +GRANT ALL PRIVILEGES ON TABLE workspace_key TO windmill_admin; |
| 48 | +GRANT ALL PRIVILEGES ON TABLE workspace_key TO windmill_user; |
| 49 | + |
| 50 | +CREATE FUNCTION "notify_insert_on_completed_job" () |
| 51 | +RETURNS TRIGGER AS $$ |
| 52 | +BEGIN |
| 53 | + PERFORM pg_notify('completed', NEW.id::text); |
| 54 | + RETURN NEW; |
| 55 | +END; |
| 56 | +$$ LANGUAGE PLPGSQL; |
| 57 | + |
| 58 | + CREATE TRIGGER "notify_insert_on_completed_job" |
| 59 | + AFTER INSERT ON "v2_job_completed" |
| 60 | + FOR EACH ROW |
| 61 | +EXECUTE FUNCTION "notify_insert_on_completed_job" (); |
| 62 | + |
| 63 | + |
| 64 | +CREATE FUNCTION "notify_queue" () |
| 65 | +RETURNS TRIGGER AS $$ |
| 66 | +BEGIN |
| 67 | + PERFORM pg_notify('queued', NEW.id::text); |
| 68 | + RETURN NEW; |
| 69 | +END; |
| 70 | +$$ LANGUAGE PLPGSQL; |
| 71 | + |
| 72 | + CREATE TRIGGER "notify_queue_after_insert" |
| 73 | + AFTER INSERT ON "v2_job_queue" |
| 74 | + FOR EACH ROW |
| 75 | +EXECUTE FUNCTION "notify_queue" (); |
| 76 | + |
| 77 | + CREATE TRIGGER "notify_queue_after_flow_status_update" |
| 78 | + AFTER UPDATE ON "v2_job_status" |
| 79 | + FOR EACH ROW |
| 80 | + WHEN (NEW.flow_status IS DISTINCT FROM OLD.flow_status) |
| 81 | +EXECUTE FUNCTION "notify_queue" (); |
| 82 | + |
| 83 | +-- Apply phase 4: |
| 84 | +DROP FUNCTION IF EXISTS v2_job_after_update CASCADE; |
| 85 | +DROP FUNCTION IF EXISTS v2_job_completed_before_insert CASCADE; |
| 86 | +DROP FUNCTION IF EXISTS v2_job_completed_before_update CASCADE; |
| 87 | +DROP FUNCTION IF EXISTS v2_job_queue_after_insert CASCADE; |
| 88 | +DROP FUNCTION IF EXISTS v2_job_queue_before_insert CASCADE; |
| 89 | +DROP FUNCTION IF EXISTS v2_job_queue_before_update CASCADE; |
| 90 | +DROP FUNCTION IF EXISTS v2_job_runtime_before_insert CASCADE; |
| 91 | +DROP FUNCTION IF EXISTS v2_job_runtime_before_update CASCADE; |
| 92 | +DROP FUNCTION IF EXISTS v2_job_status_before_insert CASCADE; |
| 93 | +DROP FUNCTION IF EXISTS v2_job_status_before_update CASCADE; |
| 94 | + |
| 95 | +DROP VIEW IF EXISTS completed_job, completed_job_view, job, queue, queue_view CASCADE; |
| 96 | + |
| 97 | +ALTER TABLE v2_job_queue |
| 98 | + DROP COLUMN IF EXISTS __parent_job CASCADE, |
| 99 | + DROP COLUMN IF EXISTS __created_by CASCADE, |
| 100 | + DROP COLUMN IF EXISTS __script_hash CASCADE, |
| 101 | + DROP COLUMN IF EXISTS __script_path CASCADE, |
| 102 | + DROP COLUMN IF EXISTS __args CASCADE, |
| 103 | + DROP COLUMN IF EXISTS __logs CASCADE, |
| 104 | + DROP COLUMN IF EXISTS __raw_code CASCADE, |
| 105 | + DROP COLUMN IF EXISTS __canceled CASCADE, |
| 106 | + DROP COLUMN IF EXISTS __last_ping CASCADE, |
| 107 | + DROP COLUMN IF EXISTS __job_kind CASCADE, |
| 108 | + DROP COLUMN IF EXISTS __env_id CASCADE, |
| 109 | + DROP COLUMN IF EXISTS __schedule_path CASCADE, |
| 110 | + DROP COLUMN IF EXISTS __permissioned_as CASCADE, |
| 111 | + DROP COLUMN IF EXISTS __flow_status CASCADE, |
| 112 | + DROP COLUMN IF EXISTS __raw_flow CASCADE, |
| 113 | + DROP COLUMN IF EXISTS __is_flow_step CASCADE, |
| 114 | + DROP COLUMN IF EXISTS __language CASCADE, |
| 115 | + DROP COLUMN IF EXISTS __same_worker CASCADE, |
| 116 | + DROP COLUMN IF EXISTS __raw_lock CASCADE, |
| 117 | + DROP COLUMN IF EXISTS __pre_run_error CASCADE, |
| 118 | + DROP COLUMN IF EXISTS __email CASCADE, |
| 119 | + DROP COLUMN IF EXISTS __visible_to_owner CASCADE, |
| 120 | + DROP COLUMN IF EXISTS __mem_peak CASCADE, |
| 121 | + DROP COLUMN IF EXISTS __root_job CASCADE, |
| 122 | + DROP COLUMN IF EXISTS __leaf_jobs CASCADE, |
| 123 | + DROP COLUMN IF EXISTS __concurrent_limit CASCADE, |
| 124 | + DROP COLUMN IF EXISTS __concurrency_time_window_s CASCADE, |
| 125 | + DROP COLUMN IF EXISTS __timeout CASCADE, |
| 126 | + DROP COLUMN IF EXISTS __flow_step_id CASCADE, |
| 127 | + DROP COLUMN IF EXISTS __cache_ttl CASCADE; |
| 128 | + |
| 129 | +LOCK TABLE v2_job_queue IN ACCESS EXCLUSIVE MODE; |
| 130 | +ALTER TABLE v2_job_completed |
| 131 | + DROP COLUMN IF EXISTS __parent_job CASCADE, |
| 132 | + DROP COLUMN IF EXISTS __created_by CASCADE, |
| 133 | + DROP COLUMN IF EXISTS __created_at CASCADE, |
| 134 | + DROP COLUMN IF EXISTS __success CASCADE, |
| 135 | + DROP COLUMN IF EXISTS __script_hash CASCADE, |
| 136 | + DROP COLUMN IF EXISTS __script_path CASCADE, |
| 137 | + DROP COLUMN IF EXISTS __args CASCADE, |
| 138 | + DROP COLUMN IF EXISTS __logs CASCADE, |
| 139 | + DROP COLUMN IF EXISTS __raw_code CASCADE, |
| 140 | + DROP COLUMN IF EXISTS __canceled CASCADE, |
| 141 | + DROP COLUMN IF EXISTS __job_kind CASCADE, |
| 142 | + DROP COLUMN IF EXISTS __env_id CASCADE, |
| 143 | + DROP COLUMN IF EXISTS __schedule_path CASCADE, |
| 144 | + DROP COLUMN IF EXISTS __permissioned_as CASCADE, |
| 145 | + DROP COLUMN IF EXISTS __raw_flow CASCADE, |
| 146 | + DROP COLUMN IF EXISTS __is_flow_step CASCADE, |
| 147 | + DROP COLUMN IF EXISTS __language CASCADE, |
| 148 | + DROP COLUMN IF EXISTS __is_skipped CASCADE, |
| 149 | + DROP COLUMN IF EXISTS __raw_lock CASCADE, |
| 150 | + DROP COLUMN IF EXISTS __email CASCADE, |
| 151 | + DROP COLUMN IF EXISTS __visible_to_owner CASCADE, |
| 152 | + DROP COLUMN IF EXISTS __tag CASCADE, |
| 153 | + DROP COLUMN IF EXISTS __priority CASCADE; |
0 commit comments