Revision 16a8967d

b/daemons/ganeti-rapi
32 32
from ganeti import constants
33 33
from ganeti import errors
34 34
from ganeti import http
35
from ganeti import daemon
35 36
from ganeti import ssconf
36 37
from ganeti import utils
37 38
from ganeti.rapi import connector
38 39

  
39 40

  
40
class RESTRequestHandler(http.HTTPRequestHandler):
41
class RemoteApiHttpServer(http.HttpServer):
41 42
  """REST Request Handler Class.
42 43

  
43 44
  """
44
  def setup(self):
45
    super(RESTRequestHandler, self).setup()
45
  def __init__(self, *args, **kwargs):
46
    http.HttpServer.__init__(self, *args, **kwargs)
46 47
    self._resmap = connector.Mapper()
47 48

  
48
  def HandleRequest(self):
49
    """ Handels a request.
49
  def HandleRequest(self, req):
50
    """Handles a request.
50 51

  
51 52
    """
52
    (HandlerClass, items, args) = self._resmap.getController(self.path)
53
    handler = HandlerClass(self, items, args, self.post_data)
53
    (HandlerClass, items, args) = self._resmap.getController(req.request_path)
54
    handler = HandlerClass(items, args, req.request_post_data)
54 55

  
55
    command = self.command.upper()
56
    method = req.request_method.upper()
56 57
    try:
57
      fn = getattr(handler, command)
58
      fn = getattr(handler, method)
58 59
    except AttributeError, err:
59 60
      raise http.HTTPBadRequest()
60 61

  
61 62
    try:
62
      try:
63
        result = fn()
64
      except:
65
        logging.exception("Error while handling the %s request", command)
66
        raise
67

  
68
    except errors.OpPrereqError, err:
69
      # TODO: "Not found" is not always the correct error. Ganeti's core must
70
      # differentiate between different error types.
71
      raise http.HTTPNotFound(message=str(err))
63
      result = fn()
64
    except:
65
      logging.exception("Error while handling the %s request", method)
66
      raise
72 67

  
73 68
    return result
74 69

  
75 70

  
76
class RESTHttpServer(http.HTTPServer):
77
  def serve_forever(self):
78
    """Handle one request at a time until told to quit."""
79
    sighandler = utils.SignalHandler([signal.SIGINT, signal.SIGTERM])
80
    try:
81
      while not sighandler.called:
82
        self.handle_request()
83
    finally:
84
      sighandler.Reset()
85

  
86

  
87 71
def ParseOptions():
88 72
  """Parse the command line options.
89 73

  
......
144 128
                     stderr_logging=not options.fork)
145 129

  
146 130
  utils.WritePidFile(constants.RAPI_PID)
147

  
148
  log_fd = open(constants.LOG_RAPIACCESS, 'a')
149 131
  try:
150
    apache_log = http.ApacheLogfile(log_fd)
151
    httpd = RESTHttpServer(("", options.port), RESTRequestHandler,
152
                           httplog=apache_log)
132
    mainloop = daemon.Mainloop()
133
    server = RemoteApiHttpServer(mainloop, ("", options.port))
134
    server.Start()
153 135
    try:
154
      httpd.serve_forever()
136
      mainloop.Run()
155 137
    finally:
156
      httpd.server_close()
157
      utils.RemovePidFile(constants.RAPI_PID)
158

  
138
      server.Stop()
159 139
  finally:
160
    log_fd.close()
161

  
162
  sys.exit(0)
140
    utils.RemovePidFile(constants.RAPI_PID)
163 141

  
164 142

  
165 143
if __name__ == '__main__':
b/lib/constants.py
127 127
LOG_WATCHER = LOG_DIR + "watcher.log"
128 128
LOG_MASTERDAEMON = LOG_DIR + "master-daemon.log"
129 129
LOG_RAPISERVER = LOG_DIR + "rapi-daemon.log"
130
LOG_RAPIACCESS = LOG_DIR + "rapi-access.log"
131 130
LOG_COMMANDS = LOG_DIR + "commands.log"
132 131
LOG_BURNIN = LOG_DIR + "burnin.log"
133 132

  
b/lib/rapi/baserlib.py
126 126
  """Generic class for resources.
127 127

  
128 128
  """
129
  def __init__(self, request, items, queryargs, post_data):
129
  def __init__(self, items, queryargs, post_data):
130 130
    """Generic resource constructor.
131 131

  
132 132
    Args:
133
      request: HTTPRequestHandler object
134 133
      items: a list with variables encoded in the URL
135 134
      queryargs: a dictionary with additional options from URL
136 135

  
137 136
    """
138
    self.request = request
139 137
    self.items = items
140 138
    self.queryargs = queryargs
141 139
    self.post_data = post_data

Also available in: Unified diff