local M = {}
function M.client(url, opts)
opts = opts or {}
local base_url = (url or env.get("NEUTRON_URL") or ""):gsub("/+$", "")
if base_url == "" then
error("neutron: no url — pass one or set NEUTRON_URL")
end
local token = opts.token or env.get("NEUTRON_TOKEN")
if not token then
error("neutron: no token — pass opts.token or set NEUTRON_TOKEN")
end
local cf_id = opts.cf_client_id or env.get("CF_ACCESS_CLIENT_ID")
local cf_secret = opts.cf_client_secret or env.get("CF_ACCESS_CLIENT_SECRET")
local function headers()
local h = {
Authorization = "Bearer " .. token,
["Content-Type"] = "application/json",
}
if cf_id and cf_secret then
h["CF-Access-Client-Id"] = cf_id
h["CF-Access-Client-Secret"] = cf_secret
end
return h
end
local function request(method, path_str, payload)
local url_full = base_url .. path_str
local resp
if method == "GET" then
resp = http.get(url_full, { headers = headers() })
elseif method == "POST" then
resp = http.post(url_full, payload or {}, { headers = headers() })
elseif method == "PUT" then
resp = http.put(url_full, payload or {}, { headers = headers() })
elseif method == "DELETE" then
resp = http.delete(url_full, { headers = headers() })
end
if resp.status >= 400 then
error("neutron: " .. method .. " " .. path_str .. " HTTP " .. resp.status .. ": " .. resp.body)
end
if resp.body == nil or resp.body == "" then return true end
return json.parse(resp.body)
end
local c = {}
c.agents = {}
function c.agents:list()
return request("GET", "/api/admin/agents")
end
function c.agents:create(display_name, config)
local body = config or {}
body.display_name = display_name
return request("POST", "/api/admin/agents", body)
end
function c.agents:update(id, config)
return request("PUT", "/api/admin/agents/" .. id, config)
end
function c.agents:delete(id)
return request("DELETE", "/api/admin/agents/" .. id)
end
function c.agents:core()
return request("GET", "/api/admin/settings/agent")
end
function c.agents:update_core(config)
return request("PUT", "/api/admin/settings/agent", config)
end
c.secrets = {}
function c.secrets:list()
return request("GET", "/api/admin/secrets").secrets
end
function c.secrets:set(name, opts_)
return request("PUT", "/api/admin/secrets/" .. name, opts_ or {}).secrets
end
function c.secrets:value(name)
return request("GET", "/api/admin/secrets/" .. name .. "/value").value
end
function c.secrets:delete(name)
return request("DELETE", "/api/admin/secrets/" .. name).secrets
end
c.connections = {}
function c.connections:list()
return request("GET", "/api/admin/connections").connections
end
function c.connections:set(name, opts_)
return request("PUT", "/api/admin/connections/" .. name, opts_).connections
end
function c.connections:delete(name)
return request("DELETE", "/api/admin/connections/" .. name).connections
end
c.resources = {}
function c.resources:list()
return request("GET", "/api/admin/resources").resources
end
function c.resources:create(body)
return request("POST", "/api/admin/resources", body)
end
function c.resources:update(id, body)
return request("PUT", "/api/admin/resources/" .. id, body)
end
function c.resources:delete(id)
return request("DELETE", "/api/admin/resources/" .. id)
end
c.roles = {}
function c.roles:list()
return request("GET", "/api/admin/roles").roles
end
function c.roles:create(name)
return request("POST", "/api/admin/roles", { name = name })
end
function c.roles:member(id, email, action)
return request("PUT", "/api/admin/roles/" .. id .. "/members", { email = email, action = action })
end
function c.roles:delete(id)
return request("DELETE", "/api/admin/roles/" .. id)
end
c.tokens = {}
function c.tokens:list()
return request("GET", "/api/admin/tokens").tokens
end
function c.tokens:mint(name)
return request("POST", "/api/admin/tokens", { name = name })
end
function c.tokens:revoke(name)
return request("DELETE", "/api/admin/tokens/" .. name).tokens
end
c.settings = {}
function c.settings:get()
return request("GET", "/api/settings")
end
function c.settings:update(body)
return request("PUT", "/api/admin/settings", body)
end
c.channels = {}
function c.channels:get()
return request("GET", "/api/admin/settings/channels").channels
end
function c.channels:update(body)
return request("PUT", "/api/admin/settings/channels", body).channels
end
c.users = {}
function c.users:list()
return request("GET", "/api/admin/users").users
end
c.usage = {}
function c.usage:get(opts_)
local q = {}
if opts_ and opts_.from then q[#q + 1] = "from=" .. opts_.from end
if opts_ and opts_.to then q[#q + 1] = "to=" .. opts_.to end
local suffix = #q > 0 and ("?" .. table.concat(q, "&")) or ""
return request("GET", "/api/admin/usage" .. suffix)
end
function c.assay_catalog()
return request("GET", "/api/admin/assay/catalog").modules
end
return c
end
return M