|
| 1 | +-- Update task status in view. |
| 2 | +DROPVIEW IF EXISTS tasks_with_status; |
| 3 | + |
| 4 | +CREATE VIEW |
| 5 | +tasks_with_status |
| 6 | +AS |
| 7 | +SELECT |
| 8 | +tasks.*, |
| 9 | +CASE |
| 10 | +WHENtasks.workspace_id ISNULLORlatest_build.job_status ISNULL THEN'pending'::task_status |
| 11 | + |
| 12 | +WHENlatest_build.job_status='failed' THEN'error'::task_status |
| 13 | + |
| 14 | +WHENlatest_build.job_statusIN ('canceling','canceled') THEN'error'::task_status |
| 15 | + |
| 16 | +WHENlatest_build.transitionIN ('stop','delete') |
| 17 | +ANDlatest_build.job_status='succeeded' THEN'paused'::task_status |
| 18 | + |
| 19 | +WHENlatest_build.transition='start' |
| 20 | +ANDlatest_build.job_status='pending' THEN'initializing'::task_status |
| 21 | + |
| 22 | +WHENlatest_build.transition='start'ANDlatest_build.job_statusIN ('running','succeeded') THEN |
| 23 | +CASE |
| 24 | +WHENagent_status.noneORagent_status.connecting THEN'initializing'::task_status |
| 25 | +-- If the agent is shut down, but the workspace isn't |
| 26 | +-- stopped, show as error. |
| 27 | +WHENagent_status.shutdown THEN'error'::task_status |
| 28 | +-- Start failed also means connected, but we don't |
| 29 | +-- necessarily want to surface an error. |
| 30 | +WHENagent_status.connectedORagent_status.connected_start_failed THEN |
| 31 | +CASE |
| 32 | +WHENapp_status.unhealthy THEN'error'::task_status |
| 33 | +WHENapp_status.initializing THEN'initializing'::task_status |
| 34 | +WHENapp_status.healthy_or_disabled THEN'active'::task_status |
| 35 | +-- Fall back to surfacing error in case the app isn't healthy. |
| 36 | +WHENagent_status.connected_start_failed THEN'error'::task_status |
| 37 | +ELSE'unknown'::task_status |
| 38 | +END |
| 39 | +ELSE'unknown'::task_status |
| 40 | +END |
| 41 | +ELSE'unknown'::task_status |
| 42 | +ENDAS status, |
| 43 | +task_app.*, |
| 44 | +task_owner.* |
| 45 | +FROM |
| 46 | +tasks |
| 47 | +CROSS JOIN LATERAL ( |
| 48 | +SELECT |
| 49 | +vu.usernameAS owner_username, |
| 50 | +vu.nameAS owner_name, |
| 51 | +vu.avatar_urlAS owner_avatar_url |
| 52 | +FROM visible_users vu |
| 53 | +WHEREvu.id=tasks.owner_id |
| 54 | +) task_owner |
| 55 | +LEFT JOIN LATERAL ( |
| 56 | +SELECT workspace_build_number, workspace_agent_id, workspace_app_id |
| 57 | +FROM task_workspace_apps task_app |
| 58 | +WHERE task_id=tasks.id |
| 59 | +ORDER BY workspace_build_numberDESC |
| 60 | +LIMIT1 |
| 61 | +) task_appON TRUE |
| 62 | +LEFT JOIN LATERAL ( |
| 63 | +SELECT |
| 64 | +workspace_build.transition, |
| 65 | +provisioner_job.job_status, |
| 66 | +workspace_build.job_id |
| 67 | +FROM workspace_builds workspace_build |
| 68 | +JOIN provisioner_jobs provisioner_jobONprovisioner_job.id=workspace_build.job_id |
| 69 | +WHEREworkspace_build.workspace_id=tasks.workspace_id |
| 70 | +ANDworkspace_build.build_number=task_app.workspace_build_number |
| 71 | +) latest_buildON TRUE |
| 72 | +LEFT JOIN LATERAL ( |
| 73 | +SELECT |
| 74 | +workspace_agent.id ISNULLAS none, |
| 75 | +-- This is essentially `IN ('shutting_down', 'shutdown_timeout', 'shutdown_error', 'off')`, |
| 76 | +-- but we cannot use it because the values were added in a migration. |
| 77 | +COALESCE(workspace_agent.lifecycle_state NOTIN ('created','starting','start_timeout','start_error','ready'), false)AS shutdown, |
| 78 | +COALESCE(workspace_agent.lifecycle_stateIN ('created','starting'), false)AS connecting, |
| 79 | +COALESCE(workspace_agent.lifecycle_stateIN ('start_timeout','start_error'), false)AS connected_start_failed, |
| 80 | +COALESCE(workspace_agent.lifecycle_state='ready', false)AS connected |
| 81 | +FROM workspace_agents workspace_agent |
| 82 | +WHEREworkspace_agent.id=task_app.workspace_agent_id |
| 83 | +) agent_statusON TRUE |
| 84 | +LEFT JOIN LATERAL ( |
| 85 | +SELECT |
| 86 | +COALESCE(workspace_app.health='unhealthy', false)AS unhealthy, |
| 87 | +COALESCE(workspace_app.health='initializing', false)AS initializing, |
| 88 | +COALESCE(workspace_app.healthIN ('healthy','disabled'), false)AS healthy_or_disabled |
| 89 | +FROM workspace_apps workspace_app |
| 90 | +WHEREworkspace_app.id=task_app.workspace_app_id |
| 91 | +) app_statusON TRUE |
| 92 | +WHERE |
| 93 | +tasks.deleted_at ISNULL; |