blob: d868a6c8f9ce5d276765e3486c672473b5892697 [file] [log] [blame]
-- name: CountActiveWork :many
-- Return number of active work, grouped by process.
SELECT COUNT(*), work.process
FROM work
GROUP BY (work.process);
-- name: CountActiveBackoffs :many
-- Return number of active backoffs, grouped by process.
SELECT COUNT(*), work_backoff.process
FROM work_backoff
GROUP BY (work_backoff.process);
-- name: CountMachines :one
SELECT COUNT(*)
FROM machines;
-- name: CountMachinesProvided :one
SELECT COUNT(*)
FROM machine_provided;
-- name: CountMachinesAgentHeartbeating :one
SELECT COUNT(*)
FROM machines
INNER JOIN machine_provided ON machines.machine_id = machine_provided.machine_id
INNER JOIN machine_agent_heartbeat ON machines.machine_id = machine_agent_heartbeat.machine_id
WHERE
now() < machine_agent_heartbeat.agent_heartbeat_at + interval '10 minute';
-- name: CountMachinesInstallationPending :one
SELECT COUNT(*)
FROM machines
INNER JOIN machine_provided ON machines.machine_id = machine_provided.machine_id
INNER JOIN machine_os_installation_request ON machines.machine_id = machine_os_installation_request.machine_id
LEFT JOIN machine_os_installation_report ON machines.machine_id = machine_os_installation_report.machine_id
WHERE
machine_os_installation_request.generation IS DISTINCT FROM machine_os_installation_report.generation;
-- name: CountMachinesInstallationComplete :one
SELECT COUNT(*)
FROM machines
INNER JOIN machine_provided ON machines.machine_id = machine_provided.machine_id
INNER JOIN machine_os_installation_request ON machines.machine_id = machine_os_installation_request.machine_id
INNER JOIN machine_os_installation_report ON machines.machine_id = machine_os_installation_report.machine_id
WHERE
machine_os_installation_request.generation IS NOT DISTINCT FROM machine_os_installation_report.generation;
-- name: CountMachinesForAgentStart :one
-- Return number of machines eligible for agent start.
-- ONCHANGE(queries_workflows.sql): constraints must be kept in sync with GetMachinesForAgentStart.
SELECT COUNT(machine_provided)
FROM machines
INNER JOIN machine_provided ON machines.machine_id = machine_provided.machine_id
LEFT JOIN work ON machines.machine_id = work.machine_id AND work.process IN ('ShepherdAccess', 'ShepherdAgentStart', 'ShepherdRecovery')
LEFT JOIN work_backoff ON machines.machine_id = work_backoff.machine_id AND work_backoff.until > now() AND work_backoff.process = 'ShepherdAgentStart'
LEFT JOIN machine_agent_started ON machines.machine_id = machine_agent_started.machine_id
LEFT JOIN machine_os_installation_request ON machines.machine_id = machine_os_installation_request.machine_id
LEFT JOIN machine_os_installation_report ON machines.machine_id = machine_os_installation_report.machine_id
WHERE
work.machine_id IS NULL
AND work_backoff.machine_id IS NULL
AND machine_agent_started.machine_id IS NULL
-- If there is a pending installation request, it must not have been fulfilled already.
AND (
machine_os_installation_request.machine_id IS NULL
OR machine_os_installation_report.generation IS DISTINCT FROM machine_os_installation_request.generation
);
-- name: CountMachinesForAgentRecovery :one
-- Return number of machines eligible for agent recovery.
-- ONCHANGE(queries_workflows.sql): constraints must be kept in sync with GetMachineForAgentRecovery.
SELECT COUNT(machine_provided)
FROM machines
INNER JOIN machine_provided ON machines.machine_id = machine_provided.machine_id
LEFT JOIN work ON machines.machine_id = work.machine_id AND work.process IN ('ShepherdAccess', 'ShepherdAgentStart', 'ShepherdRecovery')
LEFT JOIN work_backoff ON machines.machine_id = work_backoff.machine_id AND work_backoff.until > now() AND work_backoff.process = 'ShepherdRecovery'
INNER JOIN machine_agent_started ON machines.machine_id = machine_agent_started.machine_id
LEFT JOIN machine_agent_heartbeat ON machines.machine_id = machine_agent_heartbeat.machine_id
LEFT JOIN machine_os_installation_request ON machines.machine_id = machine_os_installation_request.machine_id
LEFT JOIN machine_os_installation_report ON machines.machine_id = machine_os_installation_report.machine_id
WHERE
work.machine_id IS NULL
AND work_backoff.machine_id IS NULL
-- Only act on machines where the agent is expected to have been started:
-- 1. If there is a pending installation request, it must not have been fulfilled already.
AND (
machine_os_installation_request.machine_id IS NULL
OR machine_os_installation_report.generation IS DISTINCT FROM machine_os_installation_request.generation
)
-- 2. The agent must have never heartbeat or must have stopped heartbeating.
AND (
-- No heartbeat 30 minutes after starting the agent.
( machine_agent_heartbeat.machine_id IS NULL
AND now() > (machine_agent_started.agent_started_at + interval '30 minutes')
)
-- Heartbeats ceased for 10 minutes.
OR ( machine_agent_heartbeat.machine_id IS NOT NULL
AND now() > (machine_agent_heartbeat.agent_heartbeat_at + interval '10 minutes')
)
);
-- name: ListMachineHardware :many
SELECT
machine_provided.*,
machine_hardware_report.*
FROM machines
INNER JOIN machine_provided ON machines.machine_id = machine_provided.machine_id
INNER JOIN machine_hardware_report ON machines.machine_id = machine_hardware_report.machine_id
WHERE machines.machine_id > $1
ORDER BY machines.machine_id ASC
LIMIT $2;