local M = {}
function M.client(url)
local base_url = url:gsub("/+$", "")
local function api_get(path_str)
local resp = http.get(base_url .. path_str, { headers = {} })
if resp.status ~= 200 then
error("traefik: GET " .. path_str .. " HTTP " .. resp.status .. ": " .. resp.body)
end
return json.parse(resp.body)
end
local c = {}
c.info = {}
function c.info:overview()
return api_get("/api/overview")
end
function c.info:version()
return api_get("/api/version")
end
function c.info:rawdata()
return api_get("/api/rawdata")
end
c.entrypoints = {}
function c.entrypoints:list()
return api_get("/api/entrypoints")
end
function c.entrypoints:get(name)
return api_get("/api/entrypoints/" .. name)
end
c.routers = {}
function c.routers:list()
return api_get("/api/http/routers")
end
function c.routers:get(name)
return api_get("/api/http/routers/" .. name)
end
function c.routers:is_enabled(name)
local router = c.routers:get(name)
return router.status == "enabled"
end
function c.routers:has_tls(name)
local router = c.routers:get(name)
return router.tls ~= nil
end
function c.routers:healthy()
local routers = c.routers:list()
local enabled = 0
local errored = 0
for _, router in ipairs(routers) do
if router.status == "enabled" then
enabled = enabled + 1
else
errored = errored + 1
end
end
return enabled, errored
end
c.services = {}
function c.services:list()
return api_get("/api/http/services")
end
function c.services:get(name)
return api_get("/api/http/services/" .. name)
end
function c.services:server_count(name)
local service = c.services:get(name)
if not service.loadBalancer or not service.loadBalancer.servers then
return 0
end
return #service.loadBalancer.servers
end
c.middlewares = {}
function c.middlewares:list()
return api_get("/api/http/middlewares")
end
function c.middlewares:get(name)
return api_get("/api/http/middlewares/" .. name)
end
c.tcp = {}
function c.tcp:routers()
return api_get("/api/tcp/routers")
end
function c.tcp:services()
return api_get("/api/tcp/services")
end
return c
end
return M