client.lua 5.20 KiB
local client = {}
local safer = require("safer")
local requests = require("requests")
local dkjson = require("dkjson")
local copas = require("copas")
requests.http_socket = require("copas.http")
requests.https_socket = require("copas.http")
local function util_sleep(sleeptime)
   local co, ismain = coroutine.running()
   if (not co) or ismain then
      local socket = require("socket")
      socket.sleep(sleeptime)
   else
      copas.sleep(sleeptime)
   end
end
local function debug_response(response)
   print(response.status_code)
   print(response.url)
   for k,v in pairs(response) do
      print(k,v)
   end
   for k,v in pairs(response.headers) do
      print(k,v)
   end
   local j, err = response.json()
   if j then
      for k,v in pairs(j or {}) do
         print(k,v)
      end
   else
      print(err)
   end
end
local function do_request(verb)
   return function(req)
      local ok, response = pcall(requests[verb], req)
      if ok then
         return response
      else
         return nil, response
      end
   end
end
local do_get = do_request("get")
local do_post = do_request("post")
local Client = safer.readonly {
   register = function(self, sga_type, nodes, persisted_jobs)
      assert(type(persisted_jobs) == "table")
      assert(type(persisted_jobs.lost) == "table")
      assert(type(persisted_jobs.retrieved) == "table")
      local sga_name = self.config.sga_name
      for node_name, _ in pairs(nodes) do
         if not node_name:match("^[a-zA-Z0-9_.]+$") then
            return nil, "Invalid node name "..node_name
         end
      end
      local attr = lfs.attributes(self.config.sandbox_root_dir)
      if not (attr and attr.mode == "directory") then